Montage: Mithilfe des Data Segment Register (DS)
Derzeit bin ich in der Mitte des Lernens x86 assembly for fun, ich bin die Liebe mikrocontroller-Programmierung, so bin ich vertraut mit der Montage.
Derzeit ich habe lange gesucht hoch und niedrig für die Antwort auf diese Frage, kann aber nicht scheinen, um es zu finden... der DS anmelden, ich weiß, dass es zeigen soll, den globalen Daten in mein Programm, aber ich weiß nicht, wie es genau funktioniert. Ich verwende NASM, und in den meisten einfachen Programmen, sehe ich Folgendes:
[org 0x7C00] [bits 16] main: mov ax, 0x0000 mov ds, ax mov al, [msg] mov ah, 0x0E mov bx, 0x0007 int 0x10 jmp $ msg db 'X' times 510-($-$$) db 0 dw 0xAA55
und das funktioniert perfekt (auch wenn ich übergehe den Fett gedruckten code), aber wie? Hat die CPU automatisch laden der globalen Variablen ab 0x0000? oder gibt es etwas, das intrinsische, dass ich hier bin fehlt?
- Mögliche Duplikate von: stackoverflow.com/questions/3819699/... , stackoverflow.com/questions/4119504/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn der computer unter real-Modus (der Modus der CPU ist wenn das BIOS führt den bootloader), die Methode, die die CPU verwendet, um zu berechnen, die Adresse ist sehr einfach: Multiplizieren segment-register-Wert von 16 (shift bits 4 Positionen nach Links), dann fügen Sie den offset.
Beispielsweise in einer Anweisung wie "mov ax, [0x1234]" der CPU verwenden würde "DS * 0x10 + 0x1234" als die effektive Adresse (der erste term wird zu null in deinem Fall.) Wenn Sie eine haben wie "mov ax, [BP+0x32]" dann die CPU wird mit "SS * 0x10 + BP + 0x32". Beachten Sie, dass die verwendete CPU eine unterschiedliche segment-register (Stack-Segment), und das ist, weil, wenn das BP-register verwendet wird, wird die CPU davon ausgegangen, dass Sie wan ' T, um Zugriff auf den stack standardmäßig (aber Sie können dies überschreiben, indem Sie mit [DS:BP + 0x32]).
Mehr o weniger das, was ich erklärt habe und mehr finden Sie bei http://wiki.osdev.org/Real_Mode und http://www.internals.com/articles/protmode/realmode.htm und viele mehr stellen.
BTW, "msg" sollte sich mehr oder weniger an 0x7C11-Adresse.