ARM汇编中的“Hello world”

4

This is my simpe "Hello world" program in ASM:

.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命令仍然存在一样。为什么?


我不太确定你在这里所说的“打印‘hello world’”是什么意思。我没有看到调用打印函数的语句。你是指你正在调试器中运行这段代码,并期望看到 .asciz "Hello world.\n\r" 的地址被加载到寄存器中吗? - Crashworks
你的代码缺失太多,无法正常工作。将字符持续存储在0x16000000处是否有特定目的?那是某种I/O端口吗?你正在从字符中存储一个长整型(str r0,[r12]);这是你想要的吗? - BitBank
@crashworks,BitBank:0x16000000将被内存映射为uart的I/O ;) - violet313
这里有一个不错的设置可以尝试一下:https://github.com/cirosantilli/arm-assembly-cheat/tree/e3477c16c8d5a59e239a202760223f4d86e199c9/linux - Ciro Santilli OurBigBook.com
1个回答

4
是一种条件分支,即当零标志位清除时才跳转。如果不跳转,则继续执行。一旦找到了空字符结尾,您就不会跳转到循环,而是将“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之后,给手臂一些其他的东西来执行,而不是数据。它应该遍历数据字符串一次,然后进入无限循环。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接