【发布时间】:2012-12-31 11:36:34
【问题描述】:
我很难理解汇编程序中的以下代码 sn-p:
if ( EAX >= 5 )
EBX = 1;
else
EBX = 2;"
在汇编程序中,这可以写成如下(根据我的书),模拟您通常在“更简单”的分支中使用的jge instruction,它一次只查看一个标志:
1 cmp eax, 5 ;(assuming eax is signed)
2 js signon ;goto signon if SF = 1
3 jo elseblock ;goto elseblock if OF = 1 and SF = 0
4 jmp thenblock ;goto thenblock if SF = 0 and OF = 0
5 signon:
6 jo thenblock ;goto thenblock if SF = 1 and OF = 1
7 elseblock:
8 mov ebx, 2
9 jmp next
10 thenblock:
11 mov ebx, 1
12 next:
我可以理解生成的标志可以是:(if (EAX >= 5)):
SF = 0 & OF = 0 但我无法理解标志是如何出现的: SF = 1 & OF = 1?这是什么计算得出的?
澄清我的意思:
如果 eax 处于负数下限,它可能会通过减 5 溢出到正数。如果它在正数上限,它不能通过减 5 溢出到负数?
【问题讨论】:
-
是的,我明白了,但是 eax 怎么会溢出成负数呢?我可以理解 SF = 0 & OF = 1 如何不满足条件,但不知道 SF = 1 & OF = 1 如何满足。
-
您正在阅读什么书/文档/网站? SF = 1 表示结果为负,OF = 1 表示操作导致带符号操作数的上溢/下溢。如果它们都设置了,则意味着左操作数是一个大的正数,而右操作数是一个小的负数,足以导致结果从正数翻转到负数。当第二个操作数为 5 时,这是不可能的。(编辑:在我看来,学习这个的最好的书是 Reversing - Secrets of Reverse Engineering。)
-
这是什么书?当一个简单的
jge会做同样的事情并且更具可读性时,为什么要为多个条件分支所困扰?我认为整个js/jo/jmp/jo块是从通用解决方案中复制粘贴的,而无需费心将其适应特定上下文。 -
这本书是每日 WTF 吗?那是可怕的代码,我希望这只是一个奇怪的例子,我从来没有在任何地方的生产环境中遇到过这样的事情!