2015-03-25 48 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”。

相关问题