Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- dividendo: .word 36 //guardamos o enteiro 36 na variable dividendo
- mensaxe: .asciz "%d\n" /* compoñemos o formato da mensaxe en asciz
- isto será o que se imprime en pantalla
- %d significa que se cargará un número */
- .balign 4 /* indicamos cantos bits debe saltar en memoria
- para asigar o tamaño de cada divisor */
- divisores: .skip 500 /* asignamos o tamaño do array en memoria
- (cantos bits debe saltar desde a primeira posición) */
- .text
- .global main
- main:
- ldr r5, =divisores //gardamos no rexistro r5 o punteiro ao array
- mov r6, #0 //damos valor 0 a r6 (contador de elementos)
- mov r7, #0 //damos valor 0 a r7 (contador de elementos no print)
- push {lr} /* gardamos o rexistro lr para poder retornar a el
- ao final, xa que a instrucción bl machaca as
- variables usadas */
- ldr r1, =dividendo //cargamos no rexistro r1 o punteiro ao dividendo
- ldr r1, [r1] //cargamos no rexistro r1 o valor que indica r1
- mov r2, #1 //dámoslle a r2 (divisor) o valor 1 para empezar
- bucle:
- cmp r2, r1 //comparamos r2 (divisor) e r1 (dividendo)
- beq imprimir //se son iguales (non hai máis divisores), imprime
- mov r3, #0 //damos valor 0 a r3 (cociente)
- mov r4, r1 //dámoslle a r4 (resto) o valor de r1 (dividendo)
- div:
- cmp r4, r2 //comparamos r4 (resto) e r2 (divisor)
- blt resto //se r4 (resto) é menor, salta a calcular o resto
- sub r4, r2 //restámoslle a r4 (resto) o r2 (divisor)
- add r3, #1 //sumamos 1 a r3 (cociente)
- b div //volvemos ó bucle de división
- resto:
- MLS r4, r2, r3, r1 /* calculamos o resto en r4 mediante:
- r4 <- r1 - (r2 * r3) */
- cmp r4, #0 //comparamos se o resto (r4) é igual a 0
- bne nonanhadir /* se non é, non engadimos e saltamos a nonanhadir
- se o é, continuamos á seguinte instrucción */
- add r8, r5, r6, LSL #2 /* r8 <- r5 + (r6 * 4) gardamos en r8 o valor da
- posición de memoria correspondente do array. Vai
- aumentando 4 bits a medida que lle sumas 1 a r6
- (contador de elementos)*/
- str r2, [r8] /* gardamos o valor do divisor (r2) na posición que
- indica r8*/
- //str r2, [r5], #4 /* collemos o valor de r2 (divisor), metémolo na
- primeira posición do array (r5) e facemos que se mova
- aos 4 bits seguintes do array (comentado porque non
- consigo facer que funcione, non garda os resultados*/
- add r6, #1 //sumamos 1 no contador de elementos (r6)
- nonanhadir:
- add r2, #1 //sumámoslle un ao divisor para comprobar o seguinte
- b bucle //volvemos a bucle
- imprimir:
- cmp r7, r6 //comparamos o contador de elementos (r6) co novo
- beq fin //para rematar cando pase por tódolos elementos
- ldr r0, =mensaxe /* gardamos en r0 a mensaxe, porque, tanto print como
- scan, usan este rexistro como o formato do que van
- imprimir/escanear */
- ldr r1, [r5], #4 /* cargamos en r1 o valor da primeira posición da
- tabla e movémolo 4 bits para adiante. Da mesma forma
- que r0, o r1 úsano para imprimir/escanear a primeira
- variable, neste caso un número (%d) */
- push {r0, r1, r5, r6, r7} //gardamos os rexistros para que non se machaquen
- bl printf //lanzamos a instrucción de imprimir
- pop {r0, r1, r5, r6, r7}//recuperamos os rexistros que gardamos previamente
- add r7, #1 //sumamos 1 ó contador de elementos novo (r7)
- b imprimir //volvemos ó bucle de imprimir
- fin:
- pop {lr} /* para poder cerrar o programa necesitamos recuperar
- bx lr o rexistro lr, polo que facemos un pop */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement