程序集BIOS调用不起作用

时间:2017-07-12 16:13:31

标签: assembly x86 bootloader bios x86-16

我正在使用一个简单的程序集片段,使用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,则该字符将打印到屏幕上。否则,它不会打印。

有人可以向我解释这个问题吗?

1 个答案:

答案 0 :(得分:4)

如果您考虑自己对故障排除的描述,然后看看您是如何包含代码的,那么问题应该是显而易见的。

  • 首先,您包含用于检查A20行的代码
  • 该代码以ret
  • 结尾
  • 接下来,我们找到在屏幕上打印字符的代码
  • 最后我们有空填充

显然,ret将尝试使用当前SP处的任何内容并在那里切换执行路径......但是你从未调用任何东西,因此数据只是垃圾。 / p>

删除ret可让它“落入”您的打印代码。