【发布时间】:2019-09-19 22:25:05
【问题描述】:
我想从控制台获取一个数字并以 1 为增量显示它。但结果不是我想要显示的。你能向我解释我做错了什么吗? (我在组装方面一点都不先进)
.data
number: .long 0
numberformat: .asciz "%ld"
assig: .asciz "text \n \n"
enternumber: .asciz "Enter the number: \n"
numberformat1: .asciz "The input number+1 = %d \n"
.text
.global main
main: # main
call print1
call print2
call inout
call exit
inout:
movq $0, %rax # clear rax
movq $numberformat, %rdi # load format string
movq $number, %rsi # set storage to address of number
call scanf
pop %rbp
movq $number, %rbx
add $1, %rbx
movq $0, %rax
movq %rbx, %rsi
movq $numberformat1, %rdi
call printf
# call printnewnumber
ret
print1:
movq $0, %rax
movq $assig, %rdi
call printf
ret
print2:
movq $0, %rax
movq $enternumber, %rdi
call printf
ret
printnewnumber:
movq $0, %rax
movq %rdx, %rsi
movq $numberformat1, %rdi
call printf
ret
【问题讨论】:
-
“但结果不是我想要显示的” - 那么程序实际打印的是什么?
-
程序显示(我认为)剩余值,正如我在标题中所说。如果我运行该程序,我将始终在控制台中得到相同的数字(这不是我写的加 1 的数字)
-
不要将 Javascript sn-p 标签用于汇编代码。这行不通。
-
我正在使用带有 AT&T 语法(x86_64 程序集)的 Debian,并使用 gcc 进行编译
-
pop %rbp在那里很奇怪。您正在从堆栈中弹出您的返回地址,所以当inout底部的ret返回时,它实际上是返回到main的返回地址。call exit永远无法到达。