跳转至

汇编命令

一旦你理解汇编指令以及如何格式化它们的操作数,就可以开始编写命令。下面的代码显示了一个汇编函数,由一些非常基本的命令组成,本质上什么也不做。

PUSH EBP ; 把 EBP(寄存器)压入栈
MOV EBP, ESP ; 把 EBP 设为 ESP 的值(寄存器,栈顶)
PUSH -1 ; 把 -1(立即值)压入栈
ADD ESP, 4 ; 抵消 PUSH -1,让 ESP 回到原位(PUSH 会使 ESP
 ; 减去 4,因为它会扩大栈)
MOV ESP, EBP ; 把 ESP 设为 EBP 的值(反正它们相同,

因为我们已经让 ESP 保持原位)

POP EBP ; 把 EBP 设为栈顶的值(就是 EBP 最初的值,
 ; 由 PUSH EBP 压入栈)
XOR EAX, EAX ; EAX(寄存器)与自身异或
 ; (效果同 MOV EAX, 0,但快得多)
RETN ; 以 0 作为返回值从函数返回(EAX 通常保存返回值)

前两行(PUSH 命令和 MOV 命令)设置一个栈帧。下一行把 −1 压入栈,这会在栈被 ADD ESP, 4 命令恢复原位时被撤销。之后,栈帧被移除,返回值(存储在 EAX 中)用 XOR 指令设为 0,函数返回。

你会在第八十六页「调用栈」和第九十四页「函数调用」中了解更多关于栈帧和函数的内容。现在,把注意力放在代码中的常量上——即 EBP、ESP 和 EAX,它们在代码中经常用作操作数。这些值(以及其他值)叫做处理器寄存器,理解它们对于理解栈、函数调用和汇编代码的其他底层方面至关重要。