Как правильно найти переменную в сборке AT & T?
Я тренируюсь, чтобы написать загрузчик с использованием ассемблера (в синтаксисе 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