Wat is het werkelijke doel en gebruik van de EDI & ESI registreert in assembler?
Ik weet dat ze onder andere worden gebruikt voor stringbewerkingen.
Kan iemand ook een voorbeeld geven?
Antwoord 1, autoriteit 100%
Er zijn een paar bewerkingen die u alleen kunt doen met DI/SI (of hun uitgebreide tegenhangers, als u ASM niet in 1985 hebt geleerd). Onder deze zijn
REP STOSB
REP MOVSB
REP SCASB
Dit zijn respectievelijk bewerkingen voor herhaald (= massa) opslaan, laden en scannen. Wat je doet, is dat je SI en/of DI instelt om naar een of beide operanden te wijzen, misschien een telling in CX zet en dan laat ‘er rippen. Dit zijn bewerkingen die op een aantal bytes tegelijk werken, en ze zetten de CPU min of meer automatisch in. Omdat je lussen niet expliciet codeert, doen ze hun ding (meestal) efficiënter dan een handgecodeerde lus.
Voor het geval je je afvraagt: afhankelijk van hoe je de bewerking hebt ingesteld, kan herhaald opslaan iets eenvoudigs zijn, zoals de waarde 0 in een groot aangrenzend geheugenblok ponsen; MOVSB wordt, denk ik, gebruikt om gegevens van de ene buffer (nou ja, elke reeks bytes) naar de andere te kopiëren; en SCASB wordt gebruikt om te zoeken naar een byte die overeenkomt met een zoekcriterium (ik weet niet zeker of het alleen zoekt op gelijkheid, of wat je kunt het opzoeken 🙂 )
Daar zijn de meeste van die regs voor.
Antwoord 2, autoriteit 94%
SI
= Bronindex
DI
= Bestemmingsindex
Zoals anderen al hebben aangegeven, hebben ze een speciaal gebruik met de tekenreeksinstructies. Voor real-mode programmering moet het segmentregister ES
worden gebruikt met DI
en DS
met SI
zoals in
movsb es:di, ds:si
SI en DI kunnen ook worden gebruikt als indexregisters voor algemene doeleinden. Bijvoorbeeld de C
broncode
srcp [srcidx++] = argv [j];
compileert in
8B550C mov edx,[ebp+0C]
8B0C9A mov ecx,[edx+4*ebx]
894CBDAC mov [ebp+4*edi-54],ecx
47 inc edi
waar ebp+12
argv
bevat, ebx
j
en edi
heeft srcidx
. Merk op dat de derde instructie edi
vermenigvuldigt met 4 gebruikt en ebp
offset met 0x54 toevoegt (de locatie van srcp
); haakjes rond het adres geven indirectheid aan.
Hoewel ik me niet kan herinneren waar ik het heb gezien, maar dit bevestigt het meeste, en dit (dia 17 ) anderen:
AX
= accumulator
DX
= dubbele woordaccumulator
CX
= teller
BX
= basisregister
Ze zien eruit als registers voor algemene doeleinden, maar er zijn een aantal instructies die (onverwacht?) er één gebruiken maar welke? impliciet.
Antwoord 3, autoriteit 47%
Opcodes zoals MOVSB en MOVSW die op efficiënte wijze gegevens kopiëren van het geheugen waarnaar door ESI wordt verwezen, naar het geheugen waarnaar wordt verwezen door EDI. Dus,
mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
Antwoord 4, autoriteit 15%
Naast de stringbewerkingen (MOVS/INS/STOS/CMPS/SCASB/W/D/Q etc.) die in de andere antwoorden worden genoemd, wilde ik toevoegen dat er ook meer “moderne” x86-montage-instructies zijn die gebruik impliciet ten minste EDI/RDI:
De SSE2 MASKMOVDQU
(en de komende AVX VMASKMOVDQU
) instructie schrijft selectief bytes uit een XMM-register naar het geheugen waarnaar wordt verwezen door EDI/RDI.
Antwoord 5, autoriteit 9%
Naast de registers die worden gebruikt voor massabewerkingen, zijn ze nuttig omdat ze worden bewaard door een functieaanroep (aanroep bewaard) in 32-bits aanroepconventie. De ESI, EDI, EBX, EBP, ESP zijn gespreksbehouden terwijl EAX, ECX en EDX niet gespreksbehouden zijn. Aanroepbewaarde registers worden gerespecteerd door de C-bibliotheekfunctie en hun waarden blijven behouden via de C-bibliotheekfunctieaanroepen.
Jeff Duntemann heeft in zijn assembler-boek een voorbeeld van een assembly-code voor het afdrukken van de opdrachtregelargumenten. De code gebruikt esi en edi om tellers op te slaan, aangezien deze ongewijzigd blijven door de C-bibliotheekfunctie printf. Voor andere registers, zoals eax, ecx, edx, is er geen garantie dat ze niet worden gebruikt door de C-bibliotheekfuncties.
https://www.amazon.com/Assembly-Language-Step-Step- Programmering/dp/0470497025
Zie paragraaf 12.8 Hoe C opdrachtregelargumenten ziet.
Houd er rekening mee dat 64-bits belconventies verschillen van 32-bits belconventies, en ik weet niet zeker of deze registers behouden blijven of niet.