Código ensamblador Nios II: ejemplos de aritmética y multiplicación por desplazamiento
Ejemplos de programación en ensamblador Nios II
Primer programa: aritmética con paso de parámetros por pila
global _start
_start:
movia sp, 0x007FFFFC
movia r9, res
movi r4, 1
movi r5, 3
movi r6, 5
movi r7, 7
addi sp, sp, -12
movi r2, 10
stw r2, 0(sp)
movi r2, 12
stw r2, 4(sp)
movi r2, 14
stw r2, 8(sp)
call arit7
addi sp, sp, 12
ldw r10, 0(r9)
add r10, r10, r2
stw r10, 0(r9)
fin:
br fin
arit7:
add r2, r4, r5
sub r2, r2, r6
add r2, r2, r7
ldw r7, 0(sp)
add r2, r2, r7
ldw r7, 4(sp)
sub r2, r2, r7
ldw r7, 8(sp)
sub r2, r2, r7
retsub:
ret
.org 0x1000
res:
.word 9
.end
Segundo programa: versión duplicada del primero
global _start
_start:
movia sp, 0x007FFFFC
movia r9, res
movi r4, 1
movi r5, 3
movi r6, 5
movi r7, 7
addi sp, sp, -12
movi r2, 10
stw r2, 0(sp)
movi r2, 12
stw r2, 4(sp)
movi r2, 14
stw r2, 8(sp)
call arit7
addi sp, sp, 12
ldw r10, 0(r9)
add r10, r10, r2
stw r10, 0(r9)
fin:
br fin
arit7:
add r2, r4, r5
sub r2, r2, r6
add r2, r2, r7
ldw r7, 0(sp)
add r2, r2, r7
ldw r7, 4(sp)
sub r2, r2, r7
ldw r7, 8(sp)
sub r2, r2, r7
retsub:
ret
.org 0x1000
res:
.word 9
.end
Tercer programa: multiplicación mediante desplazamientos y suma
.global _start
_start:
movia r2, A(r0)
/movia r3, B(r0)
ldw r6, 0(r2)
/ldw r7, 0(r3)
addi r5, r0, 0x1
/addi r4, r0, 32 #CONTADOR DE DÍGITOS
addi r8, r0, 0 #ACUMULADOR DEL RESULTADO
loopMUL:
/and r9, r7, r5 #COMPRUEBA ÚLTIMO BIT
/beq r7, r0, salir #Si el multiplicador B llega a 0 antes de los 32 bits, termina
add r8, r8, r6 #SUMA EL VALOR DE A AL ACUMULADOR
salida:
/subi r4, r4, 1 #Resta 1 al contador
slli r6, r6, 1 #Desplaza a la izquierda (equivale a multiplicar por 2: 2, 4, 8, 16...)
beq r6, r0, fin # Si al desplazar, A se vuelve 0 (por desbordamiento) termina el programa
srli r7, r7, 1 #Equivale a dividir por 2 (eliminando el bit que acabamos de procesar)
/beq r7, r0, salir # Si B se queda sin bits (es decir, vale 0), vamos a guardar el resultado
bgt r4, r0, loopMUL #Si el contador de bits r4 sigue siendo mayor que 0, vuelve a empezar el bucle
salir:
/stw r8, RESULTADO(r0)
fin:
br fin
.org 0x500
A:
.word 6
B:
.word 7
RESULTADO:
/.skip 4
.end