2014-03-28 71 views
-1

所以,我有一個更復雜的問題來解決整體問題,但目前我無法添加兩個數字。我知道'add'命令。當你只是將一個整數添加到一個寄存器賦值時,它會很好用。當從內存中添加兩個數字時,它們最初是字符串,這需要在轉換爲整數之前(這是我的猜測)。任何幫助?NASM:添加存儲在內存中的兩個數字

SECTION .data 
    msg1 db 'Enter 2 numbers:', 0Ah 
    msg2 db 'You entered:', 0Ah 
    msg3 db 'Sum: ' 

SECTION .bss 
one: resb 4 
two: resb 4 
sum: resb 4 


SECTION .text 
global _start 

_start: 

mov eax, 4 
mov ebx, 1 
mov ecx, msg1 
mov edx, 32 
int 80h 

mov eax, 3 
mov ebx, 0 
mov ecx, one 
mov edx, 4 
int 80h 

mov eax, 3 
mov ebx, 0 
mov ecx, two 
mov edx, 4 
int 80h 

mov eax, 4 
mov ebx, 1 
mov ecx, msg2 
mov edx, 39 
int 80h 

mov eax, 4 
mov ebx, 1 
mov ecx, one 
mov edx, 4 
int 80h 

mov eax, 4 
mov ebx, 1 
mov ecx, two 
mov edx, 4 
int 80h 

mov eax, 4 
mov ebx, 1 
mov ecx, sum 
mov edx, 4 
int 80h 

mov eax, 1 
mov ebx, 0 
int 80h 
+0

是的,這是正確的。你有沒有嘗試過任何解析字符串? – Guffa

回答

1

通過我的理解你的問題,你正在閱讀兩個代表數字的字符串,並且你想要添加這些數字。

你說得對,最初你沒有數字,而是字符串。如果您想要添加字符串表示的數字,您應該首先找到一種將字符串轉換爲您使用的通常數字表示的方法。

有幾種可能性。 你可以使用庫函數,例如strtol(你應該喜歡那個庫)。你應該用字符串作爲參數來調用這個函數,它會爲你完成這項工作。您將在eax寄存器中獲得結果。

如果你想獲得更大的教育價值,你可能想自己計算一下數字。這並不難,我真的建議一輩子至少做一次。

首先存在基本問題。您可能會認爲您收到的號碼是以10爲基數。您還需要將每個ASCII碼轉換爲其值。在這種情況下,你可以減去0x30或'0'。例如,你得到的數字是a_0,a_1,a_2,a_3(減去0x30後),那麼你必須計算它爲1 * a_0 + 10 * a_1 + 100 * a_2 + 1000 * a_3。創建一個可以做到這一點的循環。你得到的結果是實際的數字。

但請注意,當您要將數字打印回控制檯時,您可能必須執行相反的基本翻譯。 對於另一種情況,您應該重複劃分並使用模10來獲取基數爲10的數字。最後,您應該將0x30添加到所有基數爲10的數字中,並打印這些字符。

祝你好運:)

相關問題