Tengo que aprender a ensamblar y estoy muy confundido en cuanto a lo que los diferentes registros hacen/apuntan.¿Puede alguien explicarme (en términos muy simples) cuál es la diferencia entre el registro esp, ebp y esi?
Respuesta
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.
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 enAH/AL
). Probablemente el registro más utilizado para cosas de propósito general.BX
- el registro de la dirección base (dividido enBH/BL
).CX
- el registro de conteo (dividido enCH/CL
). Instrucciones especiales para moverse y cambiar.DX
- el registro de datos (dividido enDH/DL
).Se usa conAX
para algunas operacionesMUL
yDIV
, y para especificar puertos en algunas operacionesIN
yOUT
.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.
- 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).
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 eneax
. 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 queadd ecx, 123456
, por ejemplo.(add eax, imm32
vs.add r/m32, imm32
)ebx
, base: algunos usos implícitos, peroxlat
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 enedx
:eax
ecx
, contador utilizado para los recuentos de cambio, y pararep movs
. Además, el mostly-obsoleteloop
instruction decrementa implícitamenteecx
esi
, índice de fuente: algunas operaciones de cadenas leer una cadena de la memoria a la que apuntaesi
edi
, índice de destino: algunas operaciones de cadena escribir una cadena en la memoria apuntada poredi
. 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 porleave
.esp
, stack pointer: puntos a la parte superior de la pila, utiliza implícitamente porpush
,pop
,call
yret
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.
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 para referirse a la CPU correcta, y para no perder la respuesta en una avalancha de otra información. – cHao
Buen resumen. +1. Haría negocios de nuevo. –
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.
- 1. "entrar" vs "push ebp; ebp mov, esp, sub esp, imm" y "Leave" vs "mov esp, ebp; pop ebp"
- 2. registros de ensamblaje esp y ebp
- 3. ¿Cuál es el uso de "push% ebp; movl% esp,% ebp" generado por GCC para x86?
- 4. ¿Alguien puede explicarme el polimorfismo?
- 5. ¿Cuál es la diferencia entre un hilo y una fibra?
- 6. ¿Cuál es la diferencia entre Live IP y STATIC IP?
- 7. ¿Puede alguien explicarme NaN en Ruby?
- 8. ¿Alguien puede explicar el empalme de unificación de Clojure en términos simples?
- 9. ¿Puede alguien explicarme los hilos?
- 10. Puede alguien explicarme esta `StaleDataException`
- 11. ¿Puede alguien explicarme este código?
- 12. ¿Cuál es la diferencia entre el marco y la arquitectura?
- 13. ¿Alguien puede explicarme la diferencia entre el controlador de nivel de clase y el controlador de nivel de método ...?
- 14. ¿alguien puede explicarme @MapsId en Hibernate?
- 15. ¿Cuál es la diferencia entre emulación y simulación?
- 16. ¿Cuál es la diferencia entre IF-ELSE y SWITCH?
- 17. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 18. Cuál es el significado de lea 0x0 (% esi),% esi
- 19. Explicar xpath y xquery en términos simples
- 20. ¿Alguien puede explicarme este script cmake?
- 21. F #: En términos reales, ¿cuál es la diferencia entre una "cadena" y una "opción de cadena"?
- 22. ¿Cuál es la diferencia entre el tenedor y el hilo?
- 23. ¿Puede alguien explicarme esta consulta SQL?
- 24. ¿Cuál es la diferencia entre el mango y el hilo?
- 25. ¿Alguien puede explicarme este método de oscilación de javax?
- 26. ¿Cuál es la diferencia entre == y =: = en Erlang cuando se usa con términos en general?
- 27. ¿Cuál es la diferencia entre getExtras y getBundleExtras?
- 28. ¿Puede alguien explicarme cuándo es útil usar MapMaker o WeakHashMaps?
- 29. ¿Cuál es la diferencia entre el colado y la coerción?
- 30. ¿Cuál es la diferencia entre la administración de la configuración y el control de la versión?
EBP: http://stackoverflow.com/questions/579262/what-is-the-purpose-of-the-ebp-frame-pointer-register, ESP y EBP: http://stackoverflow.com/questions/5474355/why-does-leave-do-mov-esp-ebp-in-x86-assembly? Rq = 1 –