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?

+3


source to share


1 answer


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. ”

+4


source







All Articles