指令样例
mov (%edx), %eax // 将内存地址为 EDX 的数据放入到 EAX 寄存器中
XCHG %edi %eax // 交换 EAX 和 EDI 寄存器的值
add %ebx, %eax // 将 EAX 和 EBX 相加,并将结果更新到 EAX 中
shl $4, %eax // 将 eax 逻辑左移 4 位
mov eax, 56 // 将 56H 的数据传送给 EAX 寄存器
mov esi, dword ptr [eax*2+1] // 将内存地址为 eax*2+1 处的4字节数据传送给 esi 寄存器
mov ah, byte ptr [esi*2+eax] // 将内存地址为 esi*2+eax 处的8位数据传送到 ah 寄存器
mov dword ptr [esp+36],ebx // 将ebx 寄存器的值以 4 字节 传送到堆栈地址为 esp+36 所指的地方
push eax // 将 eax 寄存器的值以 4字节 压栈,同时 esp-4
push dword ptf [12FF8589] // 将内存地址为 12FF8589 所指向的值以 4字节 压入堆栈,同时 ESP-4
pop dword ptr [12FF8589] // 将堆栈顶部的 4字节 弹出到内存地址
pop eax // 将堆栈顶部的 4 字节弹出到 eax 寄存器,同时 esp+4
通用寄存器
EAX寄存器
称为累加器,常用于算数运算、布尔操作、逻辑操作、返回函数等。
EBX寄存器
基址寄存器,常用于存档内存地址。
CX寄存器
计数寄存器,常用于存放循环语句的循环次数,字符串操作中也常用。
EDX寄存器
数据寄存器,常和EAX一起使用。
这四个通用寄存器的用途并非固定不变。编译器在编译程序的时候,会根据很多因素,如编译器、编译条件、操作系统等作出相应的改变。
我们首先要知道自己的程序是用什么的编译器编译的,然后参考具体的编译器的说明。
变址寄存器
变址的含义是内存地址会变化,即变址寄存器中存放着变动的内存地址。
在80386结构中有两个变址寄存器:ES和EDI。
ESI寄存器
源变址寄存器,通常存放要处理的数据的内存地址
EDI寄存器
目的变址寄存器,通常存放处理后的数据的内存地址
用途
ESI 和 EDI 一个存放来源数据地址,一个存放处理后的数据地址,常搭配起来使用,完成数据的赋值操作。
Rep movs dword ptr [edi], dword ptr [esi]
上述指令把 ESI 指向的内存地址中的内容,复制到 EDI 所指的内存中,复制的数据长度在 ECX 寄存器中指定。
指针寄存器
简介
80386 的指针寄存器有 基址寄存器 EBP,堆栈指针寄存器 ESP 和指令指针寄存器 EIP。
其中指令指针寄存器 EIP 总是指向下一条要执行的指令的地址,一般情况下无需修改 EIP。
EBP寄存器
基址寄存器,作为通用寄存器,用于存放操作数。常用来代替堆栈指针访问堆栈中的数据。
ESP寄存器
堆栈指针寄存器,不可作为通用寄存器使用,存放当前堆栈栈顶的地址。一般情况下,ESP 和 EBP 联合使用来访问函数中的参数和局部变量。
push ebp
mov ebp, esp
sub esp, 78
push esi
push edi
cmp dword ptr [ebp+8], 0
寻址方式和作用
立即寻址
mov eax, 56H
通常用于赋值
直接寻址
mov eax, [12558878H]
通常用于处理变量
寄存器寻址
mov eax, [edi]
地址在寄存器中
基址加变址寻址
mov eax, [ebp+esi]
常用于访问结构