我正在练习使用程序集(在 AT&T 语法和 gnu/gas 中)编写引导程序。小程序组装链接,然后复制到虚拟磁盘的第一个扇区。BIOS 会将其加载到0000:7c00
中,问题就来了。将在运行期间call hello
从 转换call 0010
为call 7c10
。但movw $message, %as
不会搬迁。ax
仍然,0026
不是7c26
。结果是我无法Hello World
在屏幕上显示。0000:0026
相反,屏幕上会显示一些随机数据。
如何在引导期间使其正确?我应该使用某些指令更改 asm 源代码吗?或者我应该更改我的链接脚本?
谢谢!
.text
.global _start
.code16
_start:
movw %cs, %ax
movw %ax, %ds
movw %ax, %es
call hello
jmp .
.org 0x10
hello:
movw $message, %ax
movw %ax, %bp
movw $13, %cx
movw $0x1301, %ax
movw $0x000c, %bx
movb $0, %dl
int $0x10
ret
message:
.ascii "Hello, World!"
.org 0x01fe
.byte 0x55
.byte 0xaa
我使用以下汇编和链接脚本
as -o boot.o boot.s
//generate object code
ld -Ttext 0x0 -e _start -s -o boot.out boot.o
//relocate .text to 0x0
//entry is _start
objcopy -O binary -j .text boot.out boot
//copy .text section to boot
vboxmanage convertfromraw boot boot.vdi --format VDI
//create vdi for virtual box