2012-02-26 99 views
2

對先前問題的後續處理。我正在嘗試在x86中編寫兩個過程。一個過程讀取特定基礎中的整數(ReadInteger),然後將其寫入(WriteInteger)到另一個基礎中。我正在掙扎的地方比解決方案更接近實際的代碼。x86彙編轉換基數

首先,ReadInteger可以從任何基數(例如1234,基數5)中取一個數字。然後WriteInteger必須能夠在eax中獲取該整數並在bl中獲得一個新的基本值並將其轉換爲新的基礎。我在問什麼是需要將ReadInteger過程或其他過程中的所有內容轉換爲公共基礎(如十進制),然後將其轉換,因爲我只能在WriteInteger中獲取整數和新的基本值?有沒有另一種方法我錯過了?我似乎無法想出任何其他方式來做到這一點,但作業看起來應該比這更簡單。

這是我的代碼到目前爲止。

;----------------------------------------------------- 
ReadInteger PROC 
; 
; ReadInteger is passed one argument in bl representing the base of the number to be input. 
; Receives: bl register (original base) 
; Returns: EAX 
;----------------------------------------------------- 
nextChar: 
    mov edx, 0    ; prepare for divide 
    mov base, ebx 
    call ReadChar   ; Get the next keypress 
    call WriteChar   ; repeat keypress 
    call AsciiToDigit  
    div base 
    shl ebx,1   ; shift to make room for new bit 
    or ebx,base   ; set the bit to eax 
    cmp al, 13    ; check for enter key 
    jne nextChar 
    mov eax, ebx   ; place integer value in eax for return 
    ret 
ReadInteger ENDP 

;----------------------------------------------------- 
WriteInteger PROC 
; 
; Will display a value in a specified base 
; Receives: EAX register (integer), bl (new base) 
; Returns: nothing 
;----------------------------------------------------- 

    mov ecx, 0   ; count the digits 
nextDigit: 
    mov edx, 0   ; prepare unsigned for divide 
    div ebx 
    push edx   ; remainder will be in dl 
    inc ecx   ; count it! 
    cmp eax, 0   ; done when eax becomes 0 
    jne nextDigit 

          ; pop them off and convert to ASCII for output 
outDigit: 
    pop eax    ; digits come off left to right 
    add eax, '0'   ; add 0 to get ASCII 
    call WriteChar   
    loop outDigit   

    call Crlf 
    ret 


ret 

WriteInteger ENDP

+2

爲什麼不先弄清楚如何用高級語言來做到這一點? x86彙編程序不是一種很好的語言,可以用它對數學算法進行原型設計 – 2012-02-26 03:46:15

回答

0

號寄存器沒有一個特定的 「基地」,他們只是二進制數字。基地是人類用來使數字更具可讀性的東西。這意味着「基礎」的概念僅適用於輸入和輸出,機器內部沒有任何內容。 (有許多奇怪的例外,比如你最終可能遇到的BCD,但不是今天。)

因此,你的函數用特定的基礎讀取,並用特定的基礎編寫是完全獨立的,唯一需要的信息需要它們之間傳遞的是二進制數本身。

+0

這就是我認爲我錯過的東西。所以這個值以二進制形式存儲在寄存器中,但我仍然需要將它從ASCII字符轉換爲ReadInteger函數中的實際二進制值嗎? – 2012-02-26 03:50:49

+0

這是正確的。 – 2012-02-26 03:51:39