我的装配老师没有解释得那么好,所以我不知道如何读取一个字符并从ASCII表中打印该字符的十六进制数
(例如a-> 61 A-> 41 0-> 30)
但我在stackoverflow上发现了这个
.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
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
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
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
end start
它就像一个魅力,但我不知道为什么。我想告诉我后台会发生什么。我对这部分最感兴趣:ciclo和convert
答案 0 :(得分:1)
您的程序首先通过DOS函数0Ah获取最多9个字符的输入字符串 每个字符由字节大小的值(又称 ASCII )表示。每个字节由8位组成。
ciclo 例程首先取低4位(mov dl,[si]
and dl,00001111h
),然后调用 convert 更改范围内的这个小数字[0-15]变成一个角色。此字符位于预先格式化的输出字符串中的右侧位置(2)。
接下来, ciclo 例程采用高4位(mov dl,[si]
shr dl,4
),然后调用 convert 将此小数字更改为a字符。该字符位于outputstring中的左侧位置(1)。
现在 ciclo 显示此输出字符串,然后准备处理输入字符串中的下一个字符(inc si
loop ciclo
)。
在程序 convert 中,[0-9]范围内的值被转换为字符“0”,“1”,...“9”和值[10-15] ]被转换为字符“A”,“B”,......“F”。
输入字符串为“K”的示例:
ASCII of "K" = 4Bh --> value of low 4 bits = 11 --> character "B" in position 2
; value of high 4 bits = 4 --> character "4" in position 1
; --> display "4B , "