ARM 程序集:位于堆栈上的写入编号



我有一个ARM汇编代码,ATM只是从一个字符串变量中打印出"Hello World":

.global _start
_start:
mov r0, #40
mov r1, #25
bl func1
mov r7, #1
swi 0
func1:
push {lr}
add r2,r0,r1
mov r0,r2
bl func2
pop {pc}
func2:
mov r7, #4
mov r0, #1
mov r2, #12
ldr r1, =string
swi 0
bx lr
.data
string:
.ascii "Hello Worldn"

但是现在,我想打印在 func1 中发生的加法结果(结果 = 65),方法是将其写入堆栈,然后将 write() 系统调用堆栈上结果的内存地址。 我已经尝试过将 func2 开头的结果推送到堆栈上

push {r0}

然后以某种方式通过访问堆栈指针和偏移量 4 在 r1 中加载该地址(它存储要为 write() 系统调用打印的参数),如果 Im 正确,则应存储该值:

ldr r1, [sp, #4]

但这似乎不起作用,我只在我尝试的所有事情上遇到分段错误。

谁能帮助我如何在结果堆栈上获取地址内存,然后继续使用 write() 系统调用打印它?如果它将结果打印为字母而不是数字(因为它可能会将其解释为 ASCII 值),我就可以了,这只是关于我了解如何获取堆栈上值的地址并打印它。 非常感谢:)

要获得超过sp4 个字节的地址,您需要执行add r1, sp, #4。但请记住,push以完全降序模式使用堆栈,这意味着sp指向推送的最后一个项目。因此,您无需添加4,只需执行mov r1, sp即可。

您对ldr所做的实际上是从堆栈加载值,即使您使用了正确的偏移量,这仍然不好,因为您需要地址而不是值。

最新更新