编译原理—寄存器和指令入门

指令样例

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结构中有两个变址寄存器:ESEDI

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]

常用于访问结构

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章