如何在 x86 汇编中实现 WriteHexByte?

How to implement WriteHexByte in x86 Assembly?

任何人都可以帮助我理解这些方向吗?我目前正在学习 x86 汇编,但我似乎无法显示我正在寻找的输出。我知道 AL 包含我需要显示的字节..但是考虑到这些要求,我如何才能显示正确的输出:

我在 DH 和 DL 的 WriteChar 上卡住了,因为我使用我的解决方案寻找的输出似乎不正确...我不知道我遗漏了什么。我可以正确初始化 AL 和 DL/DH,但是当我使用 WriteChar 时,它打印出一个完全不同的字符。

  1. store in the register DH the ASCII code of the most significant nibble.
  2. store in the register DL the ASCII code of the least significant nibble.
  3. Display (using WriteChar) on the console the character stored in DH (recall that WriteChar uses AL for the character to display).
  4. Display (using WriteChar) on the console the character stored in DL.
  5. Display ‘h’ to indicate that the number is a hexadecimal number.
  6. ‘Display’ the ‘line feed’ character (ASCII code is 0Ah) to go to the next line.
  7. ‘Display’ the ‘carriage’ character (ASCII code is 0Dh) to go to the next line.

这是一个例子,下面是我目前所拥有的...

示例:如果 AL 包含数字 94h,您的程序 1) 必须在 DH 中存储 39h(字符 '9' 的 ASCII 码),2) 必须存储 34h ( DL中字符'4')的ASCII码,3)必须显示字符'9'、'4'、'h'、'linefeed'、'carriage return'。

代码尝试:

INCLUDE Irvine32.inc
.data 
   myHex BYTE "h", 0 
.code
ExerciseTwo proc
   MOV EAX, 0
   MOV AL, 94h
   CALL WriteChar
   MOV DH, AL
   SHR DX, 4
   SHR DL, 4 
   
   MOV EDX, OFFSET myHex
   CALL WriteString
   
   invoke ExitProcess, 0 
ExerciseTwo endp 
end ExerciseTwo

从数字 0 到 9 的十六进制转换涉及添加 48 以得到“0”到“9”
从数字 10 到 15 的十六进制转换涉及添加 55 (48 + 7) 以获得“A”到“F”

INCLUDE Irvine32.inc
.data 
   myHex BYTE "h", 10, 13, 0      ; include 10 and 13 here
.code
ExerciseTwo proc
   mov  eax, 94h                  ; in 1 instruction
   MOV  DH, AL
   SHR  DX, 4
   SHR  DL, 4 

   mov  al, dh
   call WriteHexDigit             ; use subroutines to not repeat yourself
   mov  al, dl
   call WriteHexDigit

   MOV  EDX, OFFSET myHex
   CALL WriteString
   invoke ExitProcess, 0 

WriteHexDigit:
   add al, '0'                    ; operations on AL use shorter encodings
   cmp al, '9'
   jbe ok1
   add al, 7
 ok1:
   jmp WriteChar                  ; tail-call replaced by jump

ExerciseTwo endp ```