我正在用nasm x86匯編代碼撰寫 -_,其中的空白是用戶輸入的。現在我已經有了這樣的代碼,但我需要它讀取下一行,并在那里進行操作。我是匯編新手,我不想使用回圈或指標或任何東西。也許可以用Times的方法? 這是我的代碼:
segment .data
newline db 0xA, 0xD
newlinelen equ $-newline
段落.bss
num1 resb 2
num2 resb 2
num3 resb 2
;num4 resb 2
;num5 resb 2
;num6 resb 2
res resb 1
;res2 resb 1
.text部分
global main ;使用gcc時必須宣告。
main: ;告訴聯結器入口點
;讀取數字1
mov eax, 3
mov ebx, 0
mov ecx, num1
mov edx, 2
int 0x80
;讀取num2
mov eax, 3
mov ebx, 0
mov ecx, num2
mov edx, 2
int 0x80
;讀取num3
mov eax, 3
mov ebx, 0
mov ecx, num3
mov edx, 2
int 0x80
;為下一個公式添加新行
mov edx, newline
mov ecx, newlinelen
mov ebx, 1
mov eax, 4
int 0x80
; 將第一個數字移至eax暫存器,第二個數字移至ebx暫存器
并減去ascii'0',將其轉換為十進制數字
mov eax, [num1]
sub eax, '0
mov ebx, [num2].
sub ebx, '0
mov ecx, [num3].
sub ecx, '0
將ebx加到eax
添加 eax, ebx
; 添加'0',將總和從十進制轉換為ASCII碼
加eax, '0
; 將總和存盤在記憶體位置res
mov [res], eax
;從eax中減去ecx
sub eax, ecx
mov [res], eax
; 列印總和
mov eax, 4
mov ebx, 1
mov ecx, res
mov edx, 1
int 0x80
退出。
int 0x80
我用這個輸入是1 2-1,輸出是2,這是對的。我不需要在4以上的數字或負數上使用它。 我試著用數字4、5、6重復整個程序,但它只給我一個空白的ascii字符作為結果,這是我得到的最接近的結果。
;;new equation?
;讀取數字4
mov eax, 3
mov ebx, 0
mov ecx, num4
mov edx, 2
int 0x80
;讀取數字5
mov eax, 3
mov ebx, 0
mov ecx, num5
mov edx, 2
int 0x80
;讀取數字6
mov eax, 3
mov ebx, 0
mov ecx, num6
mov edx, 2
int 0x80
; 將第一個數字移至eax暫存器,第二個數字移至ebx暫存器
并減去ascii'0',將其轉換為十進制數字
mov eax, [num4]
sub eax, '0
mov ebx, [num5].
sub ebx, '0
mov ecx, [num6]
sub ecx, '0
將ebx加到eax
添加 eax, ebx
; 添加'0',將總和從十進制轉換為ASCII碼
加eax, '0
; 將總和存盤在記憶體位置res
mov [res2], eax
;從eax中減去ecx
sub eax, ecx
mov [res2], eax
; 列印總和
mov eax, 4
mov ebx, 1
mov ecx, res2
mov edx, 1
int 0x80
我也試過用AL替換eax,用AH替換其他方程,但它并不像那樣作業,我也不明白。然后我還試著把每個位元組都變成一個位元組,并把分段符號resb 1放進去,作為 號,這也沒有用。我只想讓它在后面多讀一行。
uj5u.com熱心網友回復:
mov edx, newline mov ecx, newlinelen
你在這里呼叫了暫存器。
mov eax, [num1]. ... mov [res], eax
這些指令之間的所有內容都應該使用位元組大小的暫存器來代替。使用AL, BL, 和CL。目前你正在覆寫不屬于res變數的記憶體!
;添加'0'來將總和從十進制轉換為ASCII碼 添加eax,'0
你應該先做減法,然后轉換回ASCII,接著用mov [res], al在res變數中存盤一次字符。
exit: int 0x80
你的退出缺少eax暫存器中的函式號!
有辦法再重復一次嗎?
有辦法再重復一次嗎?
即使你不喜歡它,回圈是一種方式。times運算子是一個匯編時的功能。你可以把整個事情變成一個宏,并讓它呼叫兩次,但這樣你就可以像現在這樣寫第二次了。
uj5u.com熱心網友回復:
我只是重復了這段代碼,增加了值4、5和6,但把它們放在較高的字符中,而不是放在較低的字符中。還為新的一行增加了一個讀垃圾字符。
segment .data
newline db 0xA, 0xD
newlinelen equ $-newline
段落.bss
定義所有的變數
num1 resb 2
num2 resb 2
num3 resb 2
;下一個方程的變數
num4 resb 2
num5 resb 2
num6 resb 2
;用于垃圾字符的newlin
Newlin resb 1
;結果1和結果2
resb 1
res2 resb 1
.text部分
global main ;使用gcc時必須宣告。
main: ;告訴聯結器入口點
;讀取數字1
mov eax, 3
mov ebx, 0
mov ecx, num1
mov edx, 2
int 0x80
;讀取num2
mov eax, 3
mov ebx, 0
mov ecx, num2
mov edx, 2
int 0x80
;讀取num3
mov eax, 3
mov ebx, 0
mov ecx, num3
mov edx, 2
int 0x80
; 將第一個數字移至eax暫存器,第二個數字移至ebx暫存器
并減去ascii'0',將其轉換為十進制數字
;移動下半部分的變數
mov AL, [num1]
sub AL, '0'
mov BL, [num2]
sub BL, '0
mov CL, [num3]
sub CL, '0
將ebx加到eax
添加AL,BL
; 將總和存盤在記憶體位置res
mov [res], AL
;從eax中減去ecx
sub AL, CL
添加'0',將總和從十進制轉換為ASCII。
添加AL,'0
mov [res], AL
; 列印總和
mov eax, 4
mov ebx, 1
mov ecx, res
mov edx, 1
int 0x80
;為下一個方程添加新行
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, newlinelen
int 0x80
;;新的方程式?
;;跳過垃圾字符
mov eax, 3
mov ebx, 0
mov ecx, newlin
mov edx, 1
int 0x80
;讀取數字4
mov eax, 3
mov ebx, 0
mov ecx, num4
mov edx, 2
int 0x80
;讀取數字5
mov eax, 3
mov ebx, 0
mov ecx, num5
mov edx, 2
int 0x80
;讀取數字6
mov eax, 3
mov ebx, 0
mov ecx, num6
mov edx, 2
int 0x80
; 將第一個數字移至eax暫存器,第二個數字移至ebx暫存器
并減去ascii'0',將其轉換為十進制數字
;移動高半數的變數
mov AH, [newlin]
mov BH, [num4]
sub BH, '0'
mov CH, [num5]
sub CH, '0
mov DH, [num6]
sub DH, '0
將ebx加到eax
添加BH,CH
;從eax中減去ecx
sub BH, DH
; 加'0',將總和從十進制轉換為ASCII碼
添加BH,'0
;將ah移到記憶體位置res 2
mov [res2], BH
列印總和
mov eax, 4
mov ebx, 1
mov ecx, res2
mov edx, 1
int 0x80
退出。
mov eax, 1
int 0x80
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320414.html
標籤:
上一篇:在nasm中先乘后除
