指令集在汇编中做什么?

gaa*_*kam 5 x86 assembly

我的大学课程要求一些基本的组装知识……即使我没有任何知识。但是他们给了我们这个示例汇编代码:

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在致力于汇编指令的这一章中,我找不到任何内容。

fuz*_*fuz 6

sete指令(及其等价物setz)将其参数设置为1是否设置了零标志0。如果最后一个比较或算术指令产生相等或结果为零,则设置零标志。因此,根据您的情况,sete设置al01根据前面的cmp指令结果。


phu*_*clv 6

在许多手册中可能有点难以找到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 将被设置,这也表示“相等”条件