Eksperymenty z asemblerem ARMv7
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. @ Jan Potocki 2020
  2. @ Definicje numerow funkcji systemowych i ich parametrow
  3. SYSEXIT = 1
  4. SYSREAD = 3
  5. SYSWRITE = 4
  6. STDIN = 0
  7. STDOUT = 1
  8. @ Stale okreslajace rozmiar przetwarzanych danych
  9. num_length = 256
  10. @ ...tego nie ruszac - inaczej stanie sie "cud nad klawiatura" :-D
  11. word_length = 4
  12. buf_length = num_length * 2
  13. num_words = num_length / word_length
  14. buf_words = buf_length / word_length
  15. .global main
  16. @ Segment niezainicjalizowanych danych
  17. .bss
  18. num1: .space num_length
  19. num2: .space num_length
  20. result: .space buf_length
  21. @ Segment kodu
  22. .text
  23. main:
  24. @ Glowna petla
  25. loop:
  26. mov r7, #SYSREAD @ Wczytanie danych ze standardowego wejscia
  27. mov r0, #STDIN @ ...funkcja systemowa read
  28. ldr r1, =num1
  29. mov r2, #buf_length
  30. swi 0x0
  31. @ UWAGA
  32. @ Tutaj wczytane zostana od razu obie liczby
  33. @ num1 i num2 sa w pamieci bezposrednio po sobie...
  34. @ ...i zostala przekazana do funkcji read dlugosc calego bloku
  35. cmp r0, #buf_length @ r0 - liczba wczytanych bajtow
  36. blt end @ Jezeli nie ma 512, to dane sie skonczyly
  37. ldr r8, =num1 @ r8 - adres pierwszej liczby
  38. ldr r9, =num2 @ r9 - adres drugiej liczby
  39. ldr r10, =result @ r10 - adres bufora na wynik
  40. eor r0, r0, r0 @ r0 - wartosc zero (do zapisu w pamieci)
  41. eor r4, r4, r4 @ r4 - indeks petli zerujacej
  42. @ Petla zerujaca bufor na wynik
  43. zero:
  44. str r0, [r10, r4, lsl#2]
  45. add r4, r4, #1
  46. cmp r4, #buf_words
  47. blt zero
  48. eor r4, r4, r4 @ r0 - indeks pierwszej petli
  49. @ Mnozenie - petla zewnetrzna
  50. loop1:
  51. eor r2, r2, r2 @ r2 - miejsce na starsza czesc wyniku
  52. @ Flagi przeniesienia (potrzebne sa dwie i tego sie nie uprosci)
  53. eor r11, r11, r11 @ r11 - dla biezacego mnozenia (rejestry)
  54. eor r12, r12, r12 @ r12 - dla koncowego wyniku (w pamieci)
  55. eor r5, r5, r5 @ r5 - indeks drugiej petli
  56. @ Mnozenie - petla wewnetrzna
  57. loop2:
  58. ldr r0, [r8, r4, lsl#2]
  59. ldr r3, [r9, r5, lsl#2]
  60. umull r0, r1, r0, r3
  61. @ Dodanie starszej czesci wyniku z poprzedniej iteracji
  62. msr apsr_nzcvq, r11 @ Ladowanie flag z r11
  63. adcs r0, r0, r2 @ Dodawanie z przeniesieniem i ustawieniem flag
  64. mrs r11, apsr @ Zapis rejestru apsr (calego) w r11
  65. mov r2, r1 @ Przechowanie starszej czesci wyniku w r2
  66. add r6, r4, r5 @ r6 - indeks wyniku (suma indeksow obu petli)
  67. msr apsr_nzcvq, r12 @ Ladowanie flag z r12
  68. ldr r1, [r10, r6, lsl#2]
  69. adcs r1, r0, r1 @ Dodawanie z przeniesieniem i ustawieniem flag
  70. str r1, [r10, r6, lsl#2]
  71. mrs r12, apsr @ Zapis rejestru apsr (calego) w r12
  72. add r5, r5, #1
  73. cmp r5, #num_words
  74. blt loop2 @ Koniec wewnetrznej petli
  75. @ Tutaj musimy sie jeszcze zajac najstarsza czescia wyniku
  76. @ (z ostatniej iteracji petli wewnetrznej)
  77. add r6, r6, #1
  78. msr apsr_nzcvq, r11 @ Ladowanie flag z r11
  79. adc r2, r2, #0 @ Dodawanie z przeniesieniem bez ustawiania flag
  80. msr apsr_nzcvq, r12 @ Ladowanie flag z r12
  81. ldr r1, [r10, r6, lsl#2]
  82. adc r1, r1, r2 @ Dodawanie z przeniesieniem bez ustawiania flag
  83. str r1, [r10, r6, lsl#2]
  84. add r4, r4, #1
  85. cmp r4, #num_words
  86. blt loop1 @ Koniec zewnetrznej petli
  87. mov r7, #SYSWRITE @ Wypisanie wyniku na standardowe wyjscie
  88. mov r0, #STDOUT @ ...funkcja systemowa write
  89. ldr r1, =result
  90. mov r2, #buf_length
  91. swi 0x0
  92. b loop @ Koniec glownej petli
  93. end:
  94. mov r7, #SYSEXIT @ Funkcja systemowa exit...
  95. mov r0, #0 @ ...kod zakonczenia - 0
  96. swi 0x0