当前位置:  技术问答>linux和unix

linux环境下修改linux0.11 bootsect.s并用qemu运行的问题

    来源: 互联网  发布时间:2016-11-28

    本文导语:  看了bootsect.s,我想在linux下直接编译,并用qemu 模拟器运行,但是有问题,我将代码最简化,发现可能是段间跳转和ds,es寄存器设置的问题,请帮忙看下是哪里不对,谢谢了,问题描述如下: bootsect.s的代码: .set BOOT...

看了bootsect.s,我想在linux下直接编译,并用qemu 模拟器运行,但是有问题,我将代码最简化,发现可能是段间跳转和ds,es寄存器设置的问题,请帮忙看下是哪里不对,谢谢了,问题描述如下:
bootsect.s的代码:
.set BOOTSEG, 0x07c0
.set INITSEG, 0x9000

.globl start
start:
.code16

# print some inane message
   movw $0x0300,%ax                        #read cursor position
   xorb %bh,%bh
   int $0x10

   movw $28,%cx
   movw $0x0004,%bx
   movw $msg,%bp
   movw $0x1301,%ax                          # write string and move cursor
   int $0x10

# mov this sector to 0x9000 and then jmp to next instruction
   movw $BOOTSEG, %ax
   movw %ax, %ds              # source addr ds:si
   movw $INITSEG, %ax
   movw %ax, %es              # dest addr es:di
   xorw %si, %si
   xorw %di, %di
   movw $256, %cx             # 256 *2 = 512 bytes
   rep
   movsw
   ljmp  $INITSEG, $go

go:
   movw $0x0300,%ax                        #read cursor position
   xorb %bh,%bh
   int $0x10

   movw $28,%cx
   movw $0x0004,%bx
   movw $msg,%bp
   movw $0x1301,%ax                          # write string and move cursor
   int $0x10



loop:
   jmp loop

msg:
   .byte 13, 10                        #CR LF carriage returns line feeds
   .ascii "Loading system ... ^_^"
   .byte 13, 10, 13, 10

.org 510
   .word 0xaa55

用了shell脚本来编译make.sh:
as bootsect.s -o bootsect
ld -m elf_i386 -N -e start -Ttext 0x7c00 bootsect -o bootblock
objcopy -S -O binary bootblock
qemu -hda bootblock
问题:我是想显示 Loading system ... 然后将这个启动扇区移动到0x9000处跳到标号go并重新显示Loading system ...以验证移动成功,但是,只能显示第一次的Loading system ...,如果没有中间的那段移动启动扇区的代码,那么能够显示两次Loading system ...,请大家看下是哪里的问题,谢谢:)

|
1. ljmp $INITSEG, $go 执行的时候是jmp far 9000:7c30,问题就来了,只是复制到了0x9000:0处,而9000:7c30处全是0,跳转过去肯定不对了,应该是ljmp $INITSEG, $0x30才对,这里的0x30就是0x7c30-0x7c00得出来的
2. 在做扇区移动的时候es的值被改为了9000,当调用执行int 0x10的时候,es:bp指向的地方是没有数据的,仍然全是0
3. bios 0x10号中断的0x13号功能应该要设置"DH,DL=起始行,列",你的代码里好像没有呢。
PS: 你可以用bochs去debug这个bootsector,问题出在哪里很容易发现的
修改后的代码:

.set BOOTSEG, 0x07c0
.set INITSEG, 0x9000

.globl start
start:
.code16

# print some inane message
  movw $0x0300,%ax #read cursor position
  xorb %bh,%bh
  int $0x10

  movw $28,%cx
  movw $0x0, %dx
  movw $0x0004,%bx
  movw $msg,%bp
  movw $0x1301,%ax # write string and move cursor
  int $0x10

# mov this sector to 0x9000 and then jmp to next instruction
  movw $BOOTSEG, %ax
  movw %ax, %ds # source addr ds:si
  movw $INITSEG, %ax
  movw %ax, %es # dest addr es:di
  xorw %si, %si
  xorw %di, %di
  movw $256, %cx # 256 *2 = 512 bytes
  rep
  movsw
  ljmp $INITSEG, $0x30

go:
  movw $0, %ax
  movw %ax, %es
  movw $0x0300,%ax #read cursor position
  xorb %bh,%bh
  int $0x10
  
  movw $28,%cx
  movw $0x0004,%bx
  movw $0x0100, %dx
  movw $msg,%bp
  movw $0x1301,%ax # write string and move cursor
  int $0x10



loop:
  jmp loop

msg:
  .byte 13, 10 #CR LF carriage returns line feeds
  .ascii "Loading system ... ^_^"
  .byte 13, 10, 13, 10

.org 510
  .word 0xaa55


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 弱弱地问,能否让WINDOWS下自动运行的多媒体光盘在LINUX下也自动运行播放(LINUX下可一看到光盘上文件)
  • 我的linux程序 如何 在pc机器上运行。现在我用arm-linux-g++ 编译后的程序在我的嵌入设备上运行。
  • 程序在windows下用visual运行正常,如何才能在linux下运行??
  • 怎样让linux启动后不运行桌面而是直接运行某个应用程序呢?
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • linux编写一个脚本判断程序是否在运行,如果没运行就重启这个软件。
  • 请问如何让Linux 0.11运行?它运行后是怎样的?谢谢!!
  • 新手提问:grep在linux中运行跟在php运行返回结果不一样
  • Linux开关机时想让脚本运行却运行不了?
  • 谁有linux?帮我用在linux运行两个文件好吗?
  • linux环境下,java程序手工运行不乱码,crontab自动运行就乱码
  • vmware怎么优化?在vmware上装linux运行起来是不是特别慢?我在256内存的p4上安装,运行起来很慢!
  • LINUX 下使用QT开发的程序如何才能让它在没有安装QT的Linux系统下运行?
  • 请问在高版本linux编译链接的程序如何在低版本Linux上运行
  • linux运行级别
  • 我在linux下安装了linux版的realone,但却没法找到如何运行。
  • 在Linux Shell scripts下变量如何取linux的命令运行值
  • 请问如何在linux下运行windows游戏?
  • 在linux中什么叫运行级别
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3