在x86平台,如果我们的汇编程序比较小,例如只显示一个字符串,则我们用软盘的引导扇区(占一个扇区)就够了;但是我们的程序以后会越写越大,会超出一个扇区的范围(512字节),这时我们就需要改变策略,我们先把程序分成两个部分,第一部分是引导程序,第二部分是我们要真正操作的核心程序。我们把第二部分存到软盘的某个地方,然后通过第一部分的引导程序把第二部分程序加载到内存中运行。这样我们的核心程序就可以写得很大。
我们先把简单的部分说了,也就是第二部分程序,为了方便起见,我们还是现实一个字符串,但是在这里我们开辟1024*2个字节的堆栈空间,这样第二部分程序的大小就远远超出了512个字节。
代码如下
%include "pm.inc"
org 0x7c00
jmp LABEL_BEGIN
;----------------------------------------------------------------------------------------
;GDT table
[SECTION .gdt]
LABEL_GDT: Descriptor 0,
0,
0
LABEL_DESC_DATA: Descriptor 0,
DATA_LEN,
DA_DRW
LABEL_DESC_STACK: Descriptor 0,
STACK_LEN,
DA_DRWA + DA_32
LABEL_DESC_VIDEO: Descriptor
0xB8000, 0xFFFF,
DA_DRW
GDT_LEN equ $ - LABEL_GDT
GDT_PTR dw GDT_LEN - 1
dd LABEL_GDT
;----------------------------------------------------------------------------------------
;Selector
SelectorData equ LABEL_DESC_DATA - LABEL_GDT
SelectorStack equ LABEL_DESC_STACK - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
;----------------------------------------------------------------------------------------
[SECTION .data]
ALIGN 32
[BITS 32]
LABEL_DATA:
SayHelloLily: db "Hello, Lily!"
LilyStringOffset equ SayHelloLily - $$
SayHelloKaito: db "Hello, kaito!"
KaitoStringOffset equ SayHelloKaito - $$
DATA_LEN equ $ - LABEL_DATA - 1
[SECTION .stack]
ALIGN 32
[BITS 32]
LABEL_STACK:
times 1024*2 db 0
STACK_LEN equ $ - LAB