免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1477 | 回复: 1
打印 上一主题 下一主题

请大家指教bootsect跳转出错的问题!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-27 09:31 |只看该作者 |倒序浏览
/*
*        以下的代码其实是从linux2.4的i386的bootsect.s中取出的片段,要实现的功能是将它自己人0x07c00移动到0x90000,
*我的想法是在经过ljmp        $INITSEG, $go 后在打印一个字符串,确定移动工作是成功的,但是实际上,加上这句后机器就
*一直不动了,就如同运行了 jmp  . 一样.但是如果不要ljmp        $INITSEG, $go 却是正确的,可以打印出字串.
*
*我找了很久都没有找到问题,我想是不是我的Makefile 有问题呢,也或者我编译方法不对?
现在将我的代码和makefile都列出来,请知道问题的仁兄帮忙解答!!!先谢谢了
*/

SETUPSECS        = 4                        /* default nr of setup-sectors */
BOOTSEG                = 0x07C0                /* original address of boot-sector */
INITSEG                = 0x9000                /* we move boot here - out of the way */
SETUPSEG        = 0x9020                /* setup starts here */

.code16
.text

.global _start
_start:
        movw        $BOOTSEG, %ax
        movw        %ax, %ds
        movw        $INITSEG, %ax
        movw        %ax, %es
        movw        $256, %cx
        subw        %si, %si
        subw        %di, %di
        cld
        rep
        movsw
        /***************加上下面这句,就出问题了******************/
        ljmp        $INITSEG, $go

go:       
       
        movw        $0x4000-12, %di                # 0x4000 is an arbitrary value >=
                                        # length of bootsect + length of
                                        # setup + room for stack;
                                        # 12 is disk parm size.
        movw        %ax, %ds                # ax and es already contain INITSEG
        movw        %ax, %ss
        movw        %di, %sp                # put stack at INITSEG:0x4000-12.
       
        /*以下找码打印字符串*/
       
        movw         $msg,%ax
        movw         %ax,%bp
        movw         $33 ,%cx
        movw         $0x1301,%ax
        movw         $0x00c,%bx
        movb         $0,%dl
        int         $0x10
        ljmp        $0xf000,$0xfff0
        jmp        .

msg: .asciz "MMOS is named after my little son"
.org 510
boot_flag:        .word 0xAA55

/*************以写是Makefile******************************************/
CC =gcc
LD =ld
OBJCOPY =objcopy

all: mmos.img clean


mmos.img: bootsect.bin
        @dd if=bootsect.bin of=mmos.img bs=512 count=1
        @dd if=/dev/zero of=mmos.img skip=1 seek=1 bs=512 count=2879
bootsect.bin:bootsect.s
        $(CC) -c -g bootsect.s  
        $(LD) bootsect.o -o bootsect.elf -e c -Tboot_x86.ld
        @$(OBJCOPY) -R .pdr -R .comment -R .note -S -O binary bootsect.elf bootsect.bin

clean:
        @rm -rf *~ *.o *.elf *.bin
cleanall:
         @rm -rf *.img
/******************以下是连接脚本文件*****************************************/
SECTIONS
{
        . =0x7c00;
        .text :
        {
        _ftext = .;
        } = 0

}

论坛徽章:
0
2 [报告]
发表于 2008-07-01 08:51 |只看该作者
我看是没人可以帮忙或者说没有人愿意帮忙了,还是我自己来解决它吧:  这个问题不是代码问题,而是由于编译使用的命令不对,在用AS编成obj文件之后,就可以真接用objcopy进行处理了,不需要LD.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP