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?

Author: starblue, 2009-12-06

5 answers

{[[2]} existem algumas operações que você pode apenas Fazer Com DI/SI (ou suas contrapartes estendidas, se você não aprendeu ASM em 1985). Entre estes estão
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.

 67
Author: Carl Smotricz, 2009-12-06 19:36:22

SI = Índice De Origem
DI = Í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 = acumulador
DX = palavra dupla acumulador
CX = contador
BX = registo de base

Parecem registos de uso geral., mas há uma série de instruções que (inesperadamente?) use um deles-mas qual deles?-implicitamente.
 69
Author: wallyk, 2015-11-04 00:32:06

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!
 30
Author: catfood, 2009-12-06 20:42:08

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.

 10
Author: PhiS, 2015-01-17 13:36:38
Para além dos registos utilizados para Operações em massa, são úteis para a sua propriedade de serem preservados através de uma chamada de funções (Chamada-preservada) na Convenção de chamadas de 32 bits. Os ESI, EDI, EBX, EBP, ESP são preservados enquanto EAX, ECX e EDX não são preservados. Registradores preservados de chamadas são respeitados pela função da biblioteca C e seus valores persistem através das chamadas de funções da biblioteca C. Jeff Duntemann no seu livro em linguagem de montagem tem um exemplo de montagem código para imprimir os argumentos da linha de comandos. O código usa esi e edi para armazenar contadores como eles serão inalterados pela função biblioteca C printf. Para outros registros como eax, ecx, edx, não há garantia de que eles não sejam usados pelas funções da biblioteca C.

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.

 4
Author: Jay Rajput, 2016-10-24 01:26:06