5

我需要制作一个将内存地址转换为字节串的例程。然后该字符串将成为打印以空字符结尾的字符串(我已经能够制作)的函数的输入。例如,如果我有一个地址 0x1bf9,我需要将文本“1bf9”打印到屏幕上。这本书还没有进入 32 位模式,但它暗示我们也需要它。这是我到目前为止所拥有的:

TABLE:
db "0123456789ABCDEF", 0

STRING:
db 0

hex_to_char:
    lea bx, TABLE
    mov ax, dx

    mov ah, al ;make al and ah equal so we can isolate each half of the byte
    shr ah, 4 ;ah now has the high nibble
    and al, 0x0F ;al now has the low nibble
    xlat ;lookup al's contents in our table
    xchg ah, al ;flip around the bytes so now we can get the higher nibble 
    xlat ;look up what we just flipped
    inc STRING
    mov [STRING], ah ;append the new character to a string of bytes
    inc STRING
    mov [STRING], al ;append the new character to the string of bytes

    ret
4

3 回答 3

7

这试图增加文字标签,这是不正确的。此外,您的 STRING 内存位置仅分配一个字节 (char) 而不是更大的数字来容纳您想要的字符串大小。

STRING:
    db 0

    inc STRING   ;THIS WON'T WORK
    mov [STRING], ah ;append the new character to a string of bytes
    inc STRING   ;THIS WON'T WORK
    mov [STRING], al ;append the new character to the string of bytes

中性评论:用于的字符表xlat不需要以零结尾。

此外,我建议保存和恢复一些寄存器作为良好的 asm 编程实践。这样,调用函数就不必担心寄存器在“背后”被更改。最终,你可能想要这样的东西:

TABLE:
    db "0123456789ABCDEF", 0

hex_to_char:
    push bx

    mov   bx, TABLE
    mov   ax, dx

    mov   ah, al            ;make al and ah equal so we can isolate each half of the byte
    shr   ah, 4             ;ah now has the high nibble
    and   al, 0x0F          ;al now has the low nibble
    xlat                    ;lookup al's contents in our table
    xchg  ah, al            ;flip around the bytes so now we can get the higher nibble 
    xlat                    ;look up what we just flipped

    mov   bx, STRING
    xchg  ah, al
    mov   [bx], ax          ;append the new character to the string of bytes

    pop bx
    ret

    section .bss

STRING:
    resb  50                ; reserve 50 bytes for the string

编辑:根据 Peter Cordes 的意见进行一些理想的调整。

于 2013-09-18T18:41:03.907 回答
0

请查看我在此页面上的答案,以将 EAX 中的 32 位值转换为 8 个十六进制 ASCII 字节:Printing out a number in assembly language?

于 2014-04-06T19:38:32.333 回答
0

如果将字节拆分替换为未记录的“AAM 10h”(D4 10),则可以进一步优化此大小。

于 2020-11-10T01:13:42.960 回答