Como localizar uma variável corretamente na montagem AT & T?

Eu estou praticando para escrever um bootstrap usando assembly (na sintaxe AT & T e gnu / gas). O pequeno programa é montado e vinculado, depois copiado para o primeiro setor de um disco virtual. BIOS irá carregá-lo em0000:7c00e aqui vem o problema. ocall hello será traduzido decall 0010 paracall 7c10 durante a corrida. Mas omovw $message, %as não é realocado. oax está parado0026, não7c26. O resultado é que eu não posso fazer oHello World na tela. Em vez disso, alguns dados aleatórios0000:0026 será exibido na tela.

Como posso corrigi-lo durante a inicialização? Devo alterar o código-fonte ASM usando algumas diretivas? Ou devo mudar meu script de link?

Obrigado!

.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

Eu uso o seguinte monte e link scripts

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

questionAnswers(1)

yourAnswerToTheQuestion