2011-02-04 21 views
7

Attualmente sono nel bel mezzo dell'apprendimento dell'assemblaggio x86 per divertimento, mi piace la programmazione dei microcontrollori, quindi ho familiarità con il montaggio.Assemblaggio: utilizzo del registro dei segmenti di dati (DS)

Attualmente ho cercato di alta e bassa per la risposta a questa domanda, ma non riesco a trovarlo ... il registro DS, lo so che si suppone indicare i dati globali nel mio programma, ma Non so come funzioni esattamente. Sto utilizzando NASM, e nella maggior parte dei semplici programmi che vedo il seguente:

 
[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 

e che funziona perfettamente (anche se tralascio il codice in grassetto), ma come? La CPU carica automagicamente le variabili globali a partire da 0x0000? o c'è qualcosa di intrinseco qui che mi manca?

+0

Possibile duplicato di: http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly, http://stackoverflow.com/questions/4119504/real-mode-memory-addressing -esplanation/33581044 # 33581044 –

risposta

12

Quando il computer è in modalità reale (la modalità in cui si trova la CPU quando il BIOS esegue il bootloader), il metodo utilizzato dalla CPU per calcolare l'indirizzo è molto semplice: moltiplicare il valore del registro di segmento per 16 (bit di spostamento 4 posizioni a sinistra), quindi aggiungere l'offset.

Ad esempio in un'istruzione come "mov ax, [0x1234]" la CPU utilizza "DS * 0x10 + 0x1234" come indirizzo effettivo (il primo termine si risolve in zero nel tuo caso). Quando ne hai uno simile "mov ax, [BP + 0x32]" quindi la CPU utilizzerà "SS * 0x10 + BP + 0x32". Si noti che ora la CPU ha utilizzato un registro di segmento diverso (il segmento di stack), e questo perché quando viene utilizzato il registro BP, la CPU presuppone che non si desidera accedere allo stack per impostazione predefinita (ma è possibile sovrascriverlo utilizzando [DS : BP + 0x32]).

Più o meno quello che ho spiegato e più può essere trovato a http://wiki.osdev.org/Real_Mode e http://www.internals.com/articles/protmode/realmode.htm e molti altri posti.

BTW, "msg" deve essere posizionato più o meno all'indirizzo 0x7C11.

+0

Grazie! Questo ha risposto alla mia domanda perfettamente^_ ^. –