汇编_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是通用寄存器,谁都可以用
❗❗注意:表格里面的用途暂时了解即可!前三个是通用寄存器! 并且ESPEBP不可随意修改,不然可能堆栈会出问题报错(在特殊情况下可以修改,因为我们要保证堆栈平衡

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)——系统段
(目前只需要记住即可,不需要详细了解,后面我们会讲)

段描述符结构:

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会变化对应的地址

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

4. 汇编的基本格式

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

在这里插入图片描述

注意: mov后面不要噢!

在这里插入图片描述

那这一节就简单到这里结束咯~
撒花!❀
在这里插入图片描述

posted @ 2025-12-16 19:21  gccbuaa  阅读(1)  评论(0)    收藏  举报