linux - ARM 程序集创建函数

标签 linux raspberry-pi arm raspberry-pi3 nano

下面的代码是我遇到的一些困难,它从用户那里获取 3 个数字并将它们相加。尽管无论输入如何,它都只返回 1 个数字,135228。我做了一些研究,认为问题是 printf 无法打印整数,但这不是问题,我被卡住了。

.global main
.func main
.data
x: .word 0
y: .word 0
z: .word 0
sum: .word 0
scanPattern: .asciz "%d %d %d"
.balign 4
mes1: .asciz "Enter 3 numbers, separated by spaces"
.balign 4
mes2: .asciz "The sum of the numbers you just entered is %d\n"
.text
main:
push {lr}
ldr r0, =mes1  
bl puts
ldr r0, =scanPattern 
ldr r1, =x
ldr r2, =y
ldr r3, =z
bl scanf

ldr r0, =x
ldr r1, =y
ldr r2, =z
bl summerFunc

ldr r3, =sum
str r0, [r3]
ldr r0, =mes2
ldr r1, =sum
bl printf

pop {lr}
bx lr

summerFunc:
push {lr}
add r0, r0, r1
add r0, r2
pop {lr}
bx lr

最佳答案

ldr r0, =mes2
ldr r1, =sum
bl printf

也许这会有所帮助。 mes2 是一个带有 %d 的字符串,这个字符串的意思是获取第一个操作数并打印该值。但是您传递给 printf 的是要求和的地址,而不是值总和。即使在此之前,您的代码表明理解 =sum 是求和的地址。 (存储先前函数的结果,假设返回 r0 中的求和。r3 = sum 的地址,将 r0 写入内存中 sum 的地址。在这种情况下,您可以只移动 r1,r0,然后 ldr r0,=mes2。但是我怀疑您对求和函数的调用也存在指针与值的问题。虽然不知道该函数是什么样子。

如果足够接近(毫无疑问),ldr r1,sum 应该将 sum 的值加载到 r1 中,其中 ldr r1,=sum 是一个语法技巧/快捷方式。汇编然后反汇编此代码以查看发生了什么。

关于linux - ARM 程序集创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49184807/

相关文章:

php - 当我使用 php 单击链接时如何在浏览器中显示 Linux 终端

linux - 在 Qt Creator 中设置 ARM 工具链(Ardupilot 项目)

dns - 如何让谷歌域 DynamicDNS 为 Raspberry pi3 更新 ipv4 而不是 ipv6

c++ - 当树莓派终端上的更新时间时,QT 上的 exe 文件挂起

java - 如何重复发布和接收数据但使应用程序仍然负责编辑

Android 三星 SII 不加载 armv7a 库

c - 我被这段代码困住了,对 FILE 结构和 fopen 函数有疑问

linux - FASM SHR 奇怪的行为

Linux命令通过名称获取tomcat进程id

c - 从固件启动引导加载程序