2016-05-02 58 views
0

我必須在8086程序集中構建一個Base Converter。如何將字符串轉換爲8086程序集中的數字?

用戶必須選擇他的基礎,然後輸入一個數字 然後,程序會在另外3個基地向他顯示他的編號[他帶上一個十進制數,然後他將在十六進制中看到他的編號, 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

爲了讓它更加清晰,我想將字符串「The_number」轉換爲一個真正的號碼 –

+0

您的線路:「第二個問題是,我如何轉換?通過RCR,然後adc一些變量?很不清楚!請重新說明它。 –

回答

2

的algorighm爲ascii字符串從任何鹼解碼爲整數是相同的:

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

爲{料,辛,癸}值(數字)是ascii的(數字) - ascii('0')
十六進制比較複雜一點,你必須檢查值是否爲'a' - 'f',並將其轉換爲10-15

將整數轉換爲ascii(base x)是相似的,你必須除以基數的值,直到它爲0加上其餘的ASCII表示在EMU8086左

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

複製粘貼下一個小程序並運行它:它會捕捉一些從鍵盤字符串,然後將其轉換爲數值的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號碼。

相關問題