此程序集文件适用于我的raspberry pi(ARM程序集)。我正在转换这个:
if(9<x && x<=10){
r0 += 7; //otherwise exit
}
汇编代码,这是_start的下半部分:。简单地说,我有这个:
.global _start
_start:
mov r0, #0
mov r1, #10
cmp r1, #5
bgt _true
cmp r1, #10 @ x < 10
bge _else
add r0, #3
cmp r1, #9 @ *here is where the program messes up and exits*
ble _exit
cmp r1, #10
bgt _exit
mov r0, #7
_true:
add r0, #1
_else:
add r0, #5
_exit:
mov r7, #1
swi 0
我相信我的逻辑很好,因为我将问题隔离到一个不同的.s文件中,并且它完美地工作。
.global _start
_start:
cmp r1, #9 @ *this works as expected*
ble _exit
cmp r1, #10
bgt _exit
mov r0, #7
_exit:
mov r7, #1
swi 0
我想我可以解决这个问题,如果我把它放在上半部分而不是底部,但我想知道为什么会发生这种情况。我们非常感谢一些指导。
在终端我运行这些命令行来构建:
答案 0 :(得分:1)
这是正常的,因为在第一次比较之后将分支到_true(因为!Z&amp;&amp; N == O)并继续直到结束(_else和_exit)。
.global _start
_start:
mov r0, #0
mov r1, #10
cmp r1, #5
bgt _true @ It will branch to true because !Z && N==O
但是,回答你的问题,你必须在_true和_else之后跳转到_exit(或用link(bl)分支),因为如果没有,你将继续执行指令。此外,如果您不想使用分支链接(bl),您可以将_exit放在顶部,将__exit放在_true和_else中。
e.g。
.global _start
_exit:
mov r7, #1
swi 0
_start:
mov r0, #0
mov r1, #10
cmp r1, #5
bgt _true
cmp r1, #10 @ x < 10
bge _else
add r0, #3
cmp r1, #9 @ *here is where the program messes up and exits*
ble _exit
cmp r1, #10
bgt _exit
mov r0, #7
_true:
add r0, #1
b _exit
_else:
add r0, #5
b _exit