Doel van ESI & EDI-registraties?

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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes