没有数据部分的 ARM Assembly 中的 Hello World

Hello World in ARM Assembly without data section

我有一个 ARM 汇编语言的 "Hello, World!" 程序,我想将它转换成 shell 代码以在内存区域中执行它。在英特尔汇编语言中,我去掉了 .data 部分,因为在转换为 shell 代码时只使用了 .text 部分。 (See here)

现在我正在努力用 ARM 的汇编语言做同样的事情。基础是下面的代码:

ARM 程序集你好世界

.global _start

_start:
    mov r7, #4
    mov r0, #1
    ldr r1,=string
    mov r2, #12
    swi 0
    mov r7, #1
    swi 0

.data
string:
  .ascii "Hello, World"

修改了 ARM Assembly Hello World 以省略 .data 部分

.global _start
.global mymessage

mymessage:
    mov r7, #4
    mov r0, #1
    pop {r1}
    mov r2, #12
    swi 0
    mov r7, #1
    swi 0

_start:
    bl mymessage
    .ascii "Hello, World"

但这不起作用,因为这显然是“非法指令”。有什么想法吗?

ARM 已经具有 PC 相对寻址,并且在任何情况下,bl 不会将 return 地址压入堆栈。

这个有效:

.global _start

_start:
    mov r7, #4
    mov r0, #1
    adr r1, string
    mov r2, #12
    swi 0
    mov r7, #1
    swi 0

string:
  .ascii "Hello, World"