汇编_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后面不要噢!

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

撒花!❀🎉🎉🎉

相关推荐
我在人间贩卖青春4 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春4 天前
汇编之伪操作
汇编·伪操作
济6174 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka4 天前
汇编TEST指令
汇编
我在人间贩卖青春4 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春4 天前
汇编和C编程相互调用
汇编·混合编程
myloveasuka5 天前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子5 天前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka5 天前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春6 天前
汇编之分支跳转指令
汇编·arm·分支跳转