Advertisement
teplofizik

main.s (locvars)

Apr 2nd, 2013
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Test STM32F4-Assembler project
  2. ; Локальные переменные
  3.  
  4.     AREA    |.text|, CODE, READONLY
  5.  
  6. ; Инициализация системы тактирования
  7.             EXPORT SystemInit
  8. SystemInit  PROC
  9.     BX LR ; Возвращаемся обратно
  10.            
  11.     ENDP
  12.  
  13. ; Получение данных
  14. ; Возвращает всегда 12
  15. get_data PROC
  16.     MOV R0, #12
  17.    
  18.     ; Возврат
  19.     BX  LR
  20.     ENDP
  21.  
  22. ; Подсчт суммы элементов массива размером 32 байта [R0]
  23. do_smth_calc PROC
  24.     PUSH {R4, LR}
  25.  
  26.     ; Сохраним аргумент
  27.     MOV R3, R0
  28.    
  29.     ; uint32_t Temp = 0;
  30.     MOV R0, #0
  31.    
  32.     ; i = 0
  33.     MOV R1, #0
  34.    
  35. _for2
  36.         ; i < 32
  37.         ; Если больше или равно 32, валим
  38.         CMP R1, #32
  39.         BGE _exit2
  40.    
  41.         ; Temp += Buffer[i];
  42.         LDRB R2, [R3, R1]
  43.         ADD R0, R0, R2
  44.  
  45.         ; прибавим 1 к R1, и на следующую итерацию
  46.         ADD  R1, R1, #1
  47.  
  48.         ; перепрыгнем на следующую итерацию
  49.         B _for2
  50.  
  51. _exit2
  52.  
  53.     ; В R0 теперь результат
  54.     POP {PC, R4}
  55.     ENDP
  56.  
  57. ; Тестовая процедура
  58. ; Объявление локального буфера, заполнение, передача указателя на него как аргумента
  59. smth    PROC
  60.     ; uint32_t smth(void)
  61.     ; Сохраним адрес возврата и R4 для выравнивания по 8 байт
  62.     PUSH {R4, LR}
  63.  
  64.     ; {
  65.     ; uint8_t buffer[32];
  66.     ; Выделим 32 байта для буфера на стеке.
  67.     SUB SP, SP, #32
  68.  
  69.     ; i пусть будет в регистре каком-нибудь
  70.     ; int     i;
  71.     ; for(i = 0; i < 32; i++)
  72.     ; i = 0
  73.     MOV R1, #0
  74.  
  75. _for1
  76.         ; i < 32
  77.         ; Если больше или равно 32, валим
  78.         CMP R1, #32
  79.         BGE _exit1
  80.  
  81.         ; {
  82.         ; R0 = get_data();
  83.         ; получим очередной байт в R0
  84.         BL get_data
  85.  
  86.         ; R1 - номер элемента, оно же и смещение
  87.         ; buffer[i] = R0;
  88.         STRB R0, [SP, R1]
  89.  
  90.         ; }
  91.  
  92.         ; i++
  93.         ; прибавим 1 к R1, и на следующий цикл
  94.         ADD  R1, R1, #1
  95.  
  96.         ; перепрыгнем на следующую итерацию
  97.         B _for1
  98.        
  99. _exit1
  100.     ; R0 = do_smth_calc(&buffer[0]);
  101.     MOV  R0, SP
  102.     BL   do_smth_calc
  103.  
  104.     ; }
  105.  
  106.     ; Вернм SP
  107.     ADD SP, SP, #32
  108.  
  109.     ; В R0 теперь результат
  110.     POP {PC, R4}
  111.     ENDP
  112.  
  113.       EXPORT main
  114. main  PROC
  115.     ; Вызовем
  116.     BL smth
  117.            
  118. __mainloop  ; Главный цикл
  119.  
  120.     ; Код какой-то полезный
  121.  
  122.     ; На очередной круг
  123.     B __mainloop
  124.  
  125.     ENDP
  126.  
  127.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement