¿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ía0026
no7c26
. 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