下面的代码是我遇到的一些困难,它从用户那里获取 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/