Facebook
From k, 8 Years ago, written in Plain Text.
This paste is a reply to NA STOS from JA :D - go back
Embed
Viewing differences between NA STOS and Re: NA STOS
global main
extern printf

section .data
napis:         db a=%d b=%d .10.0 ;do a i b jest chyba to wpisane ale ;nie wiem czy nie jestem pewien

section .bss
parametry:         resq 2                ;8 bitowa zmienna 
powinno być pamięci wiadomo jest ich dwie 

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
mov                [parametry],rax        ;wpisanie wartości do pamięci
mov                [parametry+8],rbx

mov                rdi,parametry
mov                rsi,parametry+8

rsi,1000

call        swap_reg                ;wywołanie funkcji

mov                rax,[parametry]
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                rbx,[parametry+8]

rsi,rdi

mov                rdi, qword napis
mov                rsi,rax
mov                rdx,rbx
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]                r12,rdi                ;przekazanie wartości
mov                r13,[rsi]

r13,rsi

xor                r12,r13
r12,r13                ;tu w sumie chyba mogę działać bezpośrednio na rdi i rsi
xor                r13,r12
r13,r12                ;i stos wtedy nie jest potrzebny
xor                r12,r13

mov                [rdi],r12
rdi,r12
mov                [rsi],r13

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