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

  1. 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

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

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

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

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.

Ejemplo 6

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

  1. Instrucción aritmética , ScienceDirect
  2. Enteros con signo y sin signo , nhn.ou.edu