2014-10-04 28 views
0

我是編程裝配新手。現在我正在嘗試編寫一個將數字從小數轉換爲二進制的程序,但是我遇到了一個問題。在用戶輸入數字(從0到65535)之後,我必須將它從ascii字符轉換爲ascii整數,我可以開始從十進制轉換爲二進制。如果它是一個數字(從0到9)我想我可以很容易地通過寫作這樣做:裝配編程

 SUB ax, 48 

但這將通過輸入一個數... 我怎麼能轉換成ASCII整數類型的數只工作如果數字更高?我想過將字符串分隔成字符,但我不知道如何做到這一點。

這是我已經寫我的計劃的一部分:

.MODEL small 
    .Stack 100h 

    .DATA 
    msg1 db 'input decimal number from from 0 to 65535: $' 
    msg2 db 0Dh,0Ah,'number in binary: $' 
    number db 255, ?, 256 dup ('$') 

    .CODE 
    start: 
    mov ax, @data 
    mov ds,ax 
    mov dx, offset msg1 
    mov ah,09h 
    int 21h 
    mov ah, 0Ah 
    mov dx, offset number 
    int 21h 


    mov ax,04C00h 
    int 21h 

end start 
+0

什麼是「十進制數」?什麼是「二進制數」?你手上的手指數是十進制還是二進制? – 2014-10-04 16:28:58

回答

0

你需要爲每個輸入字符的循環。對於每一個,減去獲得0到9之間的整數。要「移動到下一個數字」,您需要將當前值乘以10,然後添加下一個數字。

0

當你輸入號碼或想要打印它,你需要轉換到/從ASCII所以你說得對,減去48

現在,如果用戶輸入類似「123」你不能只是減去。您需要:

  • 分裂成數位
  • 化妝數量再次

現在想想。 「123」居然1*100+2*10+3是這樣的僞代碼將是:

A = readNumber 
exp = 10^A.length 
result = 0 
for i = 0, i < A.length, i++ do 
    result += A[i]*exp 
    exp /= 10 
end 

在彙編語言中它會是這樣的:

mov ah, 0Ah 
mov dx, offset number 
int 21h 

; now number[1] index holds total read characters including RET 
mov cx, number[1] 
dec cx ; we need length without RET 
mov ax, 10 
.makeExponent: 
mul 10 ; MUL multiplies AX with an argument and stores in AX if argument is byte sized 
loop .makeExponent 
; now CX = 0, AX = exponent 
mov dx, ax ; Store exponent in DX 

mov cx, number[1] ;CX = digit count again 
mov si, offset number 
inc si 
inc si ; SI shows into number[0], we need to show for number[2] for the first digit 
cld ; lodsb instruction does INC SI if DF=0. CLD makes DF=0 

xor ax, ax ; AX = 0 
xor bx, bx ; BX = 0, BX will be result 

.decode 
lodsb ;Load value from DS:SI into AL and increment SI 
sub ax, 48 ; ASCII->number 
mul dx  ; Multiply by exponent. Like in 123 case here 1*100, next loop 2*10, then 3*1 
add bx, dx ; Add what we've got to result. For 123 case it's 100+20+3 
mov ax, dx ; DIV and MUL work only for AX, so move exponent to AX 
div 10  ; divide it by 10(100, then 10, then 1) 
xchg dx, ax ; And exchange DX and AX values 
loop .decode 

; BX is your result 

現在我還沒有在彙編語言等等一些東西,而編碼可能會關閉,如: 我假設mul dx在DX中存儲結果的最低位,所以我將DX添加到BX。您可能需要將AX值添加到BX。 DIV也是如此。

xor val, val意味着val = 0.這是很久以前比mov val, 0快現在我只是喜歡它。