【发布时间】:2015-02-22 13:50:31
【问题描述】:
我实际上想用 nasm 打印 dx 寄存器的内容。因此内容为 16 位十六进制数字,例如 0x12AB。
因此我首先实现了一个能够打印字符串的函数:
print_string:
pusha
mov ah, 0xe
print_character:
mov al, [bx]
inc bx
or al, al
jz print_done
int 0x10
jmp print_character
print_done:
popa
ret
你可以这样使用这个函数:
mov bx, MSG
call print_string
MSG:
db 'Test',0
现在我想要一个函数,将十六进制转换为字符串,以便 print_string 能够打印它。我在想类似的事情:
print_hex:
pusha
mov bx, HEX_OUT
; HEX_OUT is a kind of template string
; now i want to get the hex of dx into this template in order to be able to print it
; However I'm not sure how to manage this
call print_string
popa
ret
HEX_OUT:
db '0x0000', 0
不幸的是,我不确定如何将十六进制从 dx 获取到 bx,分别是 HEX_OUT。有人可以帮助我还是有人有想法?
我想在最后这样使用它:
mov dx, 0x12AA
call print_hex
提前谢谢你!
更新:
如前所述,我可以像这样实现分离和打印:
print_hex:
pusha
mov bx, PREFIX
call print_string
next_character:
mov bx, dx
and bx, 0xf000
shr bx, 4
add bh, 0x30
cmp bh, 0x39
jg add_7
print_character_hex:
mov al, bh
mov ah, 0x0e
int 0x10
shl dx, 4
or dx, dx
jnz next_character
popa
ret
add_7
add bh, 0x7
jmp print_character_hex
PREFIX:
db '0x', 0
我试过这样的方法来用我的函数和缓冲区打印它:
print_hex:
;Added this here
mov cx, HEX_OUT + 2
print_character_hex:
mov [cx], bh
尽管由于“无效的有效地址”而无法组装。我需要做什么才能做到这一点?
【问题讨论】:
-
到目前为止,您尝试过什么将数字拆分为十六进制数字? (不包括
print_string子例程的工作;您还不如使用 DOS 函数 09h。) -
您可以通过右移 4 位的倍数并与 0x0F 进行与运算来隔离十六进制数字。然后将该值映射到您放置在字符串缓冲区中的字符。重复直到你覆盖了所有的数字。
-
为了首先分离高半字节(半字节),我们可以使用“rol dx, 4”指令。然后我们可以将最低字节移动到第二个寄存器中,以便将值与 0x0F 进行与运算。现在我们可以通过添加 0x30 将值转换为 ASCII,对于从 10 到 15 的所有数字,我们必须添加数字 7 才能得到字母从 A 到 F。
-
感谢您的回复。到目前为止,我所做的是隔离十六进制数字并将其转换为相应的 ascii 代码。我也可以按数字打印。但是我想使用字符串缓冲区和我的字符串打印功能。现在我无法将 ascii 放入我的缓冲区。你能帮我解决这个问题吗?我已经更新了上面的帖子。
-
好的,我做到了。我不能为此目的使用 cx 。相反,我不得不使用 si 作为索引寄存器。
标签: string assembly printing hex nasm