以下源文件分别组装(成原始二进制文件)并分别加载到虚拟软盘的扇区 1 和 2。然后,这张软盘用作 qemu-system-i386 VM 的引导介质。
“引导加载程序”从软盘的第 2 扇区读取“第一个程序”,然后跳转到包含刚刚读取的代码的内存。以下代码按需要工作(即打印“第一个程序”欢迎消息),但我必须ORG 0x001E
在“第一个程序”的源中指定(通过在十六进制编辑器中检查引导加载程序的代码获得)。0x001E 是temp
缓冲区的偏移量,它保存从软盘读取的代码。
“引导程序”:
BITS 16
bootloader_main:
mov bx, 0x07C0 ; Set data segment to bootloader's default segment
mov ds, bx
mov ah, 0x02 ; BIOS int13h "read sector" function
mov al, 1 ; Number of sectors to read
mov cl, 2 ; Sector to read
mov ch, 0 ; Cylinder/track
mov dh, 0 ; Head
mov dl, 0 ; Disk number (here, the floppy disk)
mov bx, 0x07C0 ; Segment containing the destination buffer
mov es, bx
mov bx, temp ; Destination buffer offset
int 0x13
jmp temp
ret
;end bootloader_main
temp: times 60 db 17
times 510-($-$$) db 0 ; Pad rest of sector and add bootloader
dw 0xAA55 signature
“第一个程序”:
BITS 16
ORG 0x001E ; Assume that this code will be located 0x001E bytes
after start of bootloader (in RAM)
mov bx, string ; Print a welcome string
mov ah, 0x0E
print_loop:
mov al, byte [bx]
int 0x10
inc bx
cmp byte [bx], 0
jne print_loop
;end print_loop
string: db "This is the first program.", 0
或者,我可以使用ORG 0x200
and0x200
代替缓冲区temp
(即在引导加载程序之后将程序加载到 RAM 中),但是在创建有用的操作系统时,这些黑客似乎都不可持续。如何避免这种地址硬编码?