2015-07-03 15 views
5

Sono nuovo di assemblaggio e sto cercando di capire Linux 0.01 codice del bootloader, ma mi sono bloccato in questa parte (a velocità molto beggining :)):istruzione MOV ripetendo x86

.globl begtext, begdata, begbss, endtext, enddata, endbss 
.text 
begtext: 
.data 
begdata: 
.bss 
begbss: 
.text 

BOOTSEG = 0x07c0 
INITSEG = 0x9000 
SYSSEG = 0x1000   | system loaded at 0x10000 (65536). 
ENDSEG = SYSSEG + SYSSIZE 

entry start 
start: 
    mov ax,#BOOTSEG 
    mov ds,ax 
    mov ax,#INITSEG 
    mov es,ax 
    mov cx,#256 
    sub si,si 
    sub di,di 
    rep 
    movw 
    jmpi go,INITSEG 

Questo codice (come spiegato in fonte commenti copie) bootloader in una nuova posizione e continua l'esecuzione da go. rep seguito da mov dovrebbe fare questo (copia parte), ma invece l'istruzione mov {w} viene utilizzato.

rep 
movw 

In ogni libro di riferimento per x86 ho guardato rep viene utilizzato con le istruzioni di stringa.

Can rep può essere utilizzato con tutte le istruzioni di trasferimento dati o solo con stringhe e, in caso affermativo, perché non è menzionato nei manuali di riferimento?

risposta

4

Questo è probabilmente il modo in cui il particolare assemblatore che il codice è stato scritto per implementare questa istruzione sebbene sia stranamente dispari. È più comune trovare questo come movsb, movsw o movsl dal movs è la notazione di Intel.

Questo è, in effetti, lo spostamento di una "stringa", anche se è semplicemente un insieme di byte arbitrari. Più specificamente, potresti aver notato mov cx,256 precedente. Questo codice operativo è movw che sposta una parola a 16 bit, spostando in modo più efficiente il settore di avvio da 512 byte.

Aggiornamento:

La sua domanda mi ha fatto terribilmente curioso visto che non ho eseguito attraverso l'istruzione codificata in questo modo. È interessante notare che ho trovato un forum entry che sembra indicare che rep movw è in formato AS86 e in realtà si assembla a rep movsw.

+0

Quindi, durante il montaggio _rep movw_ verrà tradotto in _rep movws_opcode? –

+0

'rep movsw'. Anche se, ancora una volta, questa è una notazione davvero bizzarra (quella nella tua domanda originale). Sai a quale assemblatore è stato scritto? –