我不确定您使用的是哪种汇编程序,但是我可以让您的代码使用 gcc 编译,所以我坚持使用您的格式样式(不是在谈论 AT&T 语法)。
无论如何,您应该检查文档并scanf
意识到它需要一个格式字符串和指向内存中存储读取值的位置的指针。它还返回成功读取项目的数量而不是读取的内容。
现在做同样的事情并检查文档。printf
您会看到需要格式字符串才能以可读的形式打印您的号码。一个合适的格式字符串是"%d\n"
打印数字和换行符。
您的代码现在可能看起来像这样(使用 gcc 对我来说编译和工作正常):
.section .rodata
input_format: .string "%d"
output_format: .string "%d\n"
.section .bss
input: .long 0 # reserve 4 bytes of space
.section .text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
pushl $input # push the ADDRESS of input to have the value stored in it
pushl $input_format # give scanf the ADDRESS of the format string
call scanf # call scanf to get number from the user
addl $8, %esp # clean up the stack
# Note the return value of scanf is passed through eax (same for printf)
pushl input # pass the number to printf BY VALUE
pushl $output_format # pass the ADDRESSS of the output format string to printf
call printf # print input
#return 0 from main:
movl $0, %eax
movl %ebp,%esp
popl %ebp
ret
请注意,我通常会db/dw/dd
在.(ro)data
and.bss
部分中分配内存,而不是.string
and .long
,因此如果该部分做的稍有错误,您可以修复它。
您也可以使用堆栈空间来存储数字,但是您已经input
声明了并且我希望使代码尽可能与您所拥有的相似。之前和之后的所有其他scanf
内容也是如此printf
,我只是将其作为您的代码。
编辑:这是使用堆栈创建局部变量的示例,而不是在.bss
or.data
段中声明变量:
.section .rodata
input_format: .string "%d"
output_format: .string "%d\n"
.section .text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp # allocate 4 bytes on the stack for a local variable
# The local variable will be at -4(%ebp)
leal -4(%ebp), %eax # get the ADDRESS of our local variable
pushl %eax # push the ADDRESS of the variable on the stack
pushl $input_format # give scanf the ADDRESS of the format string
call scanf # call scanf to get number from the user
addl $8, %esp # clean up the stack
# Note the return value of scanf is passed through eax (same for printf)
pushl -4(%ebp) # pass the number to printf BY VALUE
pushl $output_format # pass the ADDRESSS of the output format string to printf
call printf # print the input
#return from printf:
movl $0, %eax
movl %ebp,%esp
popl %ebp
ret