BIOS build error BIOS not working
I am working with a simple assembly snippet to print a character to the screen using BIOS as part of the bootloader. Here is the bootloader code.
[org 0x7c00]
[bits 16]
%include "a20_check.asm"
mov ah, 0x0e
mov al, 'H'
int 0x10
times 510 - ($-$$) db 0
dw 0xaa55
This is the code for the a20_check.asm function, taken from 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
The problem is with the last check_a20__exit label. If I comment ret
, then the character is printing on the screen. Otherwise, it doesn't print.
Can someone explain this problem to me?
source to share
If you think about your own description of your troubleshooter, then look at how you included the code, it should be obvious what the problem is.
- First, you include your code to validate line A20
- This code ends with
ret
- Next, we will find the code that prints the character on the screen
- Finally, we have a zero padding
Obviously it ret
will try to use whatever is currently in SP
and switch the execution path there ... but you never called anything, so the data is just garbage.
Removal ret
allows you to "fall through" your print code. In the meantime, there is no need to know about it. ”
source to share