Assembly 臂组件打印过大且值不正确
这是我认为最相关的代码,还有其他存储到[fp,#-24]的值。我努力将这些值编码为[fp,#-8]和[fp,#-12]。我不确定是否发生了某种堆栈管理不善,或者我只是缺少printf函数的一些重要组件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 .
.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之前设置一个断点。