尽管我的汇编代码在一个单独的文件中工作,但为什么我的汇编代码会过早退出?

时间:2018-02-16 07:23:01

标签: assembly arm

此程序集文件适用于我的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

我想我可以解决这个问题,如果我把它放在上半部分而不是底部,但我想知道为什么会发生这种情况。我们非常感谢一些指导。

在终端我运行这些命令行来构建:

  • as -o test1.o test1.s
  • ld test1.o
  • gdb a.out

1 个答案:

答案 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