Facebook
From k, 8 Years ago, written in Plain Text.
This paste is a reply to NA STOS from JA :D - view diff
Embed
Download Paste or View Raw
Hits: 418
  1. global main
  2. extern printf
  3.  
  4. section .data
  5. napis:   db a=%d b=%d .10.0 ;nie wiem czy nie powinno być w cudzysłowie: "a=%d b=%d".10.0
  6.  
  7. section .text
  8.  
  9. main:
  10. push    rbp                             ;tak zwana ramka stosu
  11. mov             rbp,rsp                 ;ustawienie wskaźnika na pierwszy element stosu
  12.  
  13. mov             rdi,666
  14. mov             rsi,1000
  15.  
  16. call    swap_reg                ;wywołanie funkcji
  17.  
  18. mov             rdx,rsi ;wynik funkcji swap_reg jest w rsi i rdi, więc od razu te wartości przekazuje do rejestrów dla printfa
  19. mov             rsi,rdi
  20.  
  21. mov             rdi, qword napis
  22. mov             rax,0
  23. call    printf
  24.  
  25. mov             rsp,rbp         ;zwolnienie pamięci po zmiennej lokalnej
  26. pop             rbp                     ;przywrócenie starej ramki
  27.  
  28. ret                                     ;powrót, ściągnięcie adresu powrotu z stosu i skok do kolejnej instrukcji po call
  29.  
  30. swap_reg:
  31.  
  32. push    rbp                             ;zachowanie starej ramki main'a
  33. mov             rbp,rsp                 ;ustawienie wskańnika na nowej ramce
  34. push    r12                             ;umieszczenie rejestrów roboczych na stosie
  35. push    r13
  36.  
  37. mov             r12,rdi         ;przekazanie wartości
  38. mov             r13,rsi
  39.  
  40. xor             r12,r13         ;tu w sumie chyba mogę działać bezpośrednio na rdi i rsi
  41. xor             r13,r12         ;i stos wtedy nie jest potrzebny
  42. xor             r12,r13
  43.  
  44. mov             rdi,r12
  45. mov             rsi,r13
  46.  
  47. pop             r13                     ;usunięcie zmiennych ze stosu
  48. pop             r12
  49. mov             rsp,rbp         ;zwolnienie pamięci
  50. pop             rbp                     ;ściągnięcie ramki funkcji
  51.  
  52. ret                                     ;powrót do instrukcji po call