mbr_asm/Readme.md

86 lines
2.1 KiB
Markdown

# Instruction
Build with
`make`
Run with
`make test`
Debug with
`qemu-system-x86_64 -boot a -fda mbr -s -S`
then
`gdb`
```
target remote localhost:1234
layout asm
b *0x7c00
c
```
# ASM reg
## In 16 bits
There is 4 main 16bits reg: AX, BX, CX, DX.
You can access the 8 MSB from AX with AH and the 8 LSB with AL.( BH,BL, CH, CL)
SI and DI are 16bits index register often used for pointer but can contains data.
SP is stack pointer, BP is base pointer
AX(AH, AL), BX(BH, BL), CX(CH, CL), DX(DH, DL), SI, DI, SP, BP
## In 32bits
Main register are "Extended" to 32bits but 16bits of 8bits direct access is not possible anymore.
EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP
## In 64bits
Prefixed by R
RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP
# Bios Memory
Address range | Description
----------------------- | -----------------------
0x0 - 0x03FF |IVT
0x400 - 0x4FF |BIOS Data
0x500 - 0x7BFF |Unused
0x7C00 - 0x7D77 |Bootloader
0x7E00 - 0x9FFFF |Unused
0xA0000 - 0xBFFFF |Video memory
0xB0000 - 0xB7777 |Video memory monochrome
0xB8000 - 0xBFFFF |Video memory color
0xC0000 - 0xC7FFF |BIOS ROM
0x80000 - 0xEFFFF |BIOS shadow memory
0xF0000 - 0xFFFFF |BIOS System
# Interrupt Vector Table
INT_NUM | Short Description PM
----------- | ----------------------
0x00 | Division by zero
0x01 | Debugger
0x02 | NMI
0x03 | Breakpoint
0x04 | Overflow
0x05 | Bounds
0x06 | Invalid Opcode
0x07 | Coprocessor not available
0x08 | Double fault
0x09 | Coprocessor Segment Overrun (386 or earlier only)
0x0A | Invalid Task State Segment
0x0B | Segment not present
0x0C | Stack Fault
0x0D | General protection fault
0x0E | Page fault
0x0F | reserved
0x10 | Math Fault
0x11 | Alignment Check
0x12 | Machine Check
0x13 | SIMD Floating-Point Exception
0x14 | Virtualisation Exception
0x15 | Control Protection Exception
# BIOS IRQ
https://en.wikipedia.org/wiki/BIOS_interrupt_call