这是我在ASM中的simpe“ Hello world”程序:

.global _start
    _start:
        adr r1, hello
        b test
    loop:   ldr r12, =0x16000000
        str r0, [r12]

    test:   ldrb r0, [r1], #1
        cmp r0,#0
        bne loop
        @b loop
hello: .asciz "Hello world.\n\r"


注释掉b loop后,我希望它仅打印出一个“ Hello world”。但实际上它并没有停止,就像命令b loop仍然存在。为什么?

最佳答案

bne是条件分支,如果不相等则分支,如果清除零标志则基本上分支。如果没有分支,它将继续执行。一旦找到空终止,就不会分支循环,而是将组成“地狱”的字节作为指令执行。试试这个:

.global _start
    _start:
        adr r1, hello
        b test
    loop:   ldr r12, =0x16000000
        str r0, [r12]

    test:   ldrb r0, [r1], #1
        cmp r0,#0
        bne loop
    forever: b forever
hello: .asciz "Hello world.\n\r"


在完成bne之后,给手臂一些要执行的东西,而不是数据。它应该遍历数据字符串一次,然后陷入无限循环。

07-24 09:45
查看更多