
【本节目标】
- 明确汇编的定义
- 记住有哪些寄存器(名称),以及其对应的编号(0~7),多少位(32 16 8)
- 学会使用mov指令
- 掌握书写汇编的基本格式
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)------系统段
(目前只需要记住即可,不需要详细了解,后面我们会讲)
段描述符结构:
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位,根本放不下
❗❗注意:源操作数和目标操作数不能同时为内存,因为书写不支持,但特殊指令除外!!
🎇注意1 :EIP(指令指针寄存器)不可以修改,不然会出问题!!

黄色箭头移动时,寄存器EIP会变化对应的地址
🎇注意2 :
ESPEBP不可随意修改,不然可能堆栈会出问题报错 (在特殊情况下可以修改,因为我们要保证堆栈平衡)
4. 汇编的基本格式
bash
int main(int argc, char* argv[])
{
_asm //关键字
{
//汇编指令
}
return 0;
}

注意: mov后面不要
,噢!

那这一节就简单到这里结束咯~
撒花!❀🎉🎉🎉
