A toy protect-mode bootloader can display string in real/protect mode of x86.
This commit is contained in:
parent
e2a6da26b1
commit
7d29eb7cf0
12
related_info/lab1/pmbootloader/Makefile
Normal file
12
related_info/lab1/pmbootloader/Makefile
Normal file
@ -0,0 +1,12 @@
|
||||
all:pmboot
|
||||
pmboot.s: pmboot.S
|
||||
gcc -E pmboot.S > pmboot.s
|
||||
pmboot.o: pmboot.s
|
||||
as -o pmboot.o pmboot.s
|
||||
pmboot: pmboot.o
|
||||
ld --oformat binary -N -e start -Ttext 0x7c00 -o pmboot pmboot.o
|
||||
run: pmboot
|
||||
qemu-system-i386 -fda pmboot
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm pmboot.o pmboot pmboot.s
|
81
related_info/lab1/pmbootloader/pmboot.S
Normal file
81
related_info/lab1/pmbootloader/pmboot.S
Normal file
@ -0,0 +1,81 @@
|
||||
#define Descriptor(base,lim,type)\
|
||||
.word lim&0xffff;\
|
||||
.word base&0xffff;\
|
||||
.byte (base>>16)&0xff;\
|
||||
.word ((lim>>8)&0xf00)|(type&0x0f0ff);\
|
||||
.byte ((base>>24)&0xff)
|
||||
|
||||
DA_C = 0x98
|
||||
DA_32 = 0x4000
|
||||
DA_DRW = 0x92
|
||||
|
||||
.text
|
||||
.globl start
|
||||
.code16
|
||||
start:
|
||||
jmpl $0x0, $code
|
||||
|
||||
GDT_START:
|
||||
Descriptor_DUMMY:Descriptor(0x0,0x0,0x0)
|
||||
Descript_CODE32 :Descriptor(0x0,0xffffffff,DA_C+DA_32)
|
||||
Descriptor_VIDEO:Descriptor(0xb8000,0x0ffff,DA_DRW)
|
||||
GDT_END:
|
||||
|
||||
GdtPtr:
|
||||
.word (GDT_END-GDT_START)-1 # so does gdt
|
||||
.long GDT_START # This will be rewrite by code.
|
||||
msg:
|
||||
.string "Hello world!"
|
||||
code:
|
||||
mov %cs,%ax
|
||||
mov %ax,%ds
|
||||
mov %ax,%es
|
||||
mov %ax,%ss
|
||||
mov $0x8000,%sp
|
||||
/*显示HelloWorld字符串*/
|
||||
mov $msg ,%ax
|
||||
mov %ax ,%bp
|
||||
mov $12 ,%cx
|
||||
mov $0x1301,%ax
|
||||
mov $0x000c,%bx
|
||||
mov $0 ,%dl
|
||||
|
||||
int $0x10
|
||||
|
||||
/*加载gdtr即将全局描述符表gdt的首地址和gdt的界限赋给gdtr寄存器*/
|
||||
lgdt GdtPtr
|
||||
|
||||
/*关中断*/
|
||||
cli
|
||||
|
||||
/*打开地址线A20*/
|
||||
inb $0x92,%al
|
||||
or $0x02,%al
|
||||
outb %al,$0x92
|
||||
|
||||
/*设置cr0寄存器,切换到保护模式*/
|
||||
movl %cr0,%eax
|
||||
or $1,%eax
|
||||
movl %eax,%cr0
|
||||
|
||||
|
||||
/*真正进入保护模式,执行此命令后CS=0x8,IP=LABEL_SEG_CODE32的偏移地址*/
|
||||
ljmp $0x8,$(LABEL_SEG_CODE32)
|
||||
/*此时CS:IP=全局描述符表中第1(0x8>>3)项描述符给出的段基址+LABEL_SEG_CODE32的偏移地址*/
|
||||
|
||||
|
||||
LABEL_SEG_CODE32:
|
||||
.align 32
|
||||
.code32
|
||||
movw $0x10,%ax
|
||||
movw %ax,%gs
|
||||
movl $((80*11+79)*2),%edi/*第11行,79列*/
|
||||
movb $0x0c,%ah/*高四位表示黑底,低四位表示红字*/
|
||||
movb $'P',%al/*显示的字符*/
|
||||
movw %ax,%gs:(%edi)
|
||||
|
||||
loop2:
|
||||
jmp loop2
|
||||
|
||||
.org 0x1fe, 0x90
|
||||
.word 0xaa55
|
8
related_info/lab1/pmbootloader/pmboot.md
Normal file
8
related_info/lab1/pmbootloader/pmboot.md
Normal file
@ -0,0 +1,8 @@
|
||||
From http://blog.csdn.net/guocaigao/article/details/8477929
|
||||
|
||||
A toy protect-mode bootloader can display string in real/protect mode of x86.
|
||||
|
||||
Try
|
||||
```
|
||||
make run
|
||||
```
|
Loading…
Reference in New Issue
Block a user