我的大学课程要求一些基本的组装知识……即使我没有任何知识。但是他们给了我们这个示例汇编代码:
080485fa <check_pin>:
80485fa: 55 push ebp
80485fb: 89 e5 mov ebp,esp
80485fd: 81 7d 08 bf 07 00 00 cmp DWORD PTR [ebp+0x8],0x7bf
8048604: 0f 94 c0 sete al
8048607: 0f b6 c0 movzx eax,al
804860a: 5d pop ebp
804860b: c3 ret
Run Code Online (Sandbox Code Playgroud)
它应该或多或少地等同于以下C代码:
int check_pin(int pin) {
return pin == 0x7bf;
}
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚这个汇编代码到底是做什么的,而我对此sete
指令却傻眼了。这条指令做什么?
Wikibooks提供了一门有关x86汇编的课程,但是sete
在致力于汇编指令的这一章中,我找不到任何内容。
该sete
指令(及其等价物setz
)将其参数设置为1
是否设置了零标志0
。如果最后一个比较或算术指令产生相等或结果为零,则设置零标志。因此,根据您的情况,sete
设置al
为0
或1
根据前面的cmp
指令结果。
在许多手册中可能有点难以找到sete
,因为他们没有直接列出它,就像cmove
. 一个技巧是使用Godbolt 编译器资源管理器上的文档功能
只需像这样内嵌指令即可
__asm("sete %al");
Run Code Online (Sandbox Code Playgroud)
sete al
也可以工作,因为我们不关心操作数是什么,唯一重要的是助记符。然后,如果将鼠标悬停在该单词上,sete
您将看到出现文档工具提示。现在将光标放在该单词上并按Ctrl+ F8。将出现另一个弹出窗口
SETE帮助
根据 EFLAGS 寄存器中状态标志(CF、SF、OF、ZF 和 PF)的设置,将目标操作数设置为 0 或 1。目标操作数指向字节寄存器或内存中的字节。条件代码后缀 (cc) 表示正在测试的条件。
在弹出窗口的末尾,您还会看到该说明的文档链接,您可以在其中看到此内容
0F 94 SETE r/m8 M Valid Valid Set byte if equal (ZF=1).
REX + 0F 94 SETE r/m8* M Valid N.E. Set byte if equal (ZF=1).
Run Code Online (Sandbox Code Playgroud)
当结果为零时,ZF 将被设置,这也表示“相等”条件