我真的不知道你用什麼樣的彙編,但是我能得到你的代碼用gcc編譯,所以我堅持你的格式化風格(不是在談論AT & T語法)。
無論如何,你應該檢查documentation爲scanf
,並意識到它需要一個格式字符串和指針在哪裏存儲讀取的值存儲位置,也返回數量的成功讀取物品而不是讀到的東西。
現在,請執行相同操作,並檢查documention的printf
。你會看到需要一個格式字符串來以可讀形式打印你的號碼。一個合適的格式字符串是"%d\n"
來打印數字和一個換行符。
現在您的代碼可能是這個樣子(這編譯併爲我工作得很好用gcc):
.section .rodata
input_format: .string "%d"
output_format: .string "%d\n"
.section .bss
input: .long
.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 from printf:
movl $0, %eax
movl %ebp,%esp
popl %ebp
ret
注意,我通常會使用db/dw/dd
的,而不是在.(ro)data
和.bss
部分分配內存.string
和.long
,所以如果那部分做得有點不對,你可以修復它。
您也可以使用堆棧空間來存儲數字,但是您已經聲明瞭input
,並且我想讓代碼儘可能類似於您的代碼。在scanf
和printf
之前和之後的所有其他東西都一樣,我只是將它作爲代碼。
編輯:下面是一個使用堆棧來創建一個局部變量,而不是讓在.bss
或.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
首先的 - 謝謝!第二,我怎樣才能做到這一點,而不使用全局變量(即'輸入'變量)並使用棧?再次感謝! – ron 2011-12-16 06:29:02