global main extern printf section .data napis: db a=%d b=%d .10.0 ;nie wiem czy nie powinno być w cudzysłowie: "a=%d b=%d".10.0 section .text main: push rbp ;tak zwana ramka stosu mov rbp,rsp ;ustawienie wskaźnika na pierwszy element stosu mov rdi,666 mov rsi,1000 call swap_reg ;wywołanie funkcji 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 mov rsi,rdi mov rdi, qword napis mov rax,0 call printf mov rsp,rbp ;zwolnienie pamięci po zmiennej lokalnej pop rbp ;przywrócenie starej ramki ret ;powrót, ściągnięcie adresu powrotu z stosu i skok do kolejnej instrukcji po call swap_reg: push rbp ;zachowanie starej ramki main'a mov rbp,rsp ;ustawienie wskańnika na nowej ramce push r12 ;umieszczenie rejestrów roboczych na stosie push r13 mov r12,rdi ;przekazanie wartości mov r13,rsi xor r12,r13 ;tu w sumie chyba mogę działać bezpośrednio na rdi i rsi xor r13,r12 ;i stos wtedy nie jest potrzebny xor r12,r13 mov rdi,r12 mov rsi,r13 pop r13 ;usunięcie zmiennych ze stosu pop r12 mov rsp,rbp ;zwolnienie pamięci pop rbp ;ściągnięcie ramki funkcji ret ;powrót do instrukcji po call