2017-03-08 4 views
2

Von https://github.com/cfenollosa/os-tutorial/tree/master/05-bootsector-functions-strings lernend, habe ich versucht, meinen eigenen Bootsektor zu schreiben.NASM Befehlssequenz

Ich versuche gerade, eine bestimmte Zeichenfolge zu drucken.

Das sind meine zwei Dateien:

boot_main.asm

[org 0x7c00] 

mov bx, hello 
call print 
jmp $ 

hello db 'HI', 0 

%include "boot_print.asm" 

times 510 - ($ - $$) db 0 
dw 0xaa55 

boot_print.asm

print: 
    pusha 

start: 
    mov al, [bx] 
    cmp al, 0 
    je done 

    mov ah, 0x0e 
    int 0x10 

    add bx, 1 
    jmp start 

done: 
    popa 
    ret 

print_nl: 
    pusha 
    mov ah, 0x0e 
    mov al, 0x0a 
    int 0x10 
    mov al, 0x0d 
    int 0x10 

    jmp done 

diese nun perfekt und druckt "HALLO" auf den Bildschirm funktioniert. Aber wenn ich den Befehl hello db 'HI', 0 an den Anfang verschiebe. d.h

boot_main.asm

[org 0x7c00] 

hello db 'HI', 0 

mov bx, hello 
call print 
jmp $ 

%include "boot_print.asm" 

times 510 - ($ - $$) db 0 
dw 0xaa55 

Dies alles überhaupt nicht gedruckt werden kann. Ich versuche den Unterschied zwischen den beiden zu verstehen. Irgendeine Hilfe?

Antwort

3

Der Assembler legt Sachen in den Speicher, je nachdem, wo Sie es in Ihre Quelldatei schreiben. Wenn Sie es am Anfang richtig setzen, nach der org Direktive, wird die HI\0 Zeichenfolge dort platziert, und die CPU wird versuchen, es auszuführen, als ob es Code wäre (sinnloses Zeug und möglicherweise Fehler).

Im ursprünglichen Code befindet sich die Zeichenfolge stattdessen nach dem jmp $, wo es an einem Speicherort sicher gespeichert wird, der nie vom Anweisungszeiger erreicht wird.

Wenn Sie Ihren Code ändern, um die CPU die Zeichenfolge zu machen umgehen Sie sehen, dass es wieder zu arbeiten beginnt:

[org 0x7c00] 
    jmp real_start 
    hello db 'HI', 0 
real_start: 
    mov bx, hello 
    call print 
    jmp $ 
    %include "boot_print.asm" 
    times 510 - ($ - $$) db 0 
    dw 0xaa55 

Auch dies wird offensichtlich, wenn Sie denken, dass db nicht wirklich etwas zu tun hat Magie Über Strings gibt es nur beliebige Bytes in der binären Ausgabe an der Position aus, an der Sie es schreiben. Wenn Sie sie in den Pfad der Ausführung schreiben, wird die CPU über sie laufen, wenn Sie die CPU anweisen, um sie herum zu springen, wird es sie vermeiden.

+1

Ihr Beispiel mit der Sidestep war Sahnehäubchen auf dem Kuchen, schön, danke! :) –

+1

@KarthikNayak: froh, dass es geholfen hat! Interessanterweise wird Code, der mit Daten vermischt ist, tatsächlich "im echten Leben" verwendet, wenn positionsunabhängiger Code erzeugt wird, und/oder wenn Sie kleine Daten haben, die jedoch nicht als unmittelbar gelten, aber trotzdem davon profitieren können im Cache neben der Kälte, die es benutzt. –

+0

Off Topic, könnten Sie den Witz in Ihrem Profil erklären? –