Assembly 指令集在汇编中做什么?

Assembly 指令集在汇编中做什么?,assembly,x86,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],0x7b

我的大学课程需要一些基本的组装知识。。。即使我没有。然而,他们给了我们这个示例汇编代码:

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
我试图弄清楚这个汇编代码到底做了什么,我被这条
sete
指令吓了一跳。这个指令是做什么的


Wikibooks有,但我在专门讨论汇编指令的章节中找不到任何关于
sete
的内容。

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

在许多手册中可能有点难找到
sete
,因为它们不像
cmove
那样直接列出它。一个技巧是在上使用文档功能

只需像这样内联编写指令

__asm("sete %al");
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).

当结果为零时,将设置ZF,这也表示“相等”条件

查找文档的另一种方法是在操作码映射中查找
0F 94
操作码。但是,是的,这是一个很好的答案,告诉我们如何找到神秘指令的文档。关于AT&T操作数大小后缀有几个类似的SO问题,这让那些在手册中查找
retq
leal
或其他内容的人感到困惑,还有setcc/jcc/cmovcc。
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).