4

这是我在 ASM 中的简单“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仍然存在一样。为什么?

4

1 回答 1

4

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之后执行的东西,而不是数据。它应该遍历数据字符串一次然后陷入无限循环。

于 2012-05-26T06:09:43.137 回答