2016-05-02 1 views
0

Je dois construire un convertisseur de base en assemblage 8086. L'utilisateur doit choisir sa base, puis mettre un numéro, après, le programme lui montrera son numéro dans 3 autres bases [il apporte un nombre décimal, et après cela, il verra son numéro en hexadécimal, oct, et bin.Comment faire pour convertir la chaîne en nombre dans l'assemblage 8086?

Cette première question est, comment puis-je convertir le nombre qu'il m'a donné, de la chaîne, à un nombre?

la question sec est, comment puis-je convertir? par RCR, puis adc une variable?

Voici mon code:

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 

Il devrait être ressembler à ceci: enter image description here

merci!

שלו לוי

+0

pour le rendre plus clair, je veux convertir la chaîne "The_number" en un nombre réel –

+0

Votre ligne: "la question sec est, comment puis-je convertir? Par RCR, puis adc une variable?" est très peu clair! S'il vous plaît reformulez-le. –

Répondre

2

le algorighm pour décoder les chaînes de ascii de toute base en entier est le même:

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

pour {bin, oct, déc} valeur (chiffres) est ascii (chiffres) - ascii ('0')
hex est un peu plus compliqué, il faut vérifier si la valeur est 'a' - 'f', et de convertir ce à 10-15

entier conversion en ASCII (base x) est similaire, vous devez diviser la valeur par base jusqu'à 0, et ajouter la représentation ascii du reste à gauche

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

copier-coller prochain petit programme en EMU8086 et l'exécuter: il capture un nombre sous forme de chaîne à partir du clavier, puis le convertir en numérique en BX. Pour enregistrer le numéro dans "The_numer", vous devez faire 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  

Le proc dont vous avez besoin est string2number. Faites attention à l'intérieur du proc: il utilise une variable nommée "string", vous devez le changer par le nom de votre propre variable. Après le call le résultat est en BX: si le nombre est inférieur à 256, vous pouvez utiliser le numéro en BL. Par ailleurs, la chaîne est TOUJOURS convertie en un nombre DECIMAL.