4.4 程序的机器级代码

4.4.1 x86汇编指令

一、指令格式

指令 目的操作数 源操作数

mov eax, ebx

寄存器ebx的值复制到寄存器eax

mov eax, 5

立即数5的值复制到寄存器eax

mov eax, dword ptr [af996h]

内存地址[af996h]所指的32bit值复制到寄存器eax

mov byte ptr [af996h], 5

立即数5的值复制到内存地址[af996h]所指的一字节

二、常用寄存器

E:(Extended),32bit

  • 通用寄存器(X:未知)

    • EAX:作为累加器

    • EBX:作为基地址寄存器

    • ECX:作为循环计数器

    • EDX:作为数据寄存器

通用寄存器可以继续细分为16bit和8bit的

  • 变址寄存器(I:Index)

    • ESI:(Source)源操作数

    • EDI:(Destination)目的操作数

  • 堆栈寄存器

    • EBP:(Base Pointer)堆栈基指针

    • ESP:(Stack Pointer)堆栈顶指针

三、AT&T格式

  • 源操作数和目的操作数顺序与Intel格式相反

  • (……):主存地址,可以存在加减法

  • %:寄存器前缀

  • $:立即数前缀

  • 读写长度

    • MOVB $5, (af996h):MOV byte ptr [af996h], 5

    • MOVW $5, (af996h):MOV word ptr [af996h], 5

    • MOVL $5, (af996h):MOV dword ptr [af996h], 5

  • MOV 8(%EDX, %EAX, 2):MOV [EDX+EAX*2+8]

    • 偏移量为8

    • 基址寄存器EDX

    • 变址寄存器EAX

    • 比例因子2

4.4.2 常用指令

一、算术运算

二、逻辑运算指令

三、控制流指令

4.4.3 具体实现

一、条件跳转

源代码

利用转移指令实现:

二、循环语句

源代码

使用转移指令实现

使用loop指令实现

最后更新于

这有帮助吗?