我正試圖實作一個簡單的加法計算器,但我無法將輸入存盤在我的陣列中。我試圖逐個讀取字符,因為我想以后用它來實作我的B編譯器的后端(它有getchar函式,可以從stdin逐個讀取字符)。我的代碼如下:
segment .data
numb db 0, 0, 0, 0
indx db 0
char db '0
newl db 0ah
msg1 DB '輸入一個數字: '.
len1 equ $ - msg1
段落.文本
全域 _start ; 定義了入口點
print: ; push msg; push len
pop eax ; 從堆疊中洗掉呼叫者地址
pop edx ; 獲得長度
pop ecx ; 獲得味精
push eax ; 再次將CA推至堆疊
mov ebx , 01h ; 告訴你這是一個輸出呼叫
mov eax , 04h ; 系統呼叫(寫)。
int 80h ; 呼叫它
ret
getc:; push add; push len
pop eax ; 從堆疊中移除呼叫者地址
pop ecx ; 獲得輸出地址
push eax ; 再次將CA推入堆疊
mov edx , 01h
mov ebx , 00h ; 告訴你這是一個輸入呼叫
mov eax , 03h ; 系統呼叫(讀)。
int 80h ; 呼叫它
回傳
退出。
mov ebx , 0 ; 設定退出代碼
mov eax , 01h ; 系統呼叫(退出)。
int 80h ; 呼叫它
開始。
推送msg1
push len1
呼叫列印
讀。
推送char
呼叫getc
mov eax , numb
添加eax , indx
mov [eax], dword char
inc byte [indx]
mov eax , char
cmp eax , newl
jne read
jmp exit ; 退出程式
現在我只是想存盤輸入,因為我從完整的代碼中得到了segfaults,所以我開始剝離代碼,直到我找到錯誤的原因。
uj5u.com熱心網友回復:
你可能不想在陣列中插入換行,所以從檢查換行開始:
你可能不想在陣列中插入換行。
read:
push char
呼叫getc
mov al, [char]
cmp al, 10
je done
然后在一個地址暫存器中加載位元組大小的索引,記住AL已經包含了資料,所以選擇另一個暫存器而不是EAX。
movzx ebx, byte [indx].
mov [numb ebx], al
inc byte [indx]
jmp read
完成。
jmp exit
也有可能將索引indx定義為一個dword,indx dd 0。然后代碼變成:
讀取。
push char
呼叫getc
mov al, [char]
cmp al, 10
je done
mov ebx, [indx]
mov [numb ebx], al
inc dword [indx]
jmp read
完成。
jmp exit
這里的教訓是,NASM與MASM的不同之處在于你如何尋址記憶體:
MASMmov eax, offset MyVar ; Load address of MyVar
mov eax, MyVar ; 加載存盤在MyVar中的值
NASM
mov eax, MyVar ; 加載MyVar的地址
mov eax, [MyVar] ; 加載存盤在MyVar中的值
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/320404.html
標籤:
下一篇:用Javascript轉換影片
