2011-04-21 14 views

Respuesta

7

El registro sp es el puntero de pila, que se utiliza para la operación de pila como push y pop.

La pila se conoce como estructura LIFO (último en entrar, primero en salir), lo que significa que lo último que se empuja es la primera cosa que sale. Se usa, entre otras cosas, para implementar la capacidad de llamar funciones.

El registro bp es el puntero de base, y se usa comúnmente para operaciones de marco de pila.

Esto significa que es una referencia fija para localizar variables locales, parámetros pasados ​​y demás en la pila, para un nivel dado (mientras que sp puede cambiar durante la ejecución de una función, bp por lo general no).

Si usted está buscando en lenguaje ensamblador como:

mov eax, [bp+8] 

Estás viendo el código de acceso a una variable de pila de nivel específico.

El registro si es el índice fuente, generalmente utilizado para operaciones de copia masiva (di es su índice de destino equivalente). Intel tenía estos registros junto con instrucciones específicas para el movimiento rápido de bytes en la memoria.

Las variantes e- son solo las versiones de 32 bits de estos (originalmente) registros de 16 bits. Y, como si eso no fuera suficiente, también tenemos variantes de r- de 64 bits :-)

Quizás el lugar más simple para comenzar es here. Es específico para el 8086 pero los conceptos no han cambiado tanto. La simplicidad del 8086 comparado con el cultivo actual será un buen punto de partida para su educación. Una vez que haya aprendido los conceptos básicos, será mucho más fácil pasar a los miembros posteriores de la familia x86.

Transcrito aquí y editado un poco, para que la respuesta sea independiente.


enter image description here

registros de propósito general

8086 CPU tiene 8 registros de propósito general, cada registro tiene su propio nombre:

  • AX - el registro acumulador (dividido en AH/AL). Probablemente el registro más utilizado para cosas de propósito general.
  • BX - el registro de la dirección base (dividido en BH/BL).
  • CX - el registro de conteo (dividido en CH/CL). Instrucciones especiales para moverse y cambiar.
  • DX - el registro de datos (dividido en DH/DL).Se usa con AX para algunas operaciones MUL y DIV, y para especificar puertos en algunas operaciones IN y OUT.
  • SI - registro de índice fuente. Instrucción de propósito especial para usar esto como una fuente de transferencias de memoria masiva (DS:SI).
  • DI - índice de destino registrar. Instrucción de propósito especial para usar esto como un destino de transferencias de memoria masiva (ES:DI).
  • BP - puntero base, utilizado principalmente para acceder a los parámetros y variables en la pila.
  • SP - puntero de pila, utilizado para las operaciones de pila básica.

registros de segmento

  • CS - puntos en el segmento que contiene la instrucción actual.
  • DS - generalmente apunta al segmento donde se definen las variables.
  • ES - registro de segmento adicional, depende de un codificador definir su uso.
  • SS - apunta al segmento que contiene la pila.

Aunque es posible almacenar cualquier dato en los registros de segmentos, esto nunca es una buena idea. Los registros de segmento tienen un propósito muy especial: señalar bloques de memoria accesibles.

Los registros de segmento funcionan junto con el registro de propósito general para acceder a cualquier valor de memoria. Por ejemplo, si quisiéramos acceder a la memoria en la dirección física 12345h, podríamos configurar DS = 1230h y SI = 0045h. De esta forma, podemos acceder a mucha más memoria que con un solo registro, que está limitado a valores de 16 bits.

La CPU realiza un cálculo de la dirección física multiplicando el registro de segmento por 10h y añadiendo el registro de propósito general a la misma (1230h * 10h + 45h = 12345h):

1230 
0045 
===== 
12345 

La dirección formada con 2 registros se denomina una dirección eficaz .

Este uso es solo para modo real (que es el único modo que tenía el 8086). Los procesadores posteriores cambiaron estos registros de segmentos a selectores y se usan para buscar direcciones en una tabla, en lugar de tener un cálculo fijo realizado en ellas.

Por defecto BX, SI y DI registros trabajan con DS segmento de registro; y BP y SP funcionan con el registro de segmento SS.

PROPÓSITO ESPECIAL REGISTROS

IP - el puntero de instrucción:

  • siempre apunta a la siguiente instrucción a ejecutar.
  • Dirección de desplazamiento relativa a CS.

IP registro siempre trabaja en conjunto con CS registro de segmento y apunta a la ejecución de la instrucción actualmente.

registro de banderas

determina el estado actual del procesador. Estos indicadores se modifican automáticamente por la CPU después de las operaciones matemáticas, esto permite determinar el tipo de resultado y determinar las condiciones para transferir el control a otras partes del programa.

Generalmente no puede acceder a estos registros directamente.

enter image description here

  • pabellón lleven CF - este indicador se establece en 1 cuando hay un desbordamiento sin firmar. Por ejemplo, cuando agrega bytes 255 + 1 (el resultado no está en el rango 0 ... 255). Cuando no hay desbordamiento, esta bandera está configurada en 0.
  • Bandera de paridad PF - esta bandera se establece en 1 cuando hay un número par de bits en el resultado, y en 0 cuando hay un número impar de bits.
  • Flag auxiliar AF - pone a 1 cuando hay un desbordamiento sin signo para bajo nibble (4 bits).
  • Zero Flag ZF - se establece en 1 cuando el resultado es cero. Para que no sea cero resultado de este indicador se establece en 0.
  • indicador de SIGNO SF - se pone a 1 cuando el resultado es negativo. Cuando el resultado es positivo, se pone a 0. (Este indicador toma el valor del bit más significativo.)
  • Bandera Trampa TF - Se utiliza para la depuración en el chip.
  • Interrupt habilitar el indicador de IF - cuando este indicador se establece en 1 CPU reacciona a las interrupciones de dispositivos externos.
  • Dirección Flag DF - esta bandera es utilizado por algunas instrucciones para procesar las cadenas de datos, cuando este indicador está fijado en 0 - el procesamiento se realiza hacia adelante, cuando este indicador se establece en 1 el procesamiento se realiza hacia atrás.
  • Bandera de desbordamiento OF - establecida en 1 cuando hay un desbordamiento firmado. Por ejemplo, cuando agrega bytes 100 + 50 (el resultado no está en el rango -128 ... 127).
+0

¿Cuál fue la razón fundamental para elegir 'e' y' r' para esos prefijos? –

+2

@Tomalex: ninguna idea. Quizás 'e' significaba" extendido "y' r' significaba "realmente extendido" :-) – paxdiablo

+0

El 8086 no tiene 'ebp',' esp', o 'esi'. Nadie mencionó el 8086. ¿Por qué está aquí? – cHao

10

En algunas arquitecturas, como MIPS, todos los registros se crean iguales, y realmente no hay diferencia más allá del nombre del registro (y las convenciones de software). En x86 puede usar principalmente cualquier registro para computación de propósito general, pero algunos registros están vinculados implícitamente al conjunto de instrucciones.

Gran cantidad de información acerca de los propósitos especiales para los registros se pueden encontrar here.

Ejemplos:

  • eax, acumulador: muchas instrucciones aritméticas operan de manera implícita en eax. También hay codificaciones específicas más cortas específicas de EAX para muchas instrucciones: add eax, 123456 es 1 byte más corto que add ecx, 123456, por ejemplo.(add eax, imm32 vs. add r/m32, imm32)
  • ebx, base: algunos usos implícitos, pero xlat es uno que coincide con el nombre "Base". Sigue siendo relevante: cmpxchg8b. Debido a que rara vez se requiere para algo específico, algunas llamadas de 32 bits-convenciones/ABI use it as a pointer to the "global offset table" en código independiente de posición (PIC).
  • edx, los datos: algunas operaciones aritméticas operan implícitamente en el valor de 64 bits en edx: eax
  • ecx, contador utilizado para los recuentos de cambio, y para rep movs. Además, el mostly-obsolete loop instruction decrementa implícitamente ecx
  • esi, índice de fuente: algunas operaciones de cadenas leer una cadena de la memoria a la que apunta esi
  • edi, índice de destino: algunas operaciones de cadena escribir una cadena en la memoria apuntada por edi. p.ej. rep movsb copia bytes ECX de [esi] a [edi].
  • ebp, puntero base: normalmente se usa para señalar las variables locales. Usado implícitamente por leave.
  • esp, stack pointer: puntos a la parte superior de la pila, utiliza implícitamente por push, pop, call y ret

El conjunto de instrucciones x86 es una bestia compleja, de verdad. Muchas instrucciones tienen formas más cortas que implícitamente usan un registro u otro. Algunos registros se pueden usar para hacer cierto direccionamiento mientras que otros no.

Intel 80386 Programmer's Reference Manual es un recurso irremplazable, básicamente te dice todo lo que hay que saber sobre el ensamblaje x86, a excepción de las nuevas extensiones y el rendimiento en hardware moderno.

El libro PC Assembly (e) es un gran recurso para el aprendizaje del ensamblaje.

+0

Veo que paxdiablo actualizó su respuesta para contener un poco más de información mientras escribía esto, pero lo dejo aquí para los enlaces. :) –

+1

+1 para referirse a la CPU correcta, y para no perder la respuesta en una avalancha de otra información. – cHao

+1

Buen resumen. +1. Haría negocios de nuevo. –

1

He aquí un resumen simplificado:

ESP es el puntero de pila actual, por lo que generalmente sólo se actualiza para manipular la pila, y EBP está destinado para la manipulación de pila también, para guardar el valor de ESP antes de asignar espacio de pila ejemplo para variables locales Pero también puede usar EBP como un registro de propósito general.

ESI es el registro de índice de fuente extendida, "cadena" (diferente de C-cadena, y no me refiero al tipo de C-cadena mujeres desgaste tampoco) instrucciones como MOVS utilizan ESI y EDI.

Direccionamiento de la memoria:

CPU x86 han estos registros especiales llamados "registros de segmento", cada uno de ellos puede apuntar a diferentes direcciones, por ejemplo DS (comúnmente llamados segmento de datos) puede apuntar a 0x1000000, y SS (comúnmente llamado segmento de pila) puede apuntar a 0x2000000.

Cuando utiliza EBP y ESP, el registro de segmento predeterminado utilizado es SS, para ESI (y otros registros de propósito general), es DS.Por ejemplo, digamos que DS = 0x1000000, SS = 0x2000000, EBP = 0x10, ESI = 0x10, así:

mov eax,[esp] //loading from address 0x2000000 + 0x10 
    mov eax,[esi] //loading from address 0x1000000 + 0x10 

También puede especificar un registro de segmento de usar, anulando el valor por defecto:

mov eax,ds:[ebp] 

En términos de suma, resta, operaciones lógicas, etc., no hay diferencia real entre ellos.

Cuestiones relacionadas