2013-10-11 84 views
3

好的,所以我對組裝很新,事實上,我對裝配很陌生。我寫了一段代碼,它只是簡單地將用戶的數字輸入,乘以10,並通過程序退出狀態(通過在終端中輸入echo $?)向用戶表達結果。 問題是,它沒有給出正確的數字,4x10顯示爲144.那麼我認爲輸入可能是一個字符,而不是一個整數。我的問題在於,如何將字符輸入轉換爲整數,以便在算術計算中使用它?NASM Assembly將輸入轉換爲整數?

這將是偉大的,如果有人可以回答記住,我是一個初學者:) 另外,我怎麼能說所有的整數回到一個字符?

section .data 

section .bss 
input resb 4 

section .text 

global _start 
_start: 

mov eax, 3 
mov ebx, 0 
mov ecx, input 
mov edx, 4 
int 0x80 

mov ebx, 10 
imul ebx, ecx 

mov eax, 1 
int 0x80 
+0

我設法比較用戶輸入和數字: mov ecx,dword [input] 這是否實際上將ecx中的值更改爲一個整數? 以及如何將其更改回字符串? – user2862492

回答

7

這裏有一個字符串轉換爲整數,一對夫婦的功能,反之亦然:

; Input: 
; ESI = pointer to the string to convert 
; ECX = number of digits in the string (must be > 0) 
; Output: 
; EAX = integer value 
string_to_int: 
    xor ebx,ebx ; clear ebx 
.next_digit: 
    movzx eax,byte[esi] 
    inc esi 
    sub al,'0' ; convert from ASCII to number 
    imul ebx,10 
    add ebx,eax ; ebx = ebx*10 + eax 
    loop .next_digit ; while (--ecx) 
    mov eax,ebx 
    ret 


; Input: 
; EAX = integer value to convert 
; ESI = pointer to buffer to store the string in (must have room for at least 10 bytes) 
; Output: 
; EAX = pointer to the first character of the generated string 
int_to_string: 
    add esi,9 
    mov byte [esi],STRING_TERMINATOR 

    mov ebx,10   
.next_digit: 
    xor edx,edx   ; Clear edx prior to dividing edx:eax by ebx 
    div ebx    ; eax /= 10 
    add dl,'0'   ; Convert the remainder to ASCII 
    dec esi    ; store characters in reverse order 
    mov [esi],dl 
    test eax,eax    
    jnz .next_digit  ; Repeat until eax==0 
    mov eax,esi 
    ret 

這是你將怎樣使用它們:

STRING_TERMINATOR equ 0 

lea esi,[thestring] 
mov ecx,4 
call string_to_int 
; EAX now contains 1234 

; Convert it back to a string 
lea esi,[buffer] 
call int_to_string 
; You now have a string pointer in EAX, which 
; you can use with the sys_write system call 

thestring: db "1234",0 
buffer: resb 10 

請注意,我不在這些例程中不做太多錯誤檢查(例如檢查是否有'0' - '9'範圍之外的字符)。例程也不處理帶符號的數字。所以如果你需要這些東西,你必須自己添加它們。