Suma y resta en Ensamblador X86

Josué Acevedo Maldonado
Nabucodonosor Editorial
3 min readApr 27, 2020

Dos operaciones basicas, que sufren un pequeño cambio.

Photo by Kelly Sikkema on Unsplash

La operación de suma o adicción (ADD) permite realizar la suma de dos números enteros a nivel de bits, de igual forma que la operación de sustracción (SUB) permite restar dos números enteros, en ambos casos los datos a operar pueden estar almacenados en registros de 8, 16, 32 o 64 bits.

ADD destino, fuenteSUB destino, fuente

De este modo, en un lenguaje de alto nivel se puede representar la suma echa en ensamblador como:

destino = destino + fuente

donde el operando destino forma parte de la operación y al mismo tiempo almacena el resultado de la misma, el mismo proceso ocurre con la resta.

destino = destino — fuente

Ambas operaciones aritméticas tanto suma como resta se pueden realizar entre:

  • Dos registros.
  • Un registro y una ubicación de memoria.
  • Una ubicación de memoria y un registro.
  • Un registro y una ubicación de memoria.
  • Un registro y una constante.
  • Una ubicación de memoria y una constante.

Las operaciones de suma y resta afectan las banderas de estado de acarreo y de desbordamiento.

segment .bss
res resb 1
section .text
global _start
_start:

mov eax, 2 ; en el registro eax de 32 bits se almacena un 2
mov ebx, 3 ; en el registro ebx de 32 bits se almacena un 3
add eax, ebx ;se realiza la suma de los valores almacenados
;en los registros eax y ebx, el resultado se almacena en eax
; imprime en en pantalla el resultado
; convirtiendo el número a su correspondiente código ASCII
; sumado 48 o el caracter '0' (cero)
add eax, '0'


mov [res], eax
mov eax, 4
mov ebx, 1
mov ecx, res
mov edx, 1
int 0x80
mov eax, 5 ; en el registro eax de 32 bits se almacena un 5
mov ebx, 2 ; en el registro ebx de 32 bits se almacena un 2
sub eax, ebx ;se realiza la resta de los valores almacenados
;en los registros eax y ebx, el resultado se almacena en eax
add eax, '0'


mov [res], eax
mov eax, 4
mov ebx, 1
mov ecx, res
mov edx, 1
int 0x80

salir:
mov eax, 1
mov ebx, 0
int 0x80

En esta salida en pantalla como no se envió a imprimir los caracteres de nueva línea y retorno de carro, el resultado de ambas operaciones se colocan juntos; sin embargo, si se recuerda el orden en el que se realizaron las impresiones en pantalla, el ’5’ corresponde al resultado de la suma y el ’3’ al resultado de la resta.

/code # nasm -f elf sumaresta.asm /code # ld -m -o elf_i386 sumaresta sumaresta.o 

/code # ./sumaresta
53/code #

Para realizar la suma y la resta en Ensamblador con acarreo, se emplearán un par de instrucciones que son variaciones de las anteriores, la diferencia principal radica en que la operación toma en cuenta el valor de la bandera de acarreo.

ADC destino fuenteSBB destino fuente

Por lo tanto, si en la bandera de acarreo existe un uno y se realiza la suma de cuatro y tres, el resultado será ocho.

destino = destino + fuente+ acarreo

Josue Acevedo Maldonado es ingeniero de software, trabaja actualmente como consultor.

Conectarse en LinkedIn.

¡Gracias por ser parte de la comunidad!
Puede encontrar contenido relacionado en el canal de YouTube, Twitter, Twitch, Spotify, etc, ademas del libro Ensamblador X86.

Si ha disfrutado de este artículo y siente que ha aprendido algo valioso, por favor compártalo.

¡Gracias por leer!

--

--

Josué Acevedo Maldonado
Nabucodonosor Editorial

Amante de la tecnologia y con pasion en resolver problemas interesantes, consultor, y creador del canal de youtube NEOMATRIX. https://linktr.ee/neomatrix