
Writing Boot Sector Code (2007) - mycask
https://susam.in/blog/writing-boot-sector-code/
======
userbinator
_At the time of this writing, most such code examples available on the web
were meant for the Netwide Assembler (NASM). Very little material was
available that could be tried with the readily available GNU tools like the
GNU assembler (as)_

That's largely because no one wants to use GNU/AT&T assembler syntax. In the
official Intel syntax, the important 4 lines of code would be more like

    
    
        mov ax, 0b800h  ; ax = b800
        mov ds, ax      ; ds = ax
        mov byte ptr [0], 'A' ; ds:[0] = 'A'
        mov byte ptr [1], 1eh ; ds:[1] = 1e
    

...and I immediately feel compelled to optimise it to (186+)

    
    
        push 0b800h
        pop ds
        mov word ptr [0], 1e41h
    

Also, especially with newer CPUs and on a laptop, it's a good idea to put a
HLT in the infinite loop, like so:

    
    
        idle:
            hlt
            jmp idle
    

A halt causes the CPU to spend most of the time waiting for an interrupt,
instead of spinning in a tight loop and wasting far more power than necessary.

~~~
rusini
> no one wants to use GNU/AT&T assembler syntax

I am the one who enjoyed using AT&T syntax. It remainded me old-days PDP-11
assembler.

------
leo89
This is an obsolete way to do that. In UEFI you don't need to play with
assembly, look:

[https://www.rodsbooks.com/efi-
programming/hello.html](https://www.rodsbooks.com/efi-programming/hello.html)

~~~
drudru11
I agree UEFI is the way to go. Just curious, how do people debug their
programs though? Older non-pc systems had really decent debuggers built in.

~~~
leo89
There are couple ways. You can compile UEFI for QEMU (OVMF package or possibly
compile coreboot with Tianocore payload). Another way is just output. UEFI
gives you shell, so you can see output and in UEFI it's much easier to deal
with this stuff.

If you use coreboot and libpayload it's much easier because it offers you
built-in GDB server you can connect to via serial port.

------
non-entity
Boot sector programming has always seemed like ln of the cooler ways to play
with writing lower level code,but am I wrong to assume it won't work on
systems with UEFI?

~~~
frutiger
That's correct. UEFI firmware will execute a PE image (the same format that
Windows executables use) on a FAT32 file system, and can access UEFI services
to execute a kernel.

EDIT: as pointed out by a sibling comment, the UEFI firmware may support a CSM
(compatibility support module) that can boot a legacy BIOS loader.

