【发布时间】:2018-03-05 12:33:09
【问题描述】:
我正在尝试在汇编中制作一个小程序(用于 AT&T)。我试图以整数的形式从用户那里获取输入,然后将其递增,然后输出递增的值。但是,该值不会增加。我花了最后几个小时尝试了我能想到的一切,但它仍然不起作用,所以我认为我可能不太了解装配中的概念,导致我没有发现错误。这是我的代码:
1 hiString: .asciz "Hi\n"
2 formatstr: .asciz "%ld"
3
4 .global main
5
6 main:
7 movq $0, %rax #no vector registers printf
8 movq $hiString, %rdi #load hiString
9 call printf #printf
10 call inout #inout
11 movq $0, %rdi #loading exit value into register rdi
12 call exit #exit
13
14 inout:
15 pushq %rbp #Pushing bp
16 movq %rsp, %rbp #Moving sp to bp
17 subq $8, %rsp #Space on stack for variable
18 leaq -8(%rbp), %rsi
19 movq $formatstr, %rdi #1st argument scanf
20 movq $0, %rax #no vector for scanf registers
21 call scanf #scanf
22 incq %rsi
23 call printf
从我朋友的教程中,我了解到第 17 行到第 19 行是必要的,但是,我认为我没有使用那里的堆栈空间,所以我怀疑错误与此有关。我当然不确定。提前谢谢你。
编辑,更新代码(printf 现在仍在子程序中调用)
1 hiString: .asciz "hi\n"
2 formatstr: .asciz "%ld"
3
4 .global main
5
6 main:
7 movq $0, %rax
8 movq $hiString, %di
9 call printf
10 call inout
11 movq $0, %rdi
12 call exit
13
14 inout:
15 pushq %rbp
16 movq %rsp, %rbp
17 subq $8, %rsp
18 leaq -8(%rbp), %rsi
19 movq $formatstr, %rdi
20 movq $0, %rax
21 call scanf
22 popq %rax
23 incq %rax
24 movq %rax, %rsi
25 movq $0, %rax
26 call printf
27 addq $8, %rs
它现在运行并递增,但是,当输出递增的值时,值后面会出现一些奇怪的符号。
编辑:没关系,上面只发生过一次,现在没有输出增量值,只有奇怪的迹象。
【问题讨论】:
-
您上次的编辑再次从
inout的末尾删除了ret....