2011-02-04 10 views
7

Obecnie jestem w trakcie uczenia się zestawu x86 dla zabawy, programuje mi się mikrokontroler, więc znam montaż.Montaż: za pomocą rejestru segmentu danych (DS)

Obecnie szukam odpowiedzi na to pytanie, ale nie mogę tego znaleźć ... rejestr DS, wiem, że powinien wskazywać na globalne dane w moim programie, ale Nie wiem, jak to działa. Używam NASM, w większości prostych programów widzę następujące:

 
[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 

i że działa doskonale (nawet jeśli pominąć pogrubiony kod), ale w jaki sposób? Czy procesor automatycznie ładuje zmienne globalne zaczynające się od 0x0000? czy jest tu coś nieodłącznego, czego mi brakuje?

+0

Możliwy duplikat: http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly, http://stackoverflow.com/questions/4119504/real-mode-memory-addressing -explanation/33581044 # 33581044 –

Odpowiedz

12

Gdy komputer znajduje się w trybie rzeczywistym (tryb, w którym znajduje się CPU, gdy BIOS wykonuje bootloader), metoda używana przez procesor do obliczenia adresu jest bardzo prosta: pomnóż wartość rejestru segmentu przez 16 (bity shift 4 pozycje w lewo), a następnie dodaj przesunięcie.

Na przykład w instrukcji takiej jak "mov ax, [0x1234]" procesor użyje "DS * 0x10 + 0x1234" jako efektywnego adresu (pierwszy termin zostanie rozwiązany na zero w twoim przypadku). Kiedy masz jedno "mov ax, [BP + 0x32]" to procesor użyje "SS * 0x10 + BP + 0x32". Zauważ, że teraz procesor użył innego rejestru segmentów (Segmentu stosu), a to dlatego, że kiedy używany jest rejestr BP, procesor zakłada, że ​​domyślnie nie będziesz mieć dostępu do stosu (ale możesz to zmienić za pomocą [DS : BP + 0x32]).

Mniej więcej tego, co wyjaśniłem, a więcej można znaleźć na http://wiki.osdev.org/Real_Mode i http://www.internals.com/articles/protmode/realmode.htm i wielu innych miejscach.

BTW, "msg" powinno znajdować się mniej więcej na adres 0x7C11.

+0

Dzięki! To odpowiedział doskonale na moje pytanie^_ ^. –

Powiązane problemy