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

发布于 2022-10-15 07:36:47 字数 2924 浏览 20 评论 0

看了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 ...,请大家看下是哪里的问题,谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文