⚙️INSTRUCCI0NES ARITMETICAS

Instrucciones Aritmeticas

Instruccion INC

La instrucion INC se usa para incrementar un operando en uno. Funciona en un solo operando que puede estar en un registro o en memoria.

SINTAXIS:

INC detination

El destino del operando podria ser un operando de 8 bits, 16 bits o 32 bits.

EJEMPLO:

INC EBX        ; Incrementa el registro a 32 bits
INC DL         ; Incrementa el registro a 8 bits
INC [count]    ; Incrementa la variable del contador

Instruccion DEC

Se usa para decrementar un operando en uno.

DEC destination

El destino del operando podria ser un operando de 8 bitsm 16 bits o 32 bits.

EJEMPLO:

segment .data
    count dw 0
    value db 15
    
segment .text
    inc [count]
    dec [value]
    
    mov edx, count
    inc word [ebx]
    
    mov esi, value
    dec byte [esi]

Instrucciones ADD y SUB (Suma y Resta)

estas instrucciones se utilizan para realizar sumas/restas simples de datos binarios en byte, palabra y palabra doble, es decir, para sumar o restar operandos de 8 bits, 16 bits o 32 bits, respectivamente.

ADD/SUB    detination, source

La instruccion ADD/SUB puede tener lugar entre:

  • Registrese para registrarse.

  • Memoria para registrar.

  • Registrarse en la memoria.

  • Registrese a datos constantes.

  • Memoria a datos constantes.

Al igual que otras instrucciones, las operaciones de memoria a mamoria no son posibles con las instrucciones ADD/SUB. Una operacion ADD o SUB establece o borra los indicadores de desbordamiento.

EJEMPLO:

Se pedira dos digitos al ususario, los almacenara en EAX y EBX, agregara los valores, almacenara el resultado en una ubicacion de memoria res y al final muestra el resultado.

SYS_EXIT    equ 1
SYS_READ    equ 3
SYS_WRITE   equ 4        ; Esta parte almacena las constantes.
STDIN       equ 0
STDOUT      equ 1


; Este segmento .data nos da lo que imprime y la longitud del texto.
segment .data
    
    msg1 db "Ingrese el primer digito :", 0xA, 0xD
    len1 equ $ - msg1
    
    msg2 db "Ingrese el segundo digito :", 0xA, 0xD
    len2 equ $ - len2
    
    msg3 db "La suma es :"
    len3 equ $ - msg3


; Segmento .bss utilizado para el input (Toma el teclado)
; El resb almacena bits pero nos los inicializa
segment .bss
    num1 resb 2    ; Variable num1 con directiva resb almacena 2 bits
    num2 resb 2    ; Igual
    res resb 1     ; Variable res con un bit para el resultado de la suma.


; Iniciamos programa
segment .text
    global _start

_start:

    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, msg1            ; Llamamos al primero mesaje.
    mov edx, len1
    int 0x80
    
    ; Leemos el primer input
    mov eax, SYS_READ        ; Eax = 3 para leer
    mov ebx, STDIN           ; un ebx a 0 para que tome el teclado
    mov ecx, num1            ; Direcciona a num1 de .bss
    mov edx, 2               ; Tomara el length an 2 bits.
    int 0x80
    
    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, msg2            ; Llamamos al segundo mensaje
    mov edx, len2
    int 0x80
    
    ; Leemos el segundo input
    mov eax, SYS_READ
    mov ebx, STDIN
    mov ecx, num2
    mov edx, 2
    int 0x80
    
    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, msg3              ; Imprimimos el tercer mensaje.
    mov edx, len3
    int 0x80
    
    ; Suma de los valores que metimos en el input.
    
    ; Agrega el primer valor a eax.
    mov eax, [num1]
    sub eax, '0'            ; Quita el valor ASCII
    
    ; Agrega el segundo valor a ebx.
    mov ebx, [num2]
    sub ebx, '0'            ; Quita el valor ASCII
    
    ; Suma 
    add eax, ebx            ; Suma los numero y almacena el resultado en eax.
    add eax, '0'            ; Pasa el valor a ASCII.
    mov [res], eax          ; Esto mueve el valor del resultado eax a res.
    
    
    ; LLamada para imprimir el resultado
    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, res        ; Direccion de la llamada.
    mov edx, 1          ; Cantidad de bits o caracteres.
    int 0x80

; salida del programa
exit:

    mov eax, SYS_EXIT    ; eax = 1 exit
    xor ebx, ebx         ; Con esto se resetea ebx para evitar fallas 
    int 0x80             ; Llamada al kernel para salir.

Instruccion MUL/IMUL (Multiplicacion)

El MUL maneja datos sin firmar y IMUL maneja datos con signo. Pero ambos afectan la bandera de Acarreo Y Desbordamiento.

SINTAXIS:

MUL/IMUL multiplier

La multiplicacion en ambos casos estar en un acomulador, dependiendo del tamaño del multipicando y el multiplicador y el producto generado tambien se almacena en dos registros dependiendo del tamañode los operandos.

Vemos el siguiente ejemplo:

EJEMPLO:

mov al, 10        ; Se le da valor al registro al
mov dl, 25
mul dl            ; Se encarga de multiplicar sin signo.

--
mov dl, 0FFH        ; Representa -1 en binario y agrega la H para deci hex.
mov al, 0BEH        ; -66
imul dl             ; Multiplica con signo 

Ejemplo multiplicando 3 y 2 , imprimiendo el resultado:

section	.text
   global _start    
	
_start:             

   mov	al,'3'         ; Le damos valor a al -> 3
   sub  al, '0'        ; Reseteamos el al
	
   mov 	bl, '2'        ; Damos el segundo valor bl -> 2
   sub  bl, '0'        ; Resetamos bl
   mul 	bl             ; Multiplicamos
   
   
   add	al, '0'        ; Regresamos el valor a al
	
   mov 	[res], al      ; Movemos el valor al a una variable res.
   mov	ecx,msg	        
   mov	edx, len
   mov	ebx,1	
   mov	eax,4	
   int	0x80	
	
   mov	ecx,res        ; Pasamos el valor de la variable res ala direccion ecx.
   mov	edx, 1
   mov	ebx,1	
   mov	eax,4	
   int	0x80	
	
   mov	eax,1	
   int	0x80	

section .data
   msg db "The result is:", 0xA,0xD ; En esta parte se agrega el 0xA y 0xD para salto de linea,
   len equ $- msg   
   
   
segment .bss
   res resb 1            ; Esto se usa para la variable donde guarda la multi.

Instrucciones DIV/IDIV

La division genera dos elementos, un cociente y un resto. En la division puede ocurrir desbordamiento. El procesador genera una interrupcion si se produce un desbordamiento.

Igual DIV -> sin firma o signo, IDIV-> datos con signo.

SINTAXIS

DIV/IDIV dividor

El dividendo esta en un acomulador. Ambas instrucciones pueden funcionar el operandos de 8 bits, 16 bits o 32 bits. La operacion afecta a los seis indicadores de estado.

Vemamos tres casos de division con diferentes tamaños:

EJEMPLO:

Divide 8 entre 2. El dividendo 8 se almacena ene l registro AX de 16 bits y el divisor se almacena en el registro bBL de 8 bits.

section	.text
   global _start    
   
_start:            
   mov	ax,'8'
   sub  ax, '0'
	
   mov 	bl, '2'
   sub  bl, '0'
   div 	bl
   
   add	ax, '0'
	
   mov 	[res], ax
   mov	ecx,msg	
   mov	edx, len
   mov	ebx,1	
   mov	eax,4	
   int	0x80	
	
   mov	ecx,res
   mov	edx, 1
   mov	ebx,1	
   mov	eax,4	
   int	0x80	
	
   mov	eax,1	
   int	0x80	
	
section .data
   msg db "The result is:", 0xA,0xD 
   len equ $- msg   


segment .bss
   res resb 1

Última actualización