Advertisement
PecaJ

instruction_set.s

Nov 4th, 2023 (edited)
995
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 4.05 KB | None | 0 0
  1. .cpu cortex-m3
  2. .fpu softvfp
  3. .syntax unified
  4. .thumb
  5.  
  6. .extern _vma_data_start
  7.  
  8. .global instruction_set
  9.  
  10. .section .text.instruction_set
  11. .type instruction_set, %function
  12. instruction_set:
  13.  
  14. @   ================== Branch/jump instrukcije ===========================
  15. @   b{cond}   label     @ Branch (immediate)
  16. @   bl{cond}  label     @ Branch with link (immediate)
  17. @   bx{cond}  Rm        @ Branch indirect (register)
  18. @   blx{cond} Rm        @ Branch with link indirect (register)
  19. @   Za link povratna adresa se upisuje u link registar
  20. @   -> moramo sami da cuvamo link registar
  21.  
  22. @   Kako bismo koristili dalje link registar kao opstenamenski moramo ga
  23. @   sacuvati u memoriji (na stek)
  24. @   str lr, [sp, -4]!               @ Stek pun opadajuci, smanjujemo za jednu
  25.                                     @ rec (4B) pre upisa, i azuriramo ga
  26. @   Alternativno
  27.     push {r0-r5, lr}                @ backupujemo koriscene registre
  28.  
  29. @   ================= Memorijske instrukcije LDR, STR ========================
  30. @   op{type} [r0, offset]
  31. @   op{type} [r0, offset]!          Pre indexed
  32. @   op{type} [r0], offset           Post indexed
  33. @   op:   ldr, str
  34. @   type: b - byte, sb - signed byte, h - half word, sh - signed half word
  35.  
  36.     ldr r0, data1                   @ Ucitava vrednost sa adrese data1
  37.                                     @ Ne enkoduje samu adresu, vec pc-relativno
  38.  
  39.     ldr r0, =data1                  @ Ucitava adresu data1
  40.     ldr r0, [r0]                    @ Ucitava vrednost sa adrese data1
  41.  
  42.     adr r0, data1                   @ Ucitava adresu data1
  43.     ldr r1, [r0]                    @ Ucitava vrednost sa adrese data1
  44.  
  45.     ldrb r1, [r0, 3]                @ Ucitavanje jednog bajta sa adrese r0+3
  46.     ldrb r1, [r0], 1                @ Ucitavanje 1B sa adrese r0, nakon cega
  47.                                     @ se r0 povecava za 1
  48.     ldrh r1, [r0, 1]!               @ Ucitavanje 2B sa adrese r0+1, nakon cega
  49.                                     @ se r0 povecava za 1
  50.  
  51. @   ============ Visestruke memorijske instrukcije LDM, STM =================
  52. @   op{addr_mode}{cond} Rn{!}, reglist
  53. @   addr_mode:  IA - increment after(default), DB - decrement before each access
  54. @   !: da li se vrednost koja se inkrementira cuva u registru Rn
  55.     ldm r0, {r1-r4, r5}             @ U registre se smestaju vrednosti pocevsi
  56.                                     @ od adrese r0, i dodeljuju se redom po
  57.                                     @ brojevima registara
  58.     ldm r0, {r1, r2, r3}            @ r1 = [r0], r2 = [r0+4], r3 = [r0+8]
  59. @   ldm r0, {r3, r1, r2}            @ Isti efekat, ali daje warning
  60.     ldmia r0!, {r1-r4}
  61.     ldmdb r0!, {r1-r4}
  62.  
  63. @   ================== Smestanje konstanti u registar =======================
  64. @   Instrukcije su 2-4 bajta, tako da nije uvek moguce enkodovati 4B vrednost
  65. @   u instrukciju
  66.     mov r0, 0xFF00FF00              @ OK
  67. @   mov r0, 0x12345678              @ Greska
  68. @   Resenje:
  69.     mov r0, 0x5678                  @ Upise nizih 2B i prosiri nulom
  70.     movt r0, 0x1234                 @ Upise u visih 2B
  71.  
  72. @   =================== Aritmeticke i logicke instrukcije ===================
  73.     mov r1, 17
  74.     mov r2, 5
  75.     sub r1, r2                      @ r1 = r1-r2
  76.     sub r0, r1, r2                  @ r0 = r1-r2
  77. @   r2 ovde prestavlja tzv. Fleksibilni operand tj operand2, za njega moze se
  78. @   navesti konstanta, ili uraditi neka shift operacija
  79.     sub r0, r1, r2, LSL 2           @ r0 = r1 - (r2<<2)
  80.     sub r0, r1, 9                   @ r0 = r1 - 9
  81. @   Instrukcije obicno ne menjaju condition flags ali mogu sa sufiksom S
  82.     lsls r0, r3, r4
  83.     adds r0, r1, r2
  84.     rrx r0, r1                      @ rotacija desno za jedan sa carry flag
  85.  
  86. @   Conditional execution, svaka instrukcija moze uslovno da se izvrsi
  87. @   eq, ne - equal, not equal
  88. @   hi, lo - higher, lower (unsigned >, <)
  89. @   hs, ls - higher or same, lower or same (unsigned >=, <=)
  90. @   gt, lt - greater, less than (signed >, <)
  91. @   ge, le - greater or equal, greater or equal (signed >=, <=)
  92. @   mi, pl - negative, positive or zero
  93. @   vs, vc - overflow set, clear
  94.     cmp r1, 13
  95. @   Kako bi se koristilo uslovno izvrsavanje potrebna je priprema
  96. @   pise se i(if) pa t(then) ili e(else) za svaku od sledecih instrukcija
  97. @   ittet ne                        @ Zbog opcija prosledjenih as-u moze bez
  98.     movne r0, 5                     @ t jer koristi ne
  99.     movsne r1, 4                    @ zbog s menja flegove
  100.     moveq r2, 3                     @ e jer koristi eq (komplement navedenog)
  101.     movne r3, 2
  102.  
  103. @   ========================= Izlaz iz funkcije ===========================
  104. @   ldr lr, [sp], 4                 @ Restauriramo link reg sa steka
  105.     pop {r0-r5, lr}
  106.     bx lr                           @ Return iz funkcije
  107.  
  108.  
  109. data1:
  110. .word _vma_data_start
  111.  
  112.     .end
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement