[英]linux nasm code displays nothing
我正在編寫一個程序,用戶在其中輸入數字,並打印出從零到數字的所有數字。 它可以很好地進行編譯,鏈接並且可以在運行時不返回任何錯誤,但它絕對不會輸出任何內容。 這是代碼:
SECTION .data
len EQU 32
SECTION .bss
other resd len
data resd len
SECTION .text
GLOBAL _start
_start:
nop
input: ; This section gets the integer from the user
mov eax, 3 ; }
mov ebx, 1 ; }
mov ecx, data ; } System_read call
mov edx, len ; }
int 80h ; }
mov ebp, 1
setup: ; This section sets up the registers ready for looping
mov [other], ebp
loop: ; This section loops, printing out from zero to the number given
mov eax, 4
mov ebx, 1
mov ecx, [other]
mov edx, len
int 80h
exit: ; Exits the program
mov eax, 1 ; }
mov ebx, 0 ; } System_exit call
int 80h ; }
當我在KDBG上逐步執行它時,它會返回一些錯誤。 它接收到中斷和分段錯誤,盡管我不知道在哪里。 我不確定為什么會這樣,因為當我在Geany中運行它時,它最后會返回0值,並且運行時不會出錯。 為什么不起作用?
提前致謝
注意:此代碼不會循環。 還沒結束 它所要做的就是打印數字1。
當您打印時,您正在調用mov ecx, [other]
。 這將查看存儲在其他地址中的地址,並跟隨該地址獲取存儲在該地址中的所有內容。 問題在於此系統調用期望ecx中的地址,而不是值。
如果您叫mov ecx, other
則調用mov ecx, other
,則ecx將擁有other的地址,並且能夠轉到該地址並打印其中的內容。
您這里還有另一個問題:當您打印存儲在other
的數字時,它將把它轉換為ascii值。 因此,例如,當您嘗試打印1而不是打印數字1時,它將打印ascii 1(它恰好是標題字符的開始;您不想打印的內容)。 如果要打印數字,請添加'0'
(字符“ 0”)。
編輯:另一件事,當您閱讀時,您正在將1傳遞給ebx。 1是STDOUT。 您想要的是STDIN為0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.