Objectivo dos registos ESI & EDI?
Qual é o verdadeiro objectivo e utilização dos registos EDI & ESI na montagem?
Eu sei que eles são usados para operações de cordas para uma coisa.
Alguém pode dar um exemplo?5 answers
REP STOSB
REP MOVSB
REP SCASB
Que são, respectivamente, operações de armazenamento, carregamento e varrimento repetidos (= massa). O que você faz é configurar SI e/ou DI para apontar para um ou ambos os operandos, talvez colocar uma contagem em CX e, em seguida, deixá-lo rasgar. Estas são operações que funcionam em um monte de bytes de cada vez, e eles meio que colocam a CPU em automático. Porque você não está explicitamente codificando loops, eles fazem a sua coisa de forma mais eficiente (geralmente) do que um loop manual.
No caso de você estar se perguntando: Dependendo de como você definir a operação de backup, repetiu o armazenamento pode ser algo simples como socando o valor 0 em um grande bloco contíguo de memória; MOVSB é usado, eu acho que, para copiar dados de um buffer (bem, qualquer monte de bytes) para outro; e SCASB é usado para procurar um byte, que corresponde a algum critério de busca (eu não tenho certeza se é apenas procurar a igualdade, ou o que – você pode procurar:) ([5]} É para isso que servem essas regras.
SI
= Índice De OrigemDI
= Índice De Destino
Como outros indicaram, eles têm usos especiais com as instruções de texto. Para a programação em modo real, o registo do segmento ES
deve ser usado com DI
e DS
com SI
como em
movsb es:di, ds:si
O SI e o DI podem também ser utilizados como registos de indexação para fins gerais. Por exemplo, o C
código-fonte
srcp [srcidx++] = argv [j];
Compila em
8B550C mov edx,[ebp+0C]
8B0C9A mov ecx,[edx+4*ebx]
894CBDAC mov [ebp+4*edi-54],ecx
47 inc edi
Onde ebp+12
contém argv
, ebx
riz [13]}, e edi
tem srcidx
. Note que a terceira instrução usa edi
multideplicada por 4 e acrescenta ebp
offset por 0x54( a localização de srcp
); parênteses em torno do endereço indicam indirecta.
Embora não me lembre onde o vi, mas isto confirma A maior parte, e isto confirma a maioria.:
AX
= acumuladorDX
= palavra dupla acumuladorCX
= contadorBX
= registo de base
Opcodes como MOVSB e MOVSW que copiam eficientemente os dados da memória apontados por ESI para a memória apontada por EDI. Assim,
mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
Para além das operações de texto (MOVS/INS/STOS/CMPS/SCASB/W/D/Q etc.) mencionado nas outras respostas, eu queria acrescentar que também existem mais" modernas " instruções de montagem x86 que implicitamente usam pelo menos EDI/ RDI:
A instrução SSE2 MASKMOVDQU
(e a próxima instrução AVX VMASKMOVDQU
) gravam selectivamente bytes de um registo XMM para a memória apontada por EDI/RDI.
Https://www.amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025
Ver secção 12.8 como C vê os argumentos da linha de comandos.
Note que as Convenções de chamadas de 64 bits são diferentes das de 32 bits chamar convenções, e não tenho a certeza se estes registos são preservados ou não.