汇编程序签署了比较

时间:2015-10-21 19:13:48

标签: assembly x86 comparison

(使用带有AT& T语法的X86指令集。)

我目前正在开发一个程序,以便在long值列表中找到最小的数字。

值分配如下

data_items: .long 13,-5,-8,4,-120

我遇到的问题是价值的比较,因为它们可能是负面的。我正在将我的data_items看作有符号值,在stackoverflow上的一些答案中使用jg - 如果提议更大则跳转。但它对我不起作用,或者我可能错了。

我写了一点“测试”

movl $-7, %ebx    #write -7 to register ebx
movl $2, %ecx     #write 2 to register ecx

cmpl %ebx, %ecx   #compare -7 and 2
jl end_loop       #if -7 is less than 2, jump
movl $77, %ebx    # move 77 to register ebx

end_loop:

结果(在寄存器%ebx中)应为-7(或实际为249因为它的两个补码),但它是77.

如何比较签名值?我是否必须确定它们是否已签名,请记住这一点,如果签名后对它们进行了否定,则需要进行比较?

2 个答案:

答案 0 :(得分:2)

您的基本问题不是签名(jl对于签名比较是正确的;如果您想要无符号,则使用jb),但是cmp指令的操作数顺序。

以下是一些记忆辅助的想法:

cmp $42, %ecx是一条法律指示,但cmp %ecx, $42不是。因此,如果您将第二个操作数视为“我正在测试的变量”并将第一个操作数视为“我将其与之比较的值”,那么跳转指令的自然措辞“如果变量小于价值“将是正确的。

或者,如果你不喜欢这样,请记住cmp就像一个减法结果,它会抛出结果,只存储标志,当你读到像sub %ebx, %ecx这样的指令作为句子时,使语法正确的最简单方法是将逗号发音为“from”。 “从 ecx中减去ebx ” - 如果结果小于0,jl将会跳转。

通过取jl所代表的“小于”,并将其插入cmp指令中的逗号代替,您阅读指令的方式会导致错误的答案。< / p>

答案 1 :(得分:1)

他们签名是因为你这么说,你永远无法测试是否有签名的东西。任何位模式也是有效的无符号数。除了你如何使用它们之外,没有什么可以区分它们。

在您的示例中,它会将ecxebx进行比较,然后转到end_loop ecx <s ebx,而不是http://example.com/application/views/pages/vcard/igniel.php