指令集在汇编中做什么?

时间:2018-10-26 15:14:09

标签: assembly x86

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

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的任何内容。

2 个答案:

答案 0 :(得分:4)

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

答案 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,这也表示“相等”条件