如何在 x86 汇编中实现 WriteHexByte?
How to implement WriteHexByte in x86 Assembly?
任何人都可以帮助我理解这些方向吗?我目前正在学习 x86 汇编,但我似乎无法显示我正在寻找的输出。我知道 AL 包含我需要显示的字节..但是考虑到这些要求,我如何才能显示正确的输出:
我在 DH 和 DL 的 WriteChar 上卡住了,因为我使用我的解决方案寻找的输出似乎不正确...我不知道我遗漏了什么。我可以正确初始化 AL 和 DL/DH,但是当我使用 WriteChar 时,它打印出一个完全不同的字符。
- store in the register DH the ASCII code of the most significant nibble.
- store in the register DL the ASCII code of the least significant nibble.
- Display (using WriteChar) on the console the character stored in DH (recall that WriteChar uses
AL for the character to display).
- Display (using WriteChar) on the console the character stored in DL.
- Display ‘h’ to indicate that the number is a hexadecimal number.
- ‘Display’ the ‘line feed’ character (ASCII code is 0Ah) to go to the next line.
- ‘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 ```
任何人都可以帮助我理解这些方向吗?我目前正在学习 x86 汇编,但我似乎无法显示我正在寻找的输出。我知道 AL 包含我需要显示的字节..但是考虑到这些要求,我如何才能显示正确的输出:
我在 DH 和 DL 的 WriteChar 上卡住了,因为我使用我的解决方案寻找的输出似乎不正确...我不知道我遗漏了什么。我可以正确初始化 AL 和 DL/DH,但是当我使用 WriteChar 时,它打印出一个完全不同的字符。
- store in the register DH the ASCII code of the most significant nibble.
- store in the register DL the ASCII code of the least significant nibble.
- Display (using WriteChar) on the console the character stored in DH (recall that WriteChar uses AL for the character to display).
- Display (using WriteChar) on the console the character stored in DL.
- Display ‘h’ to indicate that the number is a hexadecimal number.
- ‘Display’ the ‘line feed’ character (ASCII code is 0Ah) to go to the next line.
- ‘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 ```