Я пишу маленький сапог для обучения.GNU GAS: Ярлык относительно не относится
Вот boot.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'. Затем вы можете переместить свой код в любой сегмент. – Jester