不要理解这段代码(汇编)

时间:2015-12-25 08:06:34

标签: assembly tasm

我的装配老师没有解释得那么好,所以我不知道如何读取一个字符并从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

1 个答案:

答案 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 , "