5

メモリ アドレスをバイト文字列に変換するルーチンを作成する必要があります。その文字列は、null で終わる文字列を出力する関数の入力になります (これは既に作成できました)。たとえば、アドレスが 0x1bf9 の場合、「1bf9」というテキストを画面に出力する必要があります。この本はまだ 32 ビット モードにはなっていませんが、そのためにも 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 メモリの場所は、意図した文字列のサイズに対応するために、より大きな数ではなく、1 バイト (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 16 進数の ASCII バイトに変換するには、このページの私の回答をご覧ください:アセンブリ言語で数値を出力しますか?

于 2014-04-06T19:38:32.333 に答える