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