【发布时间】:2015-02-26 11:01:34
【问题描述】:
我正在写一个小引导程序用于学习目的。
这是开机。S
.code16
.text
movw $0xB800, %ax /* 0xB000 is the text screen video memory */
movw %ax, %es /* set it as the %es segment */
movb label, %al
movb %al, %es:0x0 /* screen[0] = 'A' */
movb $0x07, %es:0x1 /* white on black */
jmp .
label:
.byte 'A
.=510
.byte 0x55
.byte 0xAA
这是我用来将其编译为原始二进制文件的 Makefile
hdd.img: boot.S
as $< -o boot.o
ld --oformat binary -Ttext 0x7c00 boot.o -o hdd.img
我面临标签没有相对引用的问题:加载字节'A'时,它使用绝对地址,比如0x7c14)。
所以我不能在运行时重新定位这个引导扇区(例如通过在内存中进一步复制它)。如果标签只是通过当前指令的偏移量来引用会更好。
这样可以吗?
【问题讨论】:
-
您可以将
-Ttext设置为0,并确保从远处跳转到0x7c0:0。然后你可以将你的代码重新定位到任何段。
标签: assembly linker nasm boot gnu-assembler