我正在尝试为我的实模式操作系统编写一个将转储内存的函数。我希望字节 0x0a 显示为“0A”,0xf3 显示为“F3”等等。我编写的代码使用了一个包含“0123456789ABCDEF”的表,并使用单个半字节作为偏移量来查找正确的字符。首先它保存值,它位于al
. 接下来它al
向右移动 4,移除较低的半字节并将较高的半字节向下移动。然后它将表加载到 中di
,然后清零ah
。接下来,它添加ax
以di
找到偏移量。然后它将值移动到di
到 al 中,然后打印出来。然后它遵循相同的步骤,只是它使用低半字节而不是高半字节。但是,当我运行它时,它只会重复打印出“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'
它有什么问题?先感谢您。