原创 在linux下使用bochs+gcc+AT&T试验引导程序

2009-4-3 22:40 3574 5 6 分类: MCU/ 嵌入式
首先写一个简单的引导程序{这个程序是从赵炯《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,就可以了。


PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-3-1 19:12

找了6个小时,终于找到这里来了,谢谢楼主拉!!!!!

相关推荐阅读
用户202313 2009-04-22 16:15
x86的可屏蔽中断和不可屏蔽中断
下面是从CSDN论坛问题回答中摘录的:软中断和硬中断  1.软中断,也称内中断,是由执行某些指令引起的       软中断,一般是由下列这4种情况引发的:         1):DIV或IDIV...
用户202313 2009-04-03 20:55
Fedora 10 下安装as86
rpm包:dev86-0.16.3-8.i386. rpm在google中搜索即可,下载并安装...
用户202313 2009-03-09 22:07
x86体系结构--标志寄存器EFLAGS
TF(Trap Flag)——位8,跟踪标志。置1 则开启单步执行调试模式,置0 则关闭。在单步执行模式下,处理器在每条指令后产生一个调试异常,这样在每条指令执行后都可以查看执行程序的状态。如果程序用...
我要评论
1
5
关闭 站长推荐上一条 /3 下一条