2015-03-25 45 views
-1

我有一個讀取8個字符的字符串並打印它的代碼。
我需要將字符串轉換爲十六進制,然後打印每個字符的十六進制代碼。如何將字符串轉換爲十六進制8086程序集

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

dosseg 
.model small 
.stack 100h 
.data 
texto db "Enter:",13,10,'$' 
maximo db 9 
caractereslidos db 0 
string db 9 DUP (0) 
novalinha db 13,10, '$' 
.code 
start: 
mov AX,@data 
mov DS,AX 

mov AH,9 
lea DX, texto 
int 21h 

mov AH,0Ah 
lea DX,maximo 
int 21h 

mov AH,9 
lea DX,novalinha 
int 21h 

mov CL, caractereslidos 
xor SI,SI 
mov AH,2 

ciclo: 
mov DL, string[SI] 
ADD DL, 30h 
CMP DL, 39h 
int 21h 
inc SI 
loop ciclo 

mov AH,4Ch 
int 21h 
end start 

任何人可以幫助我嗎?

+1

在我的屏幕上,你的問題有一個'相關'問題指向你所尋找的答案:http://stackoverflow.com/questions/10288073/8086-assembly-tasm-displaying-an-ascii-character-value-如己?RQ = 1 – 2015-03-25 11:00:15

回答

0

接下來是您的代碼,稍作修改。分離過程(在底部)將DL轉換爲十六進制。字符已被轉換並顯示在循環中。我用EMU8086,只需複製粘貼下面的代碼並運行:

.model small 
.stack 100h 
.data 

texto db 'Enter: $' 
maximo db 9 
caractereslidos db 0 
string db 9 DUP (0) 
novalinha db 13,10,13,10,'$' 
hex1 db ? ;FIRST HEX DIGIT. 
hex2 db ' , $' ;SECOND HEXT DIGIT. 

.code 
    mov AX, @data 
    mov DS, AX 

    mov AH, 9 
    lea DX, texto 
    int 21h 

    mov AH, 0Ah 
    lea DX, maximo 
    int 21h 

    mov AH, 9 
    lea DX, novalinha 
    int 21h 

    mov CL, caractereslidos 
    mov ch, 0 ;CLEAR CH TO USE CX AS COUNTER. 
    mov SI, offset string 

ciclo:   
;GET ONE CHARACTER FROM STRING. 
    mov DL, [SI] 
;ISOLATE LOWER 4 BITS IN CHARACTER. 
    and DL, 00001111b 
    call convert ;CONVERT DL TO DIGIT OR LETTER. 
    mov hex2, dl ;SAVE CONVERTED CHARACTER TO DISPLAY LATER. 
;GET THE SAME CHARACTER FROM STRING. 
    mov DL, [SI] 
;ISOLATE UPPER 4 BITS IN CHARACTER. 
    shr DL, 4 ;SHIFT DL 4 BITS TO THE RIGHT. 
    call convert ;CONVERT DL TO DIGIT OR LETTER. 
    mov hex1, dl ;SAVE CONVERTED CHARACTER TO DISPLAY LATER. 
;DISPLAY CONVERTED CHARACTER. 
    mov ah, 9 
    mov dx, offset hex1 
    int 21h 

    inc si ;NEXT CHARACTER TO CONVERT. 
    loop ciclo 

    mov AH,4Ch 
    int 21h 
;-------------------------------------------------------- 
;CONVERT DL TO HEX CHARACTER. 
proc convert  
    cmp DL, 9 
    jbe its_a_digit ;JUMP IF (DL <= 9). 
;its_a_letter: IF NO JUMP, STAYS HERE. 
    add dl, 55 ;CONVERT TO LETTER. 
    jmp finish 
its_a_digit: 
    add dl, 48 ;CONVERT TO DIGIT. 
finish: 
    ret 
endp 

例如,如果你輸入「ABC」,程序會顯示「41,61,63」。

相關問題