我正在編寫一個程序,以簡單地接受用戶的輸入兩次,然後將結果輸出到標準輸出。我遇到的問題是,當從輸入中斷返回結果時(eax),我將它壓入堆棧以備後用。我再次爲第二個用戶輸入。x86 NASM組件 - 與堆棧有關的問題
我到目前爲止的代碼是:
%include "system.inc" ; used for renaming of interrupts (sys.write and sys.read)
section .data
greet: db 'Hello!', 0Ah, 'What is your name?', 0Ah
greetL: equ $-greet ;length of string
colorQ: db 'What is your favorite color?', 0Ah
colorL: equ $-colorQ
suprise1: db 'No way '
suprise1L: equ 7
comma: db ', '
commaL: equ $-comma
suprise3: db ' is my favorite color, too!', 0Ah
suprise3L: equ $-suprise3
section .bss
name: resb 50
color: resb 50
section .text
global _start
_start:
greeting:
mov eax, 4
mov ebx, 1
mov ecx, greet
mov edx, greetL
sys.write
getname:
mov eax, 3
mov ebx, 0
mov ecx, name
mov edx, 50
sys.read
xor ecx, ecx
mov eax, ecx
push ecx
askcolor:
mov eax, 4
mov ebx, 1
mov ecx, colorQ
mov edx, colorL
sys.write
getcolor:
mov eax, 3
mov ebx, 0
mov ecx, color
mov edx, 50
sys.read
xor ebx, ebx
mov ebx, eax
push ebx
thesuprise:
mov eax, 4
mov ebx, 1
mov ecx, suprise1
mov edx, suprise1L
sys.write
xor ebx, ebx
xor ecx, ecx
xor edx, edx
pop ecx
sub ecx, 1
mov edx, ecx
mov eax, 4
mov ebx, 1
mov ecx, name
mov edx, edx
sys.write
mov eax, 4
mov ebx, 1
mov ecx, comma
mov edx, commaL
sys.write
xor ebx, ebx
xor ecx, ecx
xor edx, edx
pop ebx
sub ebx, 1
mov edx, ebx
mov eax, 4
mov ebx, 1
mov ecx, color
mov edx, edx
sys.write
mov eax, 4
mov ebx, 1
mov ecx, suprise3
mov edx, suprise3L
sys.write
done:
mov eax, 1
mov ebx, 0
sys.exit
我得到的嚴重問題間距在輸出中,最有可能的,因爲我是如何處理在EAX返回的值時,我推/彈出它。有什麼辦法可以解決這個問題嗎?我做錯了嗎?
宏僅使代碼更易讀;他們不會做任何事情,但用另一個詞替換int 80。我還沒有完成閱讀,但它看起來像美麗的幫助! – nmagerko
好的,所以我看到你說的所有評論,但現在我只是修復它們。你的猜測是正確的,我改變了它。以防萬一。我相信,我的問題是進一步下降。爲什麼當我彈出輸入的第一個字符串的長度時,兩個輸入都有問題(帶間距)?部分單詞在第二個中被切碎,第一個單詞後面有一個巨大的空間 – nmagerko
查看更新後的答案。如果你推一個值X然後推另一個值Y,第一個彈出的值將是Y(不是X)。 –