0

メモリをダンプするリアル モード オペレーティング システム用の関数を作成しようとしています。バイト 0x0a を '0A' として表示し、0xf3 を 'F3' として表示するなどを行います。私が書いたコードは、「0123456789ABCDEF」で構成されるテーブルを使用し、個々のニブルをオフセットとして使用して正しい文字を見つけます。最初に、 にある値を保存しますal。次に、4 だけ右にシフトalし、下位ニブルを削除して上位ニブルを下に移動します。次に、テーブルを にロードしdi、ゼロを設定しahます。次に、オフセットを見つけるために を追加axします。di次に、値を移動しますdial に変換して出力します。次に、上位ニブルの代わりに下位ニブルを使用することを除いて、同じ手順に従います。ただし、実行すると、実際の16進数ではなく、「33」が繰り返し出力されるだけです。これが私のコードです:

memdump:            
mov si, 0x7000      ;load si
loop:               
    mov al, [si]        ;put the value at si into al
    call printhex       ;call the hex printer
    inc si          ;increment si
    cmp si, 0x7CFF      ;are we done?
    je done         ;yes, return
    jmp loop        ;loop
printhex:           
    mov al, bl      ;save al
    shr al, 4       ;remove the lower nibble and move the higher nibble down
    mov di,hexbuffer    ;put the hexadecimal buffer in di
    xor ah, ah      ;remove everything from ah
    add di, ax      ;add the address to the buffer
    mov al, [di]        ;move the ascii char into al
    mov ah, 0x0E        ;teletype printing for int 0x10
    int 0x10        ;print the character
    mov bl, al      ;reload al
    shl al, 4       ;remove the high nibble
    shr al, 4       ;move the new high nibble down
    mov di, hexbuffer   ;reload the buffer
    xor ah, ah      ;zero out ah
    add di, ax      ;add the offset
    mov al, [di]        ;transfer the ascii char
    mov ah, 0x0E        ;teletype printing for int 0x10
    int 0x10        ;print the char
    mov al, ' '     ;now print a space
    int 0x10        ;print the space
    ret         ;return
done:               
    ret         ;return to kernel
    hexbuffer db '0123456789ABCDEF'

それの何が問題なのですか?前もって感謝します。

4

2 に答える 2

0

1 つの問題は、mov al, bl; save almov bl, al ; reload alのオペランドが逆になっていることです。

いわゆるオペレーティング システムを既に作成している場合は、自分の間違いを修正できるように、デバッガーに精通している必要があります。

于 2014-03-27T16:16:19.733 に答える
0

EAX の 32 ビット値を 16 進 ASCII の 8 バイトに変換するこのページの例を見てください: アセンブリ言語で数値を出力しますか?

于 2014-04-06T19:20:36.687 に答える