Instrucciones Aritméticas

Instrucciones aritméticas. Realizan operaciones aritméticas sobre números binarios puros o en Complemento a 2. Son instrucciones de este grupo add, cmp, adc, sbc, mul.

add

Suma sin afectar al carry

add{s}{cond} {rd}, rn, Oper2

add{cond} {rd}, rn, #imm8

La instrucción add suma en rd los valores de rn y Operand2 o imm8. En ciertas circunstancias, el ensamblador puede sustituir una instrucción por otra. Tenelo en cuenta si tenes que leer un listado desensamblado.

donde:

s es opcional, si se especifica, se actualiza el registro de flags CPSR, de acuerdo al resultado.

cond opcional, es un código de condición.

rd Registro destino.

rn es el registro que contiene el primer operando.

Oper2 segundo operando.

imm8 Es cualquier valor que va de 0-4095.

Códigos de Condicion

Código	Sufijo	Flags	Significado
0000	eq	Z set	Igual
0001	ne	Z clear	No Igual
0011	cs	C set	Mayor o igual sin signo
0011	cc	C clear	Menor sin signo
0100	mi	N set	Negativo
0101	pl	N clear	Positivo o cero
0110	vs	V set	Overflow
0111	vc	V clear	No overflow
1000	hi	C set and Z clear	mayor sin signo
1001	ls	C clear and Z set	menor o igual sin signo
1010	ge	N equals V	Mayor o igual
1011	lt	N not equal to V	Menor que
1100	gt	Z clear AND (N equal to V)	Mayor que
1101	le	Z set OR (N not equal to V)	menor o igual que
1110	al	(ignored)	always, siempre

Ejemplo:

mov r1, #5 @ R1 <-- 5
mov r2, #10 @ R2 <-- 10
add r0, r1, r2 @ R0 <-- 5 + 10 sin afectar el registro CPSR
adds r3, r1, r2 @ R3 <-- 5 + 10 afectando el registro CPSR

La forma de ver como se modifica el registro CPSR, es cuando debugueamos con gdb

i r cpsr

Flags que modifica:

Si se especifica s, estas instrucciones actualizan los indicadores N, Z, C y V de acuerdo con el resultado.

adc

Suma con carry

adc{s}{cond} {rd}, rn, Oper2

La instrucción adc (suma con acarreo) suma los valores en rn y Oper2, junto con el flag de acarreo.

donde:

s es opcional, si se especifica, se actualiza el registro de flags CPSR, de acuerdo al resultado.

cond opcional, es un código de condición.

rd Registro destino.

rn es el registro que contiene el primer operando.

Oper2 segundo operando.

Ejemplo:

mov r1, #5 @ R1 <-- 5
mov r2, #10 @ R2 <-- 10
adc r0, r1, r2 @ R0 <-- 5 + 10 + carry

La forma de ver como se modifica el registro CPSR, es cuando debugueamos con gdb

i r cpsr

Flags que modifica:

Si se especifica s, estas instrucciones actualizan los indicadores N, Z, C y V de acuerdo con el resultado.

sub

Resta sin afectar al carry

sub{s}{cond} {rd}, rn, Oper2

sub{cond} {rd}, rn, #imm8

La instrucción sub resta en rd= rn - Oper2. En ciertas circunstancias, el ensamblador puede sustituir una instrucción por otra. Tenelo en cuenta si tenes que leer un listado desensamblado.

donde:

s es opcional, si se especifica, se actualiza el registro de flags CPSR, de acuerdo al resultado.

cond opcional, es un código de condición.

rd Registro destino.

rn es el registro que contiene el primer operando.

Oper2 segundo operando.

imm8 Es cualquier valor que va de 0-4095.

Ejemplo:

mov r1, #15 @ R1 <-- 5
mov r2, #10 @ R2 <-- 10
sub r0, r1, r2 @ R0 <-- 15 - 10 sin afectar el registro CPSR
subs r3, r1, r2 @ R3 <-- 15 - 10 sin afectar el registro CPSR

La forma de ver como se modifica el registro CPSR, es cuando debugueamos con gdb

i r cpsr

Flags que modifica:

Si se especifica s, estas instrucciones actualizan los indicadores N, Z, C y V de acuerdo con el resultado.

sbc

Restar con carry

sbc{s}{cond} {rd}, rn, Oper2

La instrucción sbc (Restar con acarreo) resta el valor de Oper2 del valor en rn. Si el flag carry es cero es clara, el resultado se le resta uno.

donde:

s es opcional, si se especifica, se actualiza el registro de flags CPSR, de acuerdo al resultado.

cond opcional, es un código de condición.

rd Registro destino.

rn es el registro que contiene el primer operando.

Oper2 segundo operando.

Ejemplo:

mov r1, #15 @ R1 <-- 5
mov r2, #10 @ R2 <-- 10
sbc r3, r1, r2 @ R3 <-- 15 - 10 -1, si carry=0

La forma de ver como se modifica el registro CPSR, es cuando debugueamos con gdb

i r cpsr

Flags que modifica:

Si se especifica s, estas instrucciones actualizan los indicadores N, Z, C y V de acuerdo con el resultado.

cmp y cmn

Estas instrucciones comparan el valor en un registro con Operando2. Actualizan los indicadores (bits) del registro de flags: CPSR en base al resultado, el resultado no afecta a ningún registro.

cmp{cond} rn, Operando2

cmn{cond} rn, Operando2

donde:

cond es un código de condición opcional

rn registro conteniendo el primer operando

Oper2 segundo operando

La instrucción cmp resta el valor de Operando2 del valor en rn. Esto es lo mismo que una instrucción subs, excepto que el resultado se descarta.

La instrucción cmn Compare Negative agrega el valor de Operando2 al valor en rn. Esto es lo mismo que una instrucción adds, excepto que el resultado se descarta.

Flags que modifica:

Estas instrucciones actualizan los flags N, Z, C y V de acuerdo con el resultado.

Ejemplo:

mov r1, #5	@ R1 <-- 5
mov r2, #10 @ R2 <-- 10
cmp r1, r2	@ Compara los valores de los registros seteando flags.

()