Comment localiser une variable correctement dans AT&T de l'assemblée?
-
11-12-2019 - |
Question
Je suis pratiquant d'écrire un amorçage à l'aide de l'assemblée (AT&T de la syntaxe, et gnu/gaz).Le petit programme est assemblés et reliés, puis copié sur le premier secteur d'un disque virtuel.BIOS charge dans la 0000:7c00
, et ici vient le problème.L' call hello
sera traduit à partir de call 0010
pour call 7c10
lors de la course.Mais l' movw $message, %as
ne pas obtenir déplacé.L' ax
est encore 0026
, pas 7c26
.Le résultat est que je ne peux pas faire la Hello World
sur l'écran.Au lieu de cela, des données aléatoires à 0000:0026
sera affiché sur l'écran.
Comment puis-je faire corriger au cours de l'amorçage?Dois-je changer l'asm code source à l'aide des directives?Ou dois-je changer mon lien de script?
Merci!!!!
.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
J'utilise la suite de les assembler et de lien 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
La solution
Je vois que le principal problème est dans la manière que vous avez de la compilation de votre code.
Les mesures correctes pour obtenir votre code de travail devrait être:
as boot.s -c -o boot.o
ld --oformat binary --Ttext 0x7C00 -o boot.bin boot.o
Veuillez noter que, comme d'autres l'ont dit, que je suis de passage le --Ttext 0x7C00
paramètre ld
, pour le forcer déménagement de votre code à cette adresse.
Une suggestion supplémentaire, essayer de structurer votre code comme ceci:
.text
.global _start
.code16
_start:
jmp stage1_start
...
stage1_start:
<your bootloader here>
Notez que c'est compiant avec la façon dont le code BIOS regarde les disques durs, car au bout de 2 octets (la longueur de la première instruction de saut), vous devez placer le Disque de Table de Description.
En outre, vous pouvez restructurer vos dernières instructions dans un plus as
-comme la syntaxe ressemble à ceci:
. = _start + 0x0200 - 2
.short 0x0AA55
Où l' .
variable est l'emplacement du compteur.Regarder cette page pour de plus amples renseignements sur la façon dont ce compteur fonctionne (dans le contexte de ld
, pas as
).
Espérons que cette aide!