¿Cómo ubicar correctamente una variable en el ensamblaje de AT&T?

Estoy practicando para escribir un bootstrap usando ensamblador (en sintaxis de AT&T, y gnu / gas). El pequeño programa se ensambla y se vincula, luego se copia al primer sector de un disco virtual. BIOS lo cargará en0000:7c00, y aquí viene el problema. loscall hello será traducido decall 0010 acall 7c10 durante la ejecución Pero elmovw $message, %as no se reubica. losax es todavía0026no7c26. El resultado es que no puedo hacer elHello World en la pantalla. En cambio, algunos datos al azar en0000:0026 se mostrará en la pantalla.

¿Cómo puedo corregirlo durante el arranque? ¿Debo cambiar el código fuente de asm usando algunas directivas? ¿O debería cambiar mi script de enlace?

¡Gracias!

.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

Uso los siguientes scripts de ensamblaje y enlace.

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta