Eksperymenty z asemblerem ARMv7
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

mul.s 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. SYSEXIT = 1
  2. SYSREAD = 3
  3. SYSWRITE = 4
  4. STDIN = 0
  5. STDOUT = 1
  6. num_length = 256
  7. word_length = 4
  8. buf_length = num_length * 2
  9. num_words = num_length / word_length
  10. buf_words = buf_length / word_length
  11. .global main
  12. .bss
  13. num1: .space num_length
  14. num2: .space num_length
  15. result: .space buf_length
  16. .text
  17. main:
  18. loop:
  19. mov r7, #SYSREAD
  20. mov r0, #STDIN
  21. ldr r1, =num1
  22. mov r2, #buf_length
  23. swi 0x0
  24. cmp r0, #buf_length
  25. blt end
  26. ldr r8, =num1
  27. ldr r9, =num2
  28. ldr r10, =result
  29. eor r0, r0, r0
  30. eor r4, r4, r4
  31. zero:
  32. str r0, [r10, r4, lsl#2]
  33. add r4, r4, #1
  34. cmp r4, #buf_words
  35. blt zero
  36. eor r4, r4, r4
  37. loop1:
  38. eor r11, r11, r11
  39. eor r12, r12, r12
  40. eor r2, r2, r2
  41. eor r5, r5, r5
  42. loop2:
  43. ldr r0, [r8, r4, lsl#2]
  44. ldr r3, [r9, r5, lsl#2]
  45. umull r0, r1, r0, r3
  46. msr apsr_nzcvq, r11
  47. adcs r0, r0, r2
  48. mrs r11, apsr
  49. mov r2, r1
  50. add r6, r4, r5
  51. msr apsr_nzcvq, r12
  52. ldr r1, [r10, r6, lsl#2]
  53. adcs r1, r0, r1
  54. str r1, [r10, r6, lsl#2]
  55. mrs r12, apsr
  56. add r5, r5, #1
  57. cmp r5, #num_words
  58. blt loop2
  59. add r6, r6, #1
  60. msr apsr_nzcvq, r11
  61. adc r2, r2, #0
  62. msr apsr_nzcvq, r12
  63. ldr r1, [r10, r6, lsl#2]
  64. adc r1, r1, r2
  65. str r1, [r10, r6, lsl#2]
  66. add r4, r4, #1
  67. cmp r4, #num_words
  68. blt loop1
  69. mov r7, #SYSWRITE
  70. mov r0, #STDOUT
  71. ldr r1, =result
  72. mov r2, #buf_length
  73. swi 0x0
  74. b loop
  75. end:
  76. mov r7, #SYSEXIT
  77. mov r0, #0
  78. swi 0x0