ARM Assembly中的“Hello world”

时间:2012-05-25 22:43:44

标签: assembly arm

这是我在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仍在那里一样。为什么呢?

1 个答案:

答案 0 :(得分:4)

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

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