2016-05-02 8 views
0

8086アセンブリでベースコンバータを構築する必要があります。8086アセンブリで文字列を数値に変換する方法は?

ユーザーは彼のベースを選択してから数字を入力する必要があります。 その後、プログラムは彼に3つ以上のベースで彼の番号を表示します[彼は10進数を持っています。 oct、およびbin。

この最初の質問は、私が彼が私に与えた数字を文字列から数字に変換するにはどうすればいいですか?

秒の質問は、どうすれば変換できますか? RCRによって、次にいくつかの変数をadc?

は、ここに私のコードです:

data segment 

    N=8 

     ERROR_STRING_BASE DB ,10,13, "    THIS IS NOT A BASE!",10,13, "    TRY AGINE" ,10,13," $"  
     OPENSTRING DB "      Welcome, to the Base Convertor",10,13,"      Please enter your base to convert  from:",10,13,"     <'H'= Hex, 'D'=Dec, 'O'=oct, 'B'=bin>: $" 

    Hex_string DB "(H)" ,10,13, "$" 
    Octalic_string DB "(O) ",10,13, "$" 
    Binar_string DB "(B)",10,13, "$" 
    Dece_string DB "(D)",10,13, "$" 

    ENTER_STRING DB ,10,13, "  Now, Enter Your Number (Up to 4 digits) ",10,13, "$" 
    Illegal_Number DB ,10,13, "  !!! This number is illegal, lets Start  again" ,10,13,"$" 


    BASED_BUFFER DB N,?,N+1 DUP(0) 
    Number_buffer db N, ? ,N+1 DUP(0) 


    TheBase DB N DUP(0)       
    The_numer DB N DUP(0) 
    The_binNumber DB 16 DUP(0) 
    data ends 

    sseg segment stack 
    dw 128 dup(0) 
    sseg ends 

    code segment 
    assume ss:sseg,cs:code,ds:data 

    start: mov ax,data 
    mov ds,ax 


     MOV DX,OFFSET OPENSTRING ;PUTS THE OPENING SRTING 
     MOV AH,9 
     INT 21H 

    call EnterBase 

    CALL CheckBase 




    HEXBASE: CALL PRINTtheNUMBER 
    MOV DX,OFFSET Hex_string 
    MOV AH,9 
    INT 21h 
    JMP I_have_the_numberH 

    oCTALICbASE: CALL PRINTtheNUMBER 
    MOV DX,OFFSET Octalic_string 
    MOV AH,9 
    INT 21h 
    JMP I_have_the_numberO   

    BINBASE:CALL PRINTtheNUMBER 
    MOV DX,OFFSET Binar_string 
    MOV AH,9 
    INT 21h 
    JMP I_have_the_numberB 

    DECBASE: CALL PRINTtheNUMBER 
    MOV DX,OFFSET Dece_string 
    MOV AH,9 
    INT 21h 
    JMP I_have_the_numberD 





    I_have_the_numberH: CALL BINcalculation 
       CALL OCTcalculation 
       CALL DECcalculation 




    I_have_the_numberO: CALL BINcalculation 
       CALL DECcalculation 
       CALL HEXcalculation 


    I_have_the_numberB: CALL OCTcalculation 
       CALL DECcalculation 
       CALL HEXcalculation 


    I_have_the_numberD: CALL BINcalculation 
       CALL OCTcalculation 
       CALL HEXcalculation 


    exit: mov ax, 4c00h 
     int 21h 



    EnterBase PROC 

    MOV DX,OFFSET BASED_BUFFER ; GETS THE BASE 
    MOV AH,10 
    INT 21H 


    LEA DX,BASED_BUFFER[2] 
    MOV BL,BASED_BUFFER[1] 
    MOV BH,0 
    MOV BASED_BUFFER[BX+2],0 

    LEA SI, BASED_BUFFER[2] 
    XOR CX, CX 
    MOV CL, BASED_BUFFER[1] 

    LEA DI, TheBase 

    LOL_OF_BASE: MOV DL, [SI] 
      MOV [DI], DL 
      INC SI 
      INC DI 
      INC AL 


     RET 


     EnterBase ENDP 



     CheckBase proc 



     CMP TheBase,'H' 
     JE HEXBASE 

     CMP TheBase,'h' 
     JE HEXBASE 


     CMP TheBase,'O' 
     JE oCTALICbASE 

     CMP TheBase,'o' 
     JE oCTALICbASE 

     CMP TheBase,'B' 
     JE BINBASE 

     CMP TheBase,'b' 
     JE BINBASE 

     CMP TheBase,'D' 
     JE DECBASE 

     CMP TheBase,'d' 
     JE DECBASE 
     CMP TheBase, ' ' 
     je ERRORoFBASE 

     ERRORoFBASE: MOV DX,OFFSET ERROR_STRING_BASE ;PUTS WORNG BASE Illegal_Number 
     MOV AH,9 
     INT 21H 
     JMP START  



    CheckBase ENDP 




    PRINTtheNUMBER PROC 


    MOV DX,OFFSET ENTER_STRING 
    MOV AH,9 
    INT 21h 


    MOV DX,OFFSET Number_buffer ; GETS THE number 
    MOV AH,10 
    INT 21H 


    LEA DX,Number_buffer[2] 
    MOV BL,Number_buffer[1] 
    MOV BH,0 
    MOV Number_buffer[BX+2],0 

    LEA SI, Number_buffer[2] 
    XOR CX, CX 
    MOV CL, Number_buffer[1] 

    LEA DI, The_numer 
    xor AL,AL 

    LOL_OF_NUMBER_CHECK: MOV DL, [SI] 
        MOV [DI], DL 
        INC SI 
        INC DI 
        INC AL 
        CMP AL,5 
        JE ERRORofNUMBER 
        LOOP LOL_OF_NUMBER_CHECK 


    RET 

     ERRORofNUMBER: MOV DX,OFFSET Illegal_Number ;PUTS WORNG BASE   Illegal_Number 
     MOV AH,9 
     INT 21H 
     JMP START   

    PRINTtheNUMBER ENDP 








     PROC BINcalculation 
      XOR CX,CX 
      XOR AX,AX 
      MOV CX,4 
      MOV AX,16 
      LEA SI, The_binNumber[0] 
     TheBinarLoop: RCL The_numer,1 
      ADC [SI],0 
      INC SI 
      LOOP TheBinarLoop 

     ENDP 

     PROC OCTcalculation 



     ENDP 

     PROC DECcalculation 

     ENDP 

     PROC HEXcalculation 

     ENDP 

    code ends 

    end start 

それは次のようになり次のようになります。enter image description here

感謝を!

שלולוי

+0

for私は文字列 "The_number"をreall numberに変換したい –

+0

あなたの行: "第二の問題は、どうすれば変換できますか?RCRで、次にadc変数?"非常に不明です!それを改言してください。 –

答えて

2

が整数への任意の塩基からASCII文字列をデコードするalgorighmは同じである:{ビン、10月、12月}値(桁)のため

result = 0 
for each digit in ascii-string 
    result *= base 
    result += value(digit) 

は、ASCII(桁) - であなたが値が 'a' - 'f'であるかどうかをチェックし、これを10-15に変換する必要があります。

整数をascii(base x)に変換します。同様ですが、値が0になるまでベースで除算する必要があります。 EMU8086で左

e.g. 87/8= 10, remainder 7 --> "7" 
    10/8= 1, remainder 2 --> "27" 
     1/8= 0, remainder 1 --> "127" 
0

コピー&ペーストを次の小さなプログラムで、残りのASCII表現を追加し、それを実行します。それは、BXの数値に変換し、キーボードから文字列として番号をキャプチャします。 "The_numer" の数を格納するには、mov The_numer, blをしなければならない:あなたが必要

.stack 100h 
;------------------------------------------ 
.data 
;------------------------------------------ 
msj1 db 'Enter a number: $' 
msj2 db 13,10,'Number has been converted',13,10,13,10,'$' 
string db 5 ;MAX NUMBER OF CHARACTERS ALLOWED (4). 
     db ? ;NUMBER OF CHARACTERS ENTERED BY USER. 
     db 5 dup (?) ;CHARACTERS ENTERED BY USER. 
;------------------------------------------ 
.code   
;INITIALIZE DATA SEGMENT. 
    mov ax, @data 
    mov ds, ax 
;------------------------------------------   
;DISPLAY MESSAGE. 
    mov ah, 9 
    mov dx, offset msj1 
    int 21h 
;------------------------------------------ 
;CAPTURE CHARACTERS (THE NUMBER). 
    mov ah, 0Ah 
    mov dx, offset string 
    int 21h 
;------------------------------------------ 
    call string2number 
;------------------------------------------   
;DISPLAY MESSAGE. 
    mov ah, 9 
    mov dx, offset msj2 
    int 21h 
;------------------------------------------ 
;STOP UNTIL USER PRESS ANY KEY. 
    mov ah,7 
    int 21h 
;------------------------------------------ 
;FINISH THE PROGRAM PROPERLY. 
    mov ax, 4c00h 
    int 21h   
;------------------------------------------ 
;CONVERT STRING TO NUMBER IN BX. 
proc string2number   
;MAKE SI TO POINT TO THE LEAST SIGNIFICANT DIGIT. 
    mov si, offset string + 1 ;<================================ YOU CHANGE THIS VARIABLE. 
    mov cl, [ si ] ;NUMBER OF CHARACTERS ENTERED.           
    mov ch, 0 ;CLEAR CH, NOW CX==CL. 
    add si, cx ;NOW SI POINTS TO LEAST SIGNIFICANT DIGIT. 
;CONVERT STRING. 
    mov bx, 0 
    mov bp, 1 ;MULTIPLE OF 10 TO MULTIPLY EVERY DIGIT. 
repeat:   
;CONVERT CHARACTER.      
    mov al, [ si ] ;CHARACTER TO PROCESS. 
    sub al, 48 ;CONVERT ASCII CHARACTER TO DIGIT. 
    mov ah, 0 ;CLEAR AH, NOW AX==AL. 
    mul bp ;AX*BP = DX:AX. 
    add bx,ax ;ADD RESULT TO BX. 
;INCREASE MULTIPLE OF 10 (1, 10, 100...). 
    mov ax, bp 
    mov bp, 10 
    mul bp ;AX*10 = DX:AX. 
    mov bp, ax ;NEW MULTIPLE OF 10. 
;CHECK IF WE HAVE FINISHED. 
    dec si ;NEXT DIGIT TO PROCESS. 
    loop repeat ;COUNTER CX-1, IF NOT ZERO, REPEAT. 

    ret 
endp  

procはstring2numberです。 procの中で注意を払う:それは "string"という名前の変数を使用するので、あなた自身の変数の名前でそれを変更する必要があります。 callの後に結果がBXにあります。番号が256より小さい場合、番号をBLで使用できます。

ところで、文字列は常にDECIMAL番号に変換されます。

関連する問題