Sei sulla pagina 1di 4

Lenguaje Ensamblador - Instrucciones aritméticas en ensamblador

Suma y resta

Los microprocesadores Intel 80x86 disponen de las instrucciones add y sub para realizar sumas y
restas respectivamente, estas instrucciones pueden trabajar sobre operandos de longitud byte (8bits),
word (16bits), double-word (32bits) y quad-word (64bits). Los operandos pueden ser números con
signo o sin signo, en caso de ser números con signo éstos son almacenados en su forma de
complemento a 2. Se debe observar que estas instrucciones realizan cambios en los bits del registro
de banderas, algunas banderas modificadas según el resultado de la operación son las banderas SF,
ZF, OF, CF, PF y DF.

Cada instrucción add tiene la forma:

add destino, fuente

cuando esta instrucción es ejecutada el valor que se encuentra en fuente es sumado al valor que se
encuentra en destino, sobrescribiendo el valor que originalmente se encontraba en destino por el
nuevo valor resultado de la adición.

Cada instrucción sub tiene la forma:

sub destino, fuente

cuando esta instrucción es ejecutada el valor que se encuentra en fuente es restado del valor que se
encuentra en destino, sobrescribiendo el valor que originalmente se encontraba en destino por el
nuevo valor resultado de la sustracción.

Debe observar que tanto para la suma como para la resta el valor de destino es cambiado por el
valor resultado de la operación, a diferencia del valor de fuente que permanece inalterado.

Ejemplos de uso de las instrucciones add y sub:

a) Antes Instrucción Después

AX: 33 11 AX: 44 11
BX: 11 00 add ax, bx BX: 11 00

b) Antes Instrucción Después

ECX: 00 00 0C 0A ECX: 00 00 34 AC
EAX: 00 00 28 A2 add ecx, eax EAX: 00 00 28 A2

c) Antes Instrucción Después

ECX: 01 00 FF 0E ECX: F2 36 21 B9
EDX: F1 35 22 AB add ecx, edx EDX: F1 35 22 AB

d) Antes Instrucción Después

AL: 54 AL: 22
BL: 32 sub al, bl BL: 32

1
Lenguaje Ensamblador - Instrucciones aritméticas en ensamblador

e) Antes Instrucción Después

CH: FA CH: 58
AL: A2 sub ch, al AL: A2

f) Antes Instrucción Después

CX: DE 5B CX: 23 17
DX: BB 44 sub cx, dx DX: BB 44

Las instrucciones inc y dec

Las instrucciones inc (increment) y dec (decrement) representan una suma y una resta donde el
operando fuente siempre es 1, la forma de cada una de ellas es la siguiente:

inc destino

dec destino

Ejemplos de uso de las instrucciones inc y dec:

a) Antes Instrucción Después

ECX: 00 00 0F A3 inc ecx ECX: 00 00 0F A4

b) Antes Instrucción Después

AH: DE inc ah AH: DF

c) Antes Instrucción Después

DX: 0F FF inc dx DX: 10 00

d) Antes Instrucción Después

EBX: FF FF FF FF dec ebx EBX: FF FF FF FE

e) Antes Instrucción Después

CL: 01 dec cl CL: 00

La instrucción neg

La instrucción neg (negate) niega o encuentra el complemento a 2 de su único operando. Si se aplica


la instrucción neg a un valor positivo éste se vuelve negativo, si se aplica a un valor negativo éste se
vuelve positivo, el cero permanece igual. La instrucción neg tiene la siguiente forma:

neg destino

2
Lenguaje Ensamblador - Instrucciones aritméticas en ensamblador

Ejemplos de uso de la instrucción neg:

a) Antes Instrucción Después

EBX: 00 00 01 A2 neg ebx EBX: FF FF FE 5E

b) Antes Instrucción Después

DH: F5 neg dh DH: 0B

c) Antes Instrucción Después

valor = 00 01 neg valor valor: FF FF

d) Antes Instrucción Después

EAX: 00 00 00 00 neg eax EAX: 00 00 00 00

Programa completo de ejemplo

Resuelva mediante ensamblador la expresión “–(x + y – 2z + 1)” si x=34, y=17 y z=14:

.586 ; usar operandos de 32 bits


.MODEL FLAT ; modelo de memoria plana, (no usar seg:des)
.STACK 4096 ; reservar 4096 bytes para la pila
.DATA ; inicia la sección de datos
x DWORD 34 ; declarar una variable de 32 bits de nombre x = 34
y DWORD 17 ; declarar una variable de 32 bits de nombre y = 17
z DWORD 14 ; declarar una variable de 32 bits de nombre z = 14
.CODE ; inicia la sección de código
main PROC ; inicia el procedimiento de nombre main
mov eax, x ; mover el valor de x al registro eax
add eax, y ; sumar el valor de y al valor del registro eax (x + y)
mov ebx, z ; mover el valor de z al registro ebx
add ebx, ebx ; sumar el valor de z al valor del registro ebx (2z)
sub eax, ebx ; restar de eax el valor de ebx (x + y – 2z)
inc eax ; añadir 1 al valor del registro eax (x + y – 2z + 1)
neg eax ; negar el valor contenido en eax -(x + y – 2z + 1)
mov eax, 0 ; terminar el programa con código de salida 0
ret
main ENDP ; termina el procedimiento main
END ; termina el modulo de programa

Complemento a 2 de un número binario

Al inicio de este documento se indicó que los números con signo son almacenados internamente en
las computadoras en su forma de complemento a 2, esto se hace así ya que es mucho más sencillo
tratar a los números negativos en su forma de complemento a 2, así mismo, también se señaló que la
instrucción neg de ensamblador obtiene el complemento a 2 de su operando.

Para encontrar el complemento a 2 de un número binario debe calcular la siguiente expresión:

2n – N

3
Lenguaje Ensamblador - Instrucciones aritméticas en ensamblador

Donde n es el número de bits sobre los cuales se quiere encontrar el complemento a 2 y N es el


número al cual se quiere encontrar su complemento a 2, para facilitar el cálculo, una vez encontrado el
valor 2n convierta éste valor a su equivalente binario y reste el número N, de esta manera, el binario
resultante será el complemento a 2 de N.

Ejemplos de complemento a 2:

a) Encuentre el complemento a 2 del número binario 0101 0011

Solución

Al observar los datos proporcionados vemos que n es igual a 8 y N es igual a 0101 0011,
sustituyendo en la fórmula tenemos

2n – N = (28)10 – (0101 0011)2 = (256)10 – (0101 0011)2 = (1 0000 0000)2 – (0101 0011)2 = (1010 1101)2

De esta manera, el complemento a 2 de 0101 0011 es 1010 1101.

b) Encuentre el complemento a 2 del número binario 1001 0110 1110 1111

Solución

Sea n = 16 y N = 1001 0110 1110 1111, sustituyendo

2n – N = (216)10 – (1001 0110 1110 1111)2


= (65 536)10 – (1001 0110 1110 1111)2
= (1 0000 0000 0000 0000)2 – (1001 0110 1110 1111)2 = (0110 1001 0001 0001)2

Por lo tanto, el complemento a 2 es 0110 1001 0001 0001.

Una forma más sencilla de encontrar el complemento a 2 de un número binario es dejando todos los
ceros menos significativos y el primer dígito diferente de cero sin cambio, para luego remplazar unos
por ceros y ceros por unos en el resto de dígitos más significativos.

c) Encuentre el complemento a 2 del número 1111 0011 0000 1010.

Solución

Siguiendo el método anterior encontramos que 0000 1100 1111 0110 es el complemento a 2
buscado.

d) Encuentre el complemento a 2 del número 0xF0B0

Solución

En este caso, el complemento a 2 solicitado es para la representación en base 2 del número


0xF0B0, por lo tanto, primero hay que convertir el número 0xF0B0 a su equivalente binario,
dando como resultado el número 1111 0000 1011 0000, posteriormente se encuentra el
complemento a 2 de este número, el complemento a 2 es 0000 1111 0101 0000, por último, se
convierte este número a su representación en base 16 dando como resultado 0x0F50.

Potrebbero piacerti anche