Saltar al contenido

Programación en ensamblador (Resumen III) – Instrucciones

Definición de otros elementos

Con la directiva global hacemos visibles las subrutinas que hemos escrito en ensamblador:

global programa1, subprograma2

Con la directiva extern podremos utilizar variables definidas en C que utilizaremos desde ensamblador.

extern edad, nombre, altura

 

Instrucciones

En ensamblador disponemos de una serie de instrucciones, estas instrucciones pueden tener operandos. Por ejemplo, si queremos mover el contenido de R8 a R9 haremos lo siguiente:

mov R9, R8 (destino, fuente).

Si queremos incrementar el registro rax, haremos lo siguiente:

Inc rax (destino y fuente).

Y si queremos salir de una subrutina escribiremos:

ret (sin operandos).

push rbx (almacena el valor rbx en la pila).

pop rbx (pone el valor de la pila en rbx).

Las instrucciones pueden utilizar x operandos que en general vendrán definidas en cada instrucción.

Los operandos más habituales para datos son rax, rbx, rdx, rcx, r8 a r15.

 

Forma de las instrucciones

La forma de las instrucciones sigue la siguiente distribución:

[etiqueta:] instrucción [destino[, fuente]] [;comentario]

Estos son algunos ejemplos de instrucciones:

 

  • mov ecx, eax
  • jg while_pow
  • jmp end_pow

Las Etiquetas

Definimos etiquetas como posiciones en el código programa a las que podemos acceder desde una instrucción de salto poniendo el nombre de la etiqueta:

Ejemplo:

jmp nombre_Etiqueta

La instrucción jmp irá a la posición del código en el que hayamos definido la etiqueta nombre_Etiqueta.

**Nota: NASM es case sensitive, por lo tanto distingue entre mayusculas y minusculas.

 

Juego de instrucciones

En ensamblador (NASM) podemos utilizar las siguientes instrucciones, la lista no está completa pero estas son las más generales:

Mover datos:

mov rbx,rdx (destino, fuente)

Introduce un dato en la cima de la pila:

push fuente:

Mueve el dato que hay encima de la pila al operador:

Pop destino:

Suma

add destino, fuente

Suma considerando el transporte

adc destino, fuente

Resta

sub destino, fuente

Resta considerando el borrow (transporte)

sbb destino, fuente

Incrementa

inc destino

Decrementa

dec destino

Multiplica sin tener en cuenta el signo

mul fuente

Multiplica teniendo en cuenta el signo

imul fuente

División entera sin signo

div fuente

División entera con signo

idiv fuente

Negación

neg destino

Comparación de dos operandos

cmp destino,fuente

Operaciones lógicas

and destino,fuente

or destino,fuente

xor destino,fuente

not destino (negación de cada bit)

Saltos

Salta a la etiqueta

jmp etiqueta

Salta a la etiqueta si el bit de cero está activo (jump equals)

je etiqueta

jne etiqueta (si no está activo)

Salta a la etiqueta si el bit de transporte está activo (jump carry)

jc etiqueta

jnc etiqueta (si no está activo)

Salta a la etiqueta si el bit de desbordamiento está activo (jump overflow)

jo etiqueta

jno etiqueta (si no está activo)

Salta a la etiqueta si el bit de signo está activo.

js etiqueta

jns etiqueta (si no está activo)

Cambios de secuencia

Llamar a una subrutina

call etiqueta

Retorno de una subrutina

ret

Llamada al sistema operativo

int servicio

Si queréis una tabla de instrucciones más completa podéis visitar esta web