"); //-->
首先写一个简单的引导程序{这个程序是从赵炯《linux0.11内核完全剖析》上用AT&T语法改过来的}做实验代码如下:
BOOTSEG = 0x07c0
.code16
.text
.global start
start:
# Normalize the start address
jmpl $BOOTSEG, $start2
start2:
movw %cs, %ax
movw %ax, %ds
movw %ax, %es
movb %ah,(msg+17) #替换字符串中最后一个.符号为系统蜂鸣声
movw $20,%cx #共显示20个字符,包括回车换行符
movw $0x1004,%dx #字符串将显示的位置0x10行0x0x04列
movw $0x00c,%bx #字符显示属性(红色)
movw $msg,%bp #指向要显示的字符串的首址
movw $0x1301,%ax #BIOS中断调用0x10,功能0x13,子功能0x01
int $0x10
loop: jmp loop #死循环
msg: .ascii "loading system..."
.byte 13,10
.org 510
.word 0xAA55
然后写一个Makefile,内容如下:
AS=as
LD=ld
.s.o:
${AS} -a $< -o $*.o >$*.map
final: bootsect
dd if=bootsect of=diska.img count=1
bootsect: bootsect.o
${LD} --oformat binary -N -e start -Ttext 0x0 -o bootsect $<
至于Makefile最后一行上的参数是从这个网站http://en.skelix.org/skelixos/上看到的,少了它还不行:)它上面的解释是:
--oformat 指出要产生的目标的格式;binary的意思是不加任何头结构和其它信息的纯二进制文件,就像DOS下的.com文件。如果没有这个选项ld通常将会把ELF格式做为默认选项(事实上这决定于你的系统和GCC的设置)而这不是我们想要的,这是因为当BIOS加载引导扇区时,并没有任何环境使之能够执行ELF文件.
-N 选项在这里不是必须的,它的作用是使文本段(.text)可读可写 .
-e start 指出代码的入口点.
-Ttext 0x0 指出程序的基址.
make之后,进行bochs,就可以了。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。