Asm:试图比较两个整数 - 我得到了错误的答案

时间:2014-03-16 17:59:34

标签: ubuntu assembly

我对此很陌生 - Ubuntu + as

我正在尝试对两个整数进行简单比较并显示一条消息。这是我的代码:

.data
    MsgA:   .ascii "A is higher\n"
    MsgB:   .ascii "B is higher\n"
.text

.global _start

_start:

    movl $25, %eax
    movl $15, %ebx
    cmp %eax, %ebx      #Compare the two (eax - ebx)
    jg AHire        #If result is bigger, A Hire

    #say that B is hire 
    movl $4, %eax
    movl $1, %ebx
    movl $MsgB, %ecx    #Otherwise B Hire
    movl $10, %edx
    int $0x80

    jmp EndProg

#say that A is hire
AHire:  
    movl $4, %eax
    movl $1, %ebx
    movl $MsgA, %ecx
    movl $10, %edx
    int $0x80

EndProg:
    movl $1, %eax
    movl $0, %ebx
    int $0x80

虽然我希望自己走在正确的轨道上,但我有点疑惑为什么输出是“B是雇用”。不应该比较返回正值,因为根据文档, cmp 从第1个值减去第2个值吗?

感谢您的支持!

1 个答案:

答案 0 :(得分:1)

我认为你已经与AT&T/Intel符号差异相冲突了。在英特尔表示法中,源代码为最后一个,例如加载eax时具有直接值1

mov eax, 1

AT& T 表示法中,将写为:

movl $1, %eax

因此你的指示:

cmp %eax, %ebx

为您提供执行ebx - eax的结果,而不是您对eax - ebx的错误假设。它等同于英特尔的符号:

cmp ebx, eax

而且,虽然它与你手头的问题无关,但这里的正确词是higher(更高)而不是hire(付某人使用某些东西)。

如果使用计算来获取字符串长度,则可以使代码更易于维护。这样,如果您将字符串更改为"A is higher\n",则您不需要跟踪并更改10的硬编码长度。首先将您的数据更改为:

.data
    MsgA:   .ascii "A is hire\n"
    MsgB:   .ascii "B is hire\n"
    MsgC:

然后将加载长度的代码更改为以下之一:

    movl MsgB-MsgA, %edx  ; for printing MsgA
    movl MsgC-MsgB, %edx  ; for printing MsgB

使用实际标签计算长度,以便自动神奇地调整为不同的字符串大小。