汇编_mov指令

【本节目标】

  1. 明确汇编的定义
  2. 记住有哪些寄存器(名称),以及其对应的编号(0~7),多少位(32 16 8)
  3. 学会使用mov指令
  4. 掌握书写汇编的基本格式

1. 什么是汇编

汇编就是寄存器与寄存器,寄存器与内存,内存与寄存器之间来回移动数据(不能同时操作内存,特殊指令除外,编译器不支持)

2. 寄存器

寄存器是放内存数据的

2.1 32位的寄存器:

1111 1111 1111 1111 1111 1111 1111 1111(f f f f f f f f)

寄存器 类型 用途
EAX(0) 累加寄存器(A->add) 用于算术运算、逻辑操作和函数返回值。
ECX(1) 计数寄存器(C->count) 常用于循环和字符串操作的计数。
EDX(2) 数据寄存器(D->data) 常用于I/O操作和与EAX配合进行乘除法运算(存放高位结果)
EBX(3) 基址寄存器(B->base) 常用于指向数据段中的基地址。
ESP(4) 对堆栈操作的寄存器 esp是栈顶(stack) 指向当前栈帧的顶部。随着PUSH/POP操作而变化。
EBP(5) 对堆栈操作的寄存器 ebp是栈底 指向当前栈帧的底部,用于访问函数参数和局部变量。
ESI(6) 对字符串操作的寄存器 在字符串或内存块操作中,指向源数据。
EDI(7) 对字符串操作的寄存器 在字符串或内存块操作中,指向目标地址。
EIP 指令指针寄存器 存放下一条要执行的指令的地址。程序员不能直接修改它,但可以通过跳转、调用、返回等指令改变其值。
EFLAGS 标志寄存器 一个32位的寄存器,其中的每一个位(或几个位组合)代表一个特定的状态或控制标志。

(前面几个有编号,也就是括号里面的0~7,一定要记住编号,但是后面两个是没有编号的)
eax ecx edx是通用寄存器,谁都可以用
❗❗注意 :表格里面的用途暂时了解即可!前三个是通用寄存器! 并且ESP EBP不可随意修改,不然可能堆栈会出问题报错 (在特殊情况下可以修改,因为我们要保证堆栈平衡

2.2 16位的寄存器:

1111 1111 1111 1111(f f f f)

AX(0) CX(1) DX(2) BX(3) SP(4) BP(5) SI(6) DI(7) IP FLAGS

(前面几个有编号,也就是括号里面的0~7,一定要记住编号,但是后面两个是没有编号的)
十六位就是在32位的基础上把前面的'E'去掉

2.3 8位寄存器:

1111 1111(f f)

al(0)、cl(1)、dl(2)、bl(3)、ah(4)、ch(5)、dh(6)、bh(7)

补充一个知识:段寄存器

ES(0)、 CS(1)、 SS(2)、 DS(3)、 FS(4)、 GS(5)------存储段

LDTR(6)、 TR(7)------系统段

(目前只需要记住即可,不需要详细了解,后面我们会讲)

段描述符结构:

bash 复制代码
struct segment
{
  word selector;//选择子
  dword base;//基址
  dword limit;//界限
  world attributes;属性
  //段寄存器的完整内部结构是96位
}

2.4 各个寄存器之间的关系

它们之间的关系我们来画图表示:

补充:编译器的几个快捷键

  • f9 ->下断点

  • f5 ->断下来

  • f10和 f11->调试

  • shift+ f5 ->退出调试

  • a/t + 8 -> 进入反汇编

  • f7->编译(看程序有没有错)

那如何查看寄存器呢??

View -> Debug

注意 :寄存器读数时要加上0x表示十六进制,比如图中的EAX=cccccccc,读数时为0xcccccccc

3. mov指令

将第二个操作数(源操作数)复制到第一个操作数(目标操作数)。源操作数可以是立即数、通用寄存器、段寄存器或内存位置;目标寄存器可以是通用寄存器、段寄存器或内存位置。两个操作数的大小必须一样,可以是字节、字或双字。

移动指令

  • mov 目标操作数,源操作数
  • 源操作数:立即数(就是具体数字1 2...) ,通用寄存器,段寄存器,内存
  • 目标操作数:通用寄存器,段寄存器,内存
  • 立即数(imm)、寄存器(register / r)、内存(memory / m)

功能:把源操作数移动到目标操作数

  • 🤔🤔那么怎么写呢?
    • mov ecx,0x12345678
    • mov eax,ecx
    • 特殊:mov al,0x1234这样写不可以,因为0x1234是16位,而al是8位,根本放不下

❗❗注意:源操作数和目标操作数不能同时为内存,因为书写不支持,但特殊指令除外!!
🎇注意1EIP(指令指针寄存器)不可以修改,不然会出问题!!

黄色箭头移动时,寄存器EIP会变化对应的地址

🎇注意2ESP EBP不可随意修改,不然可能堆栈会出问题报错 (在特殊情况下可以修改,因为我们要保证堆栈平衡

4. 汇编的基本格式

bash 复制代码
int main(int argc, char* argv[])
{
	_asm  //关键字
	{
		//汇编指令
	}
	return 0;
}

注意: mov后面不要噢!

那这一节就简单到这里结束咯~

撒花!❀🎉🎉🎉

相关推荐
云qq3 小时前
x86操作系统19——键盘驱动
linux·c语言·汇编
_Voosk5 小时前
C指针存储字符串为何不能修改内容
c语言·开发语言·汇编·c++·蓝桥杯·操作系统
天途小编9 小时前
融合空域相关法规核心条款汇编
汇编·无人机
天途小编9 小时前
无人机相关国家根本条例核心汇编
汇编·无人机
2301_789015621 天前
C++:模板进阶
c语言·开发语言·汇编·c++
Hollis Arthur3 天前
mips栈帧详解
开发语言·汇编·学习·mips
fengye2071613 天前
板凳----------(枯藤 )vs2019+win10(第四章-3)
汇编
white-persist6 天前
【攻防世界】reverse | re1-100 详细题解 WP
c语言·开发语言·网络·汇编·python·算法·网络安全
sulikey6 天前
如何使用 Visual Studio 代替 OllyDbg 完成汇编语言实验
汇编·ide·debug·visual studio·ollydbg
浩浩测试一下7 天前
C&&汇编中的调用约定
大数据·汇编·安全·web安全·网络安全·系统安全