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).