|
就像Linux中的heads.s和system代码的link一样,如何将heads.s连接成代码从地址0开始呢??
(我是说,标号start:后的代码,要从在连接后的文件的1个字节开始)
(用gas,gcc,gld)
我用as86写的demo
-
- entry start
- IDT_Base=512
- start:
- .org 0x00
- mov ax,#0x10
- mov ds,ax
- mov ax,#0xff00
- mov [0x000000],ax
- cmp [0x100000],ax
- je L6
- mov edi,#0x0b8000
- mov esi,#msg
- mov ah,0x0c
- mov ecx,#(msg_end-msg)
- print_str:
- mov al,[esi]
- mov [edi] ,ax
- inc esi
- inc edi
- inc edi
- loop print_str
- lea edx,[intr_svr]
- mov eax,#0x00080000
- mov ax,dx
- mov dx,#0x8e00
- mov edi,#IDT_Base
- ;point to the end of this program.'s next word
- mov ecx,#256
- rp_sidt:
- mov [edi],eax
- mov 4[edi],edx
- add edi,#8
- loop rp_sidt
- lidt [idt_attr]
- Set_up_Stack:
- mov esp,#0x1000
- mov ax,#0x10
- mov ss,ax
- ;mov ax,#0x0d40
- sti
- L6: jmp L6
- .align 8
- intr_svr:
- cli
- mov ax,#0x0d41
- mov [0x0b8320],ax
- mov al,#0x20
- out #0x20,al
- sti
- iretd
- .align 8
- idt_attr:
- .word 256*8-1
- .long IDT_Base
- .org 320
- msg:
- .ascii "Procted Mode"
- msg_end:
- .org 510
- IDT_1:
- .word 0x3040
复制代码
编译后,要用:
as86 -3 -b sec2 demo.asm
dd if=sec2 of=/dev/fd0 ibs=1 count=512 skip=5 obs=512 seek=1写到2 扇区.
大家应当注意到skip=5,也就是as86生成的代码,0代码是从第6个字节开始的。
我用gas重写后,和C代码连接,一样有这个问题。
如果这样,生成elf文件是没有问题的。但要是自已写个操作系统,装载代码就成问题了。 |
|