如何将字符串转换为十六进制8086程序集

时间:2015-03-25 10:45:46

标签: assembly x86 hex dos number-formatting

我有一个代码,读取一个包含8个字符的字符串并打印出来 我需要将字符串转换为十六进制,然后打印每个字符的十六进制代码。

到目前为止,这是我的代码:

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 个答案:

答案 0 :(得分: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”。

相关问题