Análisis de malware
Instrucciones aritméticas
26 de marzo de por Richard Azú
Introducción
Este artículo define las instrucciones aritméticas ejecutadas por procesadores x86. Continúa describiendo brevemente cuatro clasificaciones clave de instrucciones aritméticas: suma, resta, multiplicación y división.
Este artículo está diseñado para estudiantes y profesionales que desean obtener una comprensión detallada de las instrucciones aritméticas, sus clasificaciones y cómo se utilizan. Mediante el uso de un emulador 8086, este artículo le brindará una mejor comprensión de las instrucciones aritméticas, su sintaxis y, en algunos casos, el flujo de memoria durante la ejecución.
Instrucciones aritméticas en x86.
Las instrucciones aritméticas definen el conjunto de operaciones realizadas por la Unidad Aritmética Lógica (ALU) del procesador. Este artículo discutirá sólo las cuatro operaciones clave de las instrucciones aritméticas.
Enteros en x86
Los enteros utilizados durante las operaciones aritméticas en x86 se pueden representar de dos modos: sin signo y con signo. Los enteros sin signo siempre son positivos o cero. Los enteros con signo pueden ser positivos o negativos.
AGREGAR
La instrucción de suma resume el contenido del operando de origen (segundo operando) y el operando de destino (primer operando) y luego coloca los resultados en el operando de origen.
Formato básico
AÑADIR destino,fuente
destino := destino + fuente
Ejemplo 1
- AÑADIR HACHA, 01 Agregue el valor hexadecimal 1l valor en el acumulador y mantenga la suma en el acumulador
- AÑADIR AX, CX; Sume los valores en los registros CX y AX. Mantener la suma en el acumulador.
- AÑADIR HACHA, [DI] ; Agregue el valor en la dirección dada por el índice de destino DI al registro AX. Mantener el valor en el acumulador.
- AÑADIR HACHA, [5777H]; Agregue el valor en la dirección 5777 al acumulador. Mantener la suma en el acumulador.
- AÑADIR [5777H] , 0100H ; Agregue el valor hexadecimal 100 al valor en la dirección dada por 5777. Mantenga la suma en la dirección 5777
1: Contenido de los registros antes de la ejecución del Ejemplo 1
Como se muestra en la 1, el contenido del acumulador (registro AX) era 0000h antes de la ejecución de la línea 1 en el ejemplo 1.
2: Contenido del acumulador después de ejecutar la línea 1 en el ejemplo 1
CAD
La instrucción ADC resume el operando de destino (primer operando), el operando de origen (segundo operando) y el indicador de acarreo (CF). Luego almacena el valor resultante en el operando de destino.
Formato básico
Destino ADC, fuente
destino := destino + fuente + CF
Ejemplo 2
- ADC AX, 23h; Agregue el valor hexadecimal 23 al valor en el registro AX y la bandera de acarreo. Almacenar la suma en el registro AX
- ADC AX, BX; Agregue valores en los registros AX y BX al valor en el indicador de acarreo. Almacenar suma en AX
- AÑADIR AX, CX; Agregue valores en los registros, AX y CX al valor en la bandera de acarreo. Almacenar suma en AX
3: Estado del indicador de acarreo y de los registros AX, BX y CX antes de la ejecución de las instrucciones en el ejemplo 2
4: Estado del indicador de acarreo y de los registros AX, BX y CX después de la ejecución de las instrucciones en el ejemplo 2
5: Bandera de transporte configurada manualmente en 1 antes de la ejecución del código
6: Nuevo valor en el acumulador
SUB
La instrucción de resta resta el operando de origen (segundo operando) del operando de destino (primer operando) y el resultado se almacena en el operando de destino.
Formato básico
SUB destino, fuente
destino := destino – fuente
Ejemplo 3
- SUB AX, CX ; Reste el valor en el registro CX del valor en el acumulador. Guardar resultados en acumulador
- SUB AX, 01h ; Reste el valor hexadecimal 01 del valor en el acumulador. Guardar resultados en el acumulador.
En el ejemplo 3, supongamos que los registros AX y BX se inicializan manualmente de la siguiente manera:
HACHA = 1023h
CX = 1726h
Tenga en cuenta que estos registros también se pueden inicializar siguiendo las instrucciones:
MOV HACHA , 1023h ;
MOV CX , 1726h ;
7: Registros AX y CX inicializados manualmente antes de la ejecución de las instrucciones en el ejemplo 3
8: Contenido de los registros AX, CX y los indicadores de estado después de ejecutar las instrucciones del ejemplo 3
Tenga en cuenta el contenido de los indicadores de estado como se muestra en la 8. Este estado de los indicadores se produjo porque el valor en el registro CX es mayor que el valor en el registro AX.
MUL
La instrucción mul multiplica un operando de 8, 16 o 32 bits por AL , AX o EAX . Se multiplica por AL si el operando es de 8 bits, por AX si el operando es de 16 bits y por EAX si el operando es de 32 bits. El operando de esta instrucción no tiene signo.
9: Multiplicación con signo en x86
Formato básico
fuente MUL
Ejemplo 4
- HACHA MOV, Copia el valor decimall acumulador.
- MOV BX, 10d; Copia el valor decimal 10 a BX
- MUL BX; Multiplica los valores en AX y BX. El resultado se guarda en AX
10: Multiplicación de 8 bits de orden bajo
11: Estado de los registros AX y BX después de ejecutar las instrucciones del ejemplo 4
IMUL
IMUL utiliza el mismo formato básico que la instrucción MUL para realizar la multiplicación de enteros con signo.
Ejemplo 5
- MOV AL, 30 ; Copia el valor decimal 30 al acumulador.
- MOV BL, 3 ; Copie el valor decimal 3 para registrar BL
- IMUL BL ; Multiplica los valores en los registros AL y BL.
Debido a que AH es una extensión de signo de AL, el indicador de desbordamiento es 0. El indicador de desbordamiento se establece en 1 cuando AH no es una extensión de signo de AL.
12: Contenido de los registros de estado, el acumulador y el registro BX antes de que se ejecuten las instrucciones del ejemplo 5
13: Contenido de los registros de estado, el acumulador y el registro BX después de ejecutar las instrucciones del ejemplo 5
DIV
La instrucción DIV realiza operaciones de división de 8, 16 y 32 bits en enteros sin signo. El operando único se llama divisor y el cociente es el resultado de una división.
Supongamos que estamos dividiendo 7/3.
- el cociente es 2
- El resto después de la división de números enteros es 1.
- 7 se llama dividendo
- 3 es el divisor
Ejemplo 6
- MOV DX, 0 ; Borre el orden superior del registro DX configurándolo a cero
- HACHA MOV, 30; Establecer el orden inferior del dividendo
- MOV CX, 10; Establecer valor para divisor
- DIVCX; Cociente AX=0003h, DX=0h
Conclusión
Este artículo ha explicado cuatro instrucciones clave en operaciones aritméticas. Para ayudar de manera única a comprender cómo funcionan estas operaciones, el artículo también presenta el flujo de instrucciones durante sus ejecuciones.
¡Conviértete en un ingeniero inverso certificado!
Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender
Fuentes
- Instrucción aritmética , ScienceDirect
- Enteros con signo y sin signo , nhn.ou.edu