我的大学课程要求一些基本的组装知识...即使我没有任何知识。但是他们给了我们这个示例汇编代码:
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
应该大致等于以下C代码:
int check_pin(int pin) {
return pin == 0x7bf;
}
我试图弄清楚该汇编代码的确切作用,而我对此sete
指令感到震惊。这条指令是做什么的?
Wikibooks有a course on x86 assembly,但在汇编说明这一章中我找不到关于sete
的任何内容。
答案 0 :(得分:4)
如果设置了零标志,则sete
指令(及其等效的setz
)会将其参数设置为1
,否则将其参数设置为0
。如果最后一个比较或算术指令产生相等或结果为零,则设置零标志。因此,根据您的情况,sete
根据前面的al
指令的结果将0
设置为1
或cmp
。
答案 1 :(得分:1)
在许多手册中很难找到sete
,因为它们并不像cmove
一样直接列出。一种技巧是使用Godbolt's Compiler Explorer
只需这样编写内联指令
__asm("sete %al");
sete al
也将起作用,因为我们不在乎操作数是什么,所以唯一重要的是助记符。然后,如果将鼠标悬停在单词sete
上,则会看到文档提示。现在将光标放在该单词上,然后按 Ctrl + F8 。将会出现另一个弹出窗口
SETE帮助
根据EFLAGS寄存器中状态标志(CF,SF,OF,ZF和PF)的设置,将目标操作数设置为0或1。目标操作数指向字节寄存器或内存中的字节。条件代码后缀(cc)表示要测试的条件。
在弹出窗口的最后,您还将看到指向documentation for that instruction的链接,您可以在其中看到此内容
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).
结果为零时将设置ZF,这也表示“相等”条件