Advertisement
teplofizik

main.s (strings)

Apr 2nd, 2013
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Test STM32F4-Assembler project
  2. ; Отладочный вывод в Кейл
  3.  
  4.     AREA    |.strings|, DATA, READONLY
  5.     ; Запишем нужные нам строки
  6.     ; В конце добавим 0 - он показывает конец строки
  7.     ; 0x0a показывает перенос строки
  8. helloworld  DCB  "Hello world", 0
  9. test_x      DCB  "test: %x", 0x0a, 0    ; %x: hex
  10. test_s      DCB  "test: %s", 0x0a, 0    ; %s: string
  11. mimimi      DCB  "mimimi", 0
  12. manyarg     DCB "%d %d %d %d %s %d", 0  ; шесть замен
  13.  
  14.     AREA    |.text|, CODE, READONLY
  15.  
  16. ; Внешние символы (stdio)
  17.             IMPORT printf
  18.             IMPORT puts
  19.  
  20. ; Инициализация системы тактирования
  21.             EXPORT SystemInit
  22. SystemInit  PROC
  23.            
  24.             BX LR ; Возвращаемся обратно
  25.            
  26.             ENDP
  27.  
  28.             EXPORT main
  29. main        PROC
  30.            
  31.             ; Место для инициализации
  32.             ; Выведем текст "Hello world" в Кейл
  33.             ; puts("Hello World");
  34.             LDR  R0, =helloworld
  35.             BL   puts
  36.  
  37.             ; Теперь выведем с подстановкой числа!
  38.             ; "test: %x", вместо %x будет написано текстом значение регистра R1
  39.             ; (так как он второй аргумент), шестнадцатеричный формат: 1234567A
  40.             LDR  R0, =test_x
  41.             LDR  R1, =0x1234567A
  42.             BL   printf
  43.            
  44.             ; И с подстановкой строки.
  45.             LDR  R0, =test_s
  46.             LDR  R1, =mimimi
  47.             BL   printf
  48.  
  49.             ; Пример передачи большого количества аргументов в функцию (7 штук)
  50.             ; Добъёмся такого результата: "1 2 3 4 mimimi 5"
  51.             ; Сначала запихнём аргументы в стек, используя R0-R3 свободно.
  52.             ; Указатель стека указывает на 4 аргумент! Остальные идут в порядке увеличения адреса
  53.             ; Их три штуки: "%d %s %d". Число, строка, число
  54.             MOV  R0, #4
  55.             LDR  R1, =mimimi
  56.             MOV  R2, #5
  57.             ; Сдвинем указатель стека на 4 слова, чтоб не затереть ничего важного (хоть там ничего и нет)
  58.             ; Так как пишем в сторону старших адресов, где сидят обычно старые данные от функций, откуда мы пришли
  59.             ; Вообще-то надо было всего 3 слова, но ядро любит выравнивание на 8 байт (PRES8), потому округление в большую сторону.
  60.             SUB  SP, SP, #0x10
  61.             STR  R0, [SP, #0]
  62.             STR  R1, [SP, #4]
  63.             STR  R2, [SP, #8]
  64.            
  65.             ; Теперь можно и первые 4 аргумента обычным порядком передать
  66.             LDR  R0, =manyarg
  67.             MOV  R1, #1
  68.             MOV  R2, #2
  69.             MOV  R3, #3
  70.            
  71.             ; Аргументы подготовлены. Вызовем функцию
  72.             BL   printf
  73.            
  74.             ; Вернм указатель стека на место
  75.             ADD  SP, SP, #0x10
  76.  
  77. __mainloop  ; Главный цикл
  78.  
  79.             ; Код какой-то полезный
  80.  
  81.             ; На очередной круг
  82.             B __mainloop
  83.  
  84.             ENDP
  85.  
  86.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement