我只是想學習nasm中的乘法和除法,并一直在嘗試使用用戶輸入,但它對我來說并不奏效。我只是想把2*3/2相乘,所以我的輸入是2 3 2,但它列印出一個ascii空白字符。我猜想它是通過加減'0'來把ascii變成ints的?我應該在哪里加'0'或者加'0',為什么?
segment .data
段落 .bss
;定義所有的變數
num1 resb 2 ;num1 2位元組
num2 resb 2 ;nums2 2位元組
num3 resb 2 ;num2 2位元組
;結果
resb 1
.text部分
全域_start ;使用gcc時必須宣告。
_start: ;告訴聯結器入口點
;讀取數字1
mov eax, 3 ;讀取
mov ebx, 0 ;輸入
mov ecx, num1 ;變數
mov edx, 2; bytes
int 0x80 ;結束
;讀取num2
mov eax, 3 ;讀
mov ebx, 0 ;輸入
mov ecx, num2 ;變數
mov edx, 2; bytes
int 0x80 ;結束
;讀取num 3
mov eax, 3 ;讀
mov ebx, 0 ;輸入
mov ecx, num3 ;變數
mov edx, 2; bytes
int 0x80 ;結束
;并減去ascii'0',將其轉換為十進制數字
;移動下半部分的變數
mov ax, [num1]
sub ax, '0
mov bx, [num2]
sub bx, '0
;將al和bl相乘
mul bx
子ax, '0
mov cx, [num3].
子cx, '0
;除以ax/cx
除以cx
加上ax,'0
mov [res], ax
mov ebx,1 ;檔案描述符(stdout)。
mov eax,4 ;系統呼叫號(sys_write)
int 0x80 ;呼叫內核
mov ecx,res
mov edx, 1
mov ebx,1 ;檔案描述符(stdout)
mov eax,4 ;系統呼叫號(sys_write)
int 0x80 ;呼叫內核
mov eax,1 ;系統呼叫號碼(sys_exit)
int 0x80 ;呼叫內核
退出。
mov eax, 1
int 0x80
但是我的輸出總是?或者什么都沒有。難道我只是在數字上加了'0'或減了'0'的錯誤嗎?
uj5u.com熱心網友回復:
我只是想把2*3/2相乘,所以我的輸入是2 3 2
。
因為你使用的是這些小的個位數,所以計算可以保持非常簡單。
然而,你似乎在尊重事物的尺寸方面有問題。我在回答你之前的問題時已經告訴你了。個位數的數字要存盤在位元組大小的暫存器中,位元組大小的結果必須用位元組大小的操作寫入位元組大小的res變數中。
mov al, [num1].
sub al, '0' ; 從字符到數字的轉換
mov bl, [num2]
sub bl, '0' ; 從字符到數字的轉換
當你說 "乘以al和bl "時,那么你為什么要執行mul bx,將AX與BX相乘?
mul bl ; 產品在AX中
在這一點上,你仍然需要對數字進行除法,所以你還不應該用那個sub ax, '0'進行任何轉換。
mov cl, [num3].
sub cl, '0' ; 從字符到數字的轉換
同樣,"除以ax/cx "需要清除DX,但更重要的是,你實際上需要在這里進行位元組大小的除法:
div cl ; ; '0';
"除以ax/cx "需要清除DX。
div cl ; AX除以CL,產生的商為AL
add al, '0' ; 從數字轉換為字符。
mov [res], al ; 存盤單個字符,所以使用位元組大小的操作。
mov ebx,1 ;檔案描述符(stdout) mov eax,4 ;系統呼叫號碼(sys_write) int 0x80 ;呼叫內核
這幾行是多余的,可以解釋看到顯示的?,因為ECX和EDX在這一點上沒有設定。
要從字符轉換為數字,你要減去48。 要從數字轉換為字符,你要加48.
"0 "的ASCII碼是48,所以減去48就得到了數字0
。
...
9 "的ASCII碼是57,所以減去48會產生數字9
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320400.html
標籤:
上一篇:如何為8位計算機設定跳轉條件?
下一篇:有辦法再重復一次嗎?
