Advertisement
Guest User

Untitled

a guest
Nov 9th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 3.39 KB | None | 0 0
  1. .data
  2. dividendo: .word 36     //guardamos o enteiro 36 na variable dividendo
  3. mensaxe: .asciz "%d\n"  /* compoñemos o formato da mensaxe en asciz
  4.             isto será o que se imprime en pantalla
  5.             %d significa que se cargará un número */
  6. .balign 4       /* indicamos cantos bits debe saltar en memoria
  7.             para asigar o tamaño de cada divisor */
  8. divisores: .skip 500    /* asignamos o tamaño do array en memoria
  9.             (cantos bits debe saltar desde a primeira posición) */
  10.  
  11.  
  12. .text
  13. .global main
  14. main:
  15. ldr r5, =divisores  //gardamos no rexistro r5 o punteiro ao array
  16. mov r6, #0      //damos valor 0 a r6 (contador de elementos)
  17. mov r7, #0      //damos valor 0 a r7 (contador de elementos no print)
  18. push {lr}       /* gardamos o rexistro lr para poder retornar a el
  19.             ao final, xa que a instrucción bl machaca as
  20.             variables usadas */
  21. ldr r1, =dividendo  //cargamos no rexistro r1 o punteiro ao dividendo
  22. ldr r1, [r1]        //cargamos no rexistro r1 o valor que indica r1
  23. mov r2, #1      //dámoslle a r2 (divisor) o valor 1 para empezar
  24.  
  25.  
  26.  
  27. bucle:
  28. cmp r2, r1      //comparamos r2 (divisor) e r1 (dividendo)
  29. beq imprimir        //se son iguales (non hai máis divisores), imprime
  30. mov r3, #0      //damos valor 0 a r3 (cociente)
  31. mov r4, r1      //dámoslle a r4 (resto) o valor de r1 (dividendo)
  32.  
  33.  
  34.  
  35. div:
  36. cmp r4, r2      //comparamos r4 (resto) e r2 (divisor)
  37. blt resto       //se r4 (resto) é menor, salta a calcular o resto
  38. sub r4, r2      //restámoslle a r4 (resto) o r2 (divisor)
  39. add r3, #1      //sumamos 1 a r3 (cociente)
  40. b div           //volvemos ó bucle de división
  41.  
  42.  
  43.  
  44. resto:
  45. MLS r4, r2, r3, r1  /* calculamos o resto en r4 mediante:
  46.             r4 <- r1 - (r2 * r3) */
  47. cmp r4, #0      //comparamos se o resto (r4) é igual a 0
  48. bne nonanhadir      /* se non é, non engadimos e saltamos a nonanhadir
  49.             se o é, continuamos á seguinte instrucción */
  50. add r8, r5, r6, LSL #2  /* r8 <- r5 + (r6 * 4) gardamos en r8 o valor da
  51.             posición de memoria correspondente do array. Vai
  52.             aumentando 4 bits a medida que lle sumas 1 a r6
  53.             (contador de elementos)*/
  54. str r2, [r8]        /* gardamos o valor do divisor (r2) na posición que
  55.             indica r8*/
  56. //str r2, [r5], #4  /* collemos o valor de r2 (divisor), metémolo na
  57.             primeira posición do array (r5) e facemos que se mova
  58.             aos 4 bits seguintes do array (comentado porque non
  59.             consigo facer que funcione, non garda os resultados*/
  60. add r6, #1      //sumamos 1 no contador de elementos (r6)
  61. nonanhadir:
  62. add r2, #1      //sumámoslle un ao divisor para comprobar o seguinte
  63. b bucle         //volvemos a bucle
  64.  
  65.  
  66.  
  67. imprimir:
  68. cmp r7, r6      //comparamos o contador de elementos (r6) co novo
  69. beq fin         //para rematar cando pase por tódolos elementos
  70. ldr r0, =mensaxe    /* gardamos en r0 a mensaxe, porque, tanto print como
  71.             scan, usan este rexistro como o formato do que van
  72.             imprimir/escanear */
  73. ldr r1, [r5], #4    /* cargamos en r1 o valor da primeira posición da
  74.             tabla e movémolo 4 bits para adiante. Da mesma forma
  75.             que r0, o r1 úsano para imprimir/escanear a primeira
  76.             variable, neste caso un número (%d) */
  77. push {r0, r1, r5, r6, r7} //gardamos os rexistros para que non se machaquen
  78. bl printf       //lanzamos a instrucción de imprimir
  79. pop {r0, r1, r5, r6, r7}//recuperamos os rexistros que gardamos previamente
  80. add r7, #1      //sumamos 1 ó contador de elementos novo (r7)
  81. b imprimir      //volvemos ó bucle de imprimir
  82.  
  83.  
  84.  
  85. fin:
  86. pop {lr}        /* para poder cerrar o programa necesitamos recuperar
  87. bx lr           o rexistro lr, polo que facemos un pop */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement