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
Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top