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