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:7c00
e 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