Как правильно найти переменную в сборке 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

Ответы на вопрос(1)

Ваш ответ на вопрос