Conceptos básicos del lenguaje ensamblador 80x86

Hagamos un extracto hoy.
El texto original proviene de la cuenta pública de WeChat: Computer and Network Security

El lenguaje ensamblador es un lenguaje de bajo nivel utilizado en computadoras electrónicas, microprocesadores, microcontroladores u otros dispositivos programables, también conocidos como lenguajes simbólicos. En lenguaje ensamblador, los mnemotécnicos (Mnemonics) se usan para reemplazar los códigos de operación de las instrucciones de la máquina, y los símbolos de dirección (Symbols) o etiquetas (Label) se usan para reemplazar las direcciones de instrucciones u operandos. En diferentes dispositivos, el lenguaje ensamblador corresponde a diferentes conjuntos de instrucciones de lenguaje de máquina y se convierte en instrucciones de máquina a través del proceso de ensamblaje . En términos generales, existe una correspondencia uno a uno entre un lenguaje ensamblador específico y un conjunto de instrucciones de lenguaje de máquina específico, y no es directamente portátil entre diferentes plataformas.

Muchos ensambladores proporcionan mecanismos de soporte adicionales para el desarrollo de programas, el control de ensamblados y la depuración asistida. Algunas herramientas de programación en lenguaje ensamblador a menudo proporcionan macros, también se denominan ensambladores de macros.

El lenguaje ensamblador no se usa tanto para la programación como la mayoría de los otros lenguajes de programación. En las aplicaciones prácticas actuales, generalmente se usa en operaciones de hardware de bajo nivel y ocasiones de optimización de programas de alta demanda. Se requiere lenguaje ensamblador para controladores, sistemas operativos integrados y programas en tiempo real.

0x01 Historial de desarrollo

Cuando se trata de la producción de lenguaje ensamblador, primero debemos hablar de lenguaje de máquina.

El lenguaje de máquina es una colección de instrucciones de máquina. Las instrucciones de máquina son los comandos que una máquina puede ejecutar correctamente. Las instrucciones de máquina para una computadora electrónica son una lista de números binarios. La computadora lo convierte en una serie de niveles altos y bajos, de modo que los dispositivos electrónicos de la computadora son impulsados ​​para realizar operaciones.

La computadora mencionada anteriormente se refiere a una máquina que puede ejecutar instrucciones de máquina y realizar operaciones. Este es el concepto de las primeras computadoras. En nuestra PC de uso común, hay un chip para completar las funciones de la computadora mencionada anteriormente. Este chip es lo que a menudo llamamos CPU (Unidad Central de Procesamiento). Cada microprocesador, debido al diferente diseño de hardware y estructura interna, necesita ser controlado por pulsos de diferentes niveles para que funcione. Entonces, cada microprocesador tiene su propio conjunto de instrucciones de máquina, es decir, lenguaje de máquina.

La programación temprana usaba lenguaje de máquina. Los programadores perforan el código del programa compuesto por números 0 y 1 en la cinta de papel o tarjeta, 1 perforado, 0 no perforado, y luego ingresan el programa en la computadora a través de la máquina de cinta de papel o la máquina de tarjetas para el cálculo. Dicho lenguaje de máquina está compuesto de 0 y 1 puros, lo cual es muy complejo, incómodo de leer y modificar, y propenso a errores. Los programadores descubrieron rápidamente los problemas del uso de lenguajes de máquina, que eran difíciles de identificar y recordar, y traían obstáculos para el desarrollo de toda la industria, por lo que nació el lenguaje ensamblador.

La imagen y el texto no tienen nada que ver.
El cuerpo del lenguaje ensamblador son las instrucciones ensambladoras. La diferencia entre instrucciones de montaje e instrucciones de máquina radica en la forma en que se representan las instrucciones. Las instrucciones de ensamblaje son formatos escritos para instrucciones de máquina que son fáciles de recordar.

1000100111011000	机器指令
mov ax,bx			汇编指令

Desde entonces, los programadores han utilizado instrucciones de ensamblaje para escribir programas fuente. Sin embargo, una computadora solo puede leer las instrucciones de la máquina, entonces, ¿cómo puede una computadora ejecutar un programa escrito por un programador con instrucciones de ensamblaje? En este momento, se requiere un programa de traducción que pueda convertir las instrucciones de ensamblaje en instrucciones de máquina, y dicho programa se denomina compilador. El programador escribe el programa fuente en lenguaje ensamblador y luego usa el compilador ensamblador para compilarlo en código de máquina, que finalmente es ejecutado por la computadora.

0x02 Características del lenguaje

El lenguaje ensamblador es un lenguaje de programación orientado directamente a los procesadores. El procesador trabaja bajo el control de instrucciones, y cada instrucción que el procesador puede reconocer se llama instrucción de máquina . Cada tipo de procesador tiene su propio conjunto de instrucciones que reconoce, denominado conjunto de instrucciones. Cuando el procesador ejecuta una instrucción, toma diferentes acciones de acuerdo con diferentes instrucciones y completa diferentes funciones, que no solo pueden cambiar su propio estado de funcionamiento interno, sino también controlar el estado de funcionamiento de otros circuitos periféricos.

Otra característica del lenguaje ensamblador es que los objetos que opera no son datos específicos, sino registros o memoria, lo que significa que trata directamente con los registros y la memoria , por lo que la velocidad de ejecución del lenguaje ensamblador es más rápida que otros lenguajes, pero también facilita la programación. más complicado. Por ejemplo, en el ejemplo anterior, no podemos usar los datos directamente como un lenguaje de alto nivel, sino que primero sacamos los datos de los registros AX y BX correspondientes. Esto también aumenta la complejidad de la programación, porque el abordaje de esta parte del trabajo en lenguajes de alto nivel lo hace el sistema de compilación, mientras que en lenguaje ensamblador lo hacen los propios programadores, lo que aumenta la complejidad de la programación.

Además, las instrucciones en lenguaje ensamblador son una especie de representación simbólica de las instrucciones de máquina, y los diferentes tipos de CPU tienen diferentes sistemas de instrucciones de máquina y, por lo tanto, tienen diferentes lenguajes ensambladores . Por lo tanto, los programas en lenguaje ensamblador están estrechamente relacionados con las máquinas. Por lo tanto, además de cierto grado de portabilidad de los programas en lenguaje ensamblador entre CPU de la misma serie y diferentes modelos, los programas en lenguaje ensamblador entre otras CPU de diferentes tipos (como minicomputadoras y microcomputadoras, etc.) no pueden ser portados, es decir, Los programas en lenguaje ensamblador son menos versátiles y portátiles que los programas en lenguaje de alto nivel.

0x03 composición del lenguaje

transmisión de datos

Esta parte de las instrucciones incluye la instrucción general de transferencia de datos MOV, la instrucción de transferencia condicional CMOVcc, la instrucción de operación de pila PUSH/PUSHA/PUSHAD/POP/POPA/POPAD, la instrucción de intercambio XCHG/XLAT/BSWAP, el selector de dirección o descriptor de segmento instrucción de transferencia LEA/LDS /LES/LFS/LGS/LSS, etc. Tenga en cuenta que CMOVcc no es una instrucción específica, sino un grupo de instrucciones, que incluye una gran cantidad de instrucciones, que se utilizan para decidir si realizar una operación de transferencia específica de acuerdo con ciertos estados de bits del registro EFLAGS.

Operaciones lógicas y enteras

Esta parte de las instrucciones se utiliza para realizar operaciones aritméticas y lógicas, incluidas las instrucciones de suma ADD/ADC, las instrucciones de resta SUB/SBB, más una instrucción INC, menos una instrucción DEC, la instrucción de operación de comparación CMP, la instrucción de multiplicación MUL/IMUL y la división. instrucción DIV/IDIV, instrucción de extensión de signo CBW/CWDE/CDQE, instrucción de ajuste decimal DAA/DAS/AAA/AAS, instrucción de operación lógica NOT/AND/OR/XOR/TEST, etc.

instrucción de cambio

Esta parte de la instrucción se usa para mover un registro o un operando de memoria un número específico de veces. Incluye instrucción de desplazamiento lógico a la izquierda SHL, instrucción de desplazamiento lógico a la derecha SHR, instrucción de desplazamiento aritmético a la izquierda SAL, instrucción de desplazamiento aritmético a la derecha SAR, instrucción de desplazamiento circular a la izquierda ROL, instrucción de desplazamiento circular a la derecha ROR, etc.

instrucciones de manipulación de bits

Algunas de las instrucciones incluyen la instrucción de prueba de bit BT, la instrucción de prueba de bit e instrucción BTS, la instrucción de prueba de bit y reinicio BTR, la instrucción de prueba de bit y negación BTC, la instrucción de exploración de bits hacia delante BSF, la instrucción de exploración de bits hacia atrás BSR, etc.

Instrucción de establecimiento de condiciones

Esta no es una instrucción específica, sino un grupo de instrucciones, que incluye unas 30 instrucciones, que se utiliza para establecer un registro de 8 bits o un operando de memoria en función del estado de algunos bits en el registro EFLAGS. Como SETE/SETNE/SETGE, etc.

instrucción de transferencia de control

Esta parte incluye la instrucción de transferencia incondicional JMP, la instrucción de transferencia condicional Jcc/JCXZ, la instrucción de bucle LOOP/LOOPE/LOOPNE, la instrucción de llamada de procedimiento CALL, la instrucción de retorno de subprocedimiento RET, la instrucción de interrupción INTn, INT3, INTO, IRET, etc. Tenga en cuenta que Jcc es un grupo de instrucciones que contiene muchas instrucciones para decidir si transferir o no de acuerdo con algunos estados de bits del registro EFLAGS; INT n es una instrucción de interrupción suave y n puede ser un número entre 0 y 255 para indicar una interrupción Número de vectores.

Por ejemplo, la interrupción INT 13 se usa para lectura y escritura de disco.

manipulación de cadenas

Esta parte de las instrucciones se usa para operar la cadena de datos, incluida la instrucción de transferencia de cadena MOVS, la instrucción de comparación de cadena CMPS, la instrucción de exploración de cadena SCANS, la instrucción de carga de cadena LODS y la instrucción de almacenamiento de cadena STOS. REP/REPE/REPZ/ Los prefijos REPNE y REPNZ operan consecutivamente.

Instrucciones de E/S

Esta parte de los comandos se utiliza para intercambiar datos con dispositivos periféricos, incluidos los comandos de entrada de puerto IN/INS y los comandos de salida de puerto OUT/OUTS.

asistencia lingüística de alto nivel

Esta parte de las instrucciones brinda comodidad al compilador del lenguaje de alto nivel, incluida la instrucción ENTER para crear un marco de pila y la instrucción LEAVE para liberar el marco de pila.

Instrucciones de Control y Privilegio

Esta parte no incluye instrucción de operación NOP, instrucción de parada HLT, instrucción de espera WAIT/MWAIT, instrucción de escape ESC, instrucción de bloque de bus LOCK, instrucción de verificación de rango de memoria BOUND, instrucción de operación de tabla de descriptor global LGDT/SGDT, instrucción de operación de tabla de descriptor de interrupción LIDT/SIDT , instrucción de operación de tabla de descriptor local LLDT/SLDT, instrucción de carga de valor límite de segmento de descriptor LSR, instrucción de lectura de derecho de acceso de descriptor LAR, instrucción de operación de registro de tarea LTR/STR, instrucción de ajuste de nivel de privilegio de solicitud ARPL, indicador de cambio de tarea instrucción clara CLTS, registro de control y instrucción de transferencia de datos de registro de depuración MOV, instrucción de control de caché INVD/WBINVD/INVLPG, instrucción de lectura y escritura de registro dependiente del modelo RDMSR/WRMSR, instrucción de adquisición de información del procesador CPUID, instrucción de lectura de marca de tiempo RDTSC et al.

coma flotante e instrucciones multimedia

Esta parte de las instrucciones se utiliza para acelerar la operación de datos de coma flotante y las instrucciones de instrucción única-datos múltiples (SIMD y su extensión SSEx) para acelerar el procesamiento de datos multimedia. Esta parte de los datos de instrucciones es muy grande y no se puede enumerar uno por uno. Consulte el manual de INTEL usted mismo.

extensión de máquina virtual

Esta parte de las instrucciones incluye INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON, etc.

Supongo que te gusta

Origin blog.csdn.net/weixin_43466027/article/details/117430012
Recomendado
Clasificación