簡體   English   中英

x86算術(add / sub / mul / div)超過一位

[英]x86 arithmetic (add/sub/mul/div) more than one digit

所以我有這段代碼(x86匯編語言)用於求解基本算術方程,但是我的問題是我只能輸入1位數字。 另外,答案只能在1到9之間。 我想要一個能夠接受兩個或多個數字的代碼。 這是添加的工作示例代碼。

jmp start
msg1 db 0ah,0dh, "Enter first number: $"
msg2 db 0ah,0dh, "Enter second number: $"
msg3 db 0ah,0dh, "Sum: $"
ans db ?, " $"
num1 db ?
num2 db ?

start:
mov ah, 0
mov al, 3
int 10h
mov ah, 06
mov al,0
int 10h

mov ah, 09h
lea dx, msg1
int 21h

mov ah, 01h
int 21h
sub al, 30h
mov num1, al

mov ah, 09h
lea dx, msg2
int 21h

mov ah, 01h
int 21h
sub al, 30h
mov num2, al

mov al, num1
add al,num2
add al, 30h
mov ans, al

mov ah, 09h
lea dx, msg3
int 21h

mov ah, 09h
lea dx, ans
int 21h

int 20h

將字符串轉換為整數,進行算術運算,然后將整數轉換回字符串(一次一次打印一位,或者打印到緩沖區中再打印)。

這些都不是特定於x86 asm或用於字符串/字符輸入/輸出的API(在這種情況下,是DOS int 21h系統調用)。 正是您在C中的做法。我實際上建議您使用C標准庫進行轉換,除非您想自己編寫strtol和sprintf。


或者,您可以從頭到尾將數據保留為字符串形式,然后進行BCD加進位和子借位。 每個十進制數字存儲在一個單獨的字節中。 在ASM中,這比在C語言中容易,因為C不公開進位標志。 這不是一種好的編程技術,並且會導致代碼變慢。

如果要執行任意精度算術,請以32b或64b二進制整數而不是單個十進制數字的塊形式工作。 或者只是使用gmp,除非您想重新發明輪子作為練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM