我对此很陌生 - 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个值吗?
感谢您的支持!
答案 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
使用实际标签计算长度,以便自动神奇地调整为不同的字符串大小。