Assembly 臂组件打印过大且值不正确

Assembly 臂组件打印过大且值不正确,assembly,arm,Assembly,Arm,这是我认为最相关的代码,还有其他存储到[fp,#-24]的值。我努力将这些值编码为[fp,#-8]和[fp,#-12]。我不确定是否发生了某种堆栈管理不善,或者我只是缺少printf函数的一些重要组件 .data var: .word prompt1: .asciz "Largest number:\n" prompt2: .asciz "Smallest number:\n" input: .asciz "%d" test: .asciz "%d and %d\n" .align 2 .

这是我认为最相关的代码,还有其他存储到[fp,#-24]的值。我努力将这些值编码为[fp,#-8]和[fp,#-12]。我不确定是否发生了某种堆栈管理不善,或者我只是缺少printf函数的一些重要组件

.data

var: .word

prompt1: .asciz "Largest number:\n"
prompt2: .asciz "Smallest number:\n"
input: .asciz "%d"
test: .asciz "%d and %d\n"

.align 2
.text
.align 2

.global main

.func main
main:
    push {fp, lr}
    add fp, sp, #4


    sub sp, sp, #20

    ldr r0, =prompt1
    bl printf

   @  var1
    ldr r0, =input
    sub r1, fp, #8
    bl scanf

    ldr r0, =prompt2
    bl printf

    @ var2
    ldr r0, =input
    sub r1, fp, #12
    bl scanf

    ldr r0, =test
    str r1, [fp, #-8]
    str r2, [fp, #-12]
    bl printf

sub sp, fp, #4
pop {fp, pc}
.endfunc
返回

 [large number] and 0
编辑:来自GDB的潜在有用信息

(gdb) start
Temporary breakpoint 1 at 0x10438: file gcd.s, line 19.
Starting program: /home/pi/gcd 

Temporary breakpoint 1, main () at gcd.s:19
19      push {fp, lr}
(gdb) step
21      add fp, sp, #4
(gdb) step
24      sub sp, sp, #20
(gdb) step
26      ldr r0, =prompt1
(gdb) step
27      bl printf
(gdb) step
__printf (format=0x21048 "Largest number:\n") at printf.c:33
33  printf.c: No such file or directory.
(gdb) step
_IO_vfprintf_internal (s=0xb6fb7d90 <_IO_2_1_stdout_>, 
    format=0x21048 "Largest number:\n", format@entry=0x0, ap=..., ap@entry=...)
    at vfprintf.c:1278
1278    vfprintf.c: No such file or directory.
(gdb) step
1282    in vfprintf.c
(gdb) step
1293    in vfprintf.c
(gdb) step
1315    in vfprintf.c
(gdb) step
__find_specmb (format=<optimized out>) at vfprintf.c:1304
1304    in vfprintf.c
(gdb) step
_IO_vfprintf_internal (s=0xb6fb7d90 <_IO_2_1_stdout_>, 
    format=0x21048 "Largest number:\n", format@entry=0x0, ap=..., ap@entry=...)
    at vfprintf.c:1315
1315    in vfprintf.c

(gdb)启动
0x10438处的临时断点1:文件gcd.s,第19行。
启动程序:/home/pi/gcd
临时断点1,gcd.s处的main():19
19推送{fp,lr}
(gdb)步骤
21添加fp、sp和#4
(gdb)步骤
24副警司,警司,#20
(gdb)步骤
26 ldr r0,=提示1
(gdb)步骤
27 bl printf
(gdb)步骤
__printf(格式=0x21048“最大数字:\n”)在printf.c:33
33 printf.c:没有这样的文件或目录。
(gdb)步骤
_IO_vfprintf_内部(s=0xb6fb7d90,
格式=0x21048“最大数字:\n”,format@entry=0x0,ap=。。。,ap@entry=...)
在vfprintf.c:1278
1278 vfprintf.c:没有这样的文件或目录。
(gdb)步骤
1282英寸vfprintf.c
(gdb)步骤
1293英寸vfprintf.c
(gdb)步骤
1315英寸vfprintf.c
(gdb)步骤
__在vfprintf.c:1304中查找_specmb(format=)
1304英寸vfprintf.c
(gdb)步骤
_IO_vfprintf_内部(s=0xb6fb7d90,
格式=0x21048“最大数字:\n”,format@entry=0x0,ap=。。。,ap@entry=...)
在vfprintf.c:1315
1315英寸vfprintf.c

您想在这里做什么,它在做什么?可能您希望在
printf
之前使用
ldr
而不是
str
r1
r2
仍然保留着它们中剩余的垃圾扫描。(而且你也只是用垃圾重写了输入:P)使用调试器单步执行代码并检查寄存器值。@old_timer我希望代码返回
[input val]和[input val]
。我在我的帖子中也犯了一个错误,它实际上打印了
[大数字]和0
@PeterCordes我在帖子中添加了一些相关的调试信息。我很确定你的bug就是我之前评论的:使用
ldr r1[fp,#-8]
而不是
str r1[fp,#-8]
(r2也是如此)从存储scanf转换结果的地址重新加载scanf转换结果。那只是个大脑放屁,对吧?或者,您是否需要详细解释为什么需要从堆栈中存储而不是存储到堆栈中?顺便说一句,使用
ni
跳过打印提示,或者在打印值的最终printf之前设置一个断点。