我正在使用一个简单的程序集片段,使用BIOS作为引导程序的一部分将字符打印到屏幕上。这是引导加载程序代码。
[org 0x7c00]
[bits 16]
%include "a20_check.asm"
mov ah, 0x0e
mov al, 'H'
int 0x10
times 510 - ($-$$) db 0
dw 0xaa55
这是 a20_check.asm 函数的代码,取自osdev.org。
[bits 16]
; Returns: 0 in ax if the a20 line is disabled (memory wraps around)
; 1 in ax if the a20 line is enabled (memory does not wrap around)
check_a20:
pushf
push ds
push es
push di
push si
cli
xor ax, ax ; ax = 0
mov es, ax
not ax ; ax = 0xFFFF
mov ds, ax
mov di, 0x0500
mov si, 0x0510
mov al, byte [es:di]
push ax
mov al, byte [ds:si]
push ax
mov byte [es:di], 0x00
mov byte [ds:si], 0xFF
cmp byte [es:di], 0xFF
pop ax
mov byte [ds:si], al
pop ax
mov byte [es:di], al
mov ax, 0
je check_a20__exit
mov ax, 1
check_a20__exit:
pop si
pop di
pop es
pop ds
popf
ret
问题似乎出现在最后一个标签 check_a20__exit 中。如果我注释掉ret
,则该字符将打印到屏幕上。否则,它不会打印。
有人可以向我解释这个问题吗?
答案 0 :(得分:4)
如果您考虑自己对故障排除的描述,然后看看您是如何包含代码的,那么问题应该是显而易见的。
ret
显然,ret
将尝试使用当前SP
处的任何内容并在那里切换执行路径......但是你从未调用任何东西,因此数据只是垃圾。 / p>
删除ret
可让它“落入”您的打印代码。