-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpqnn64.nasm
139 lines (107 loc) · 3.73 KB
/
pqnn64.nasm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
; ---------------------------------------------------------
; PQNN con istruzioni SSE a 32 bit
; ---------------------------------------------------------
; F. Angiulli
; Aprile 2019
;
;
; Software necessario per l'esecuzione:
;
; NASM (www.nasm.us)
; GCC (gcc.gnu.org)
;
; entrambi sono disponibili come pacchetti software
; installabili mediante il packaging tool del sistema
; operativo; per esempio, su Ubuntu, mediante i comandi:
;
; sudo apt-get install nasm
; sudo apt-get install gcc
;
; potrebbe essere necessario installare le seguenti librerie:
;
; sudo apt-get install lib32gcc-4.8-dev (o altra versione)
; sudo apt-get install libc6-dev-i386
;
; Per generare file oggetto:
;
; nasm -f elf64 pqnn32.nasm
;
%include "sseutils.nasm"
section .data ; Sezione contenente dati inizializzati
uno: dd 1.0
;
;align 32
;inizio: dd 1.0, 2.0, 3.0, 4.0
section .bss ; Sezione contenente dati non inizializzati
;alignb 32
;vec2: resq 4
section .text ; Sezione contenente il codice macchina
; ----------------------------------------------------------
; macro per l'allocazione dinamica della memoria
;
; getmem <size>,<elements>
;
; alloca un'area di memoria di <size>*<elements> bytes
; (allineata a 16 bytes) e restituisce in EAX
; l'indirizzo del primo bytes del blocco allocato
; (funziona mediante chiamata a funzione C, per cui
; altri registri potrebbero essere modificati)
;
; fremem <address>
;
; dealloca l'area di memoria che ha inizio dall'indirizzo
; <address> precedentemente allocata con getmem
; (funziona mediante chiamata a funzione C, per cui
; altri registri potrebbero essere modificati)
extern get_block
extern free_block
%macro getmem 2
mov rdi, %1
mov rsi, %2
call get_block
%endmacro
%macro fremem 1
mov rdi, %1
call free_block
%endmacro
; ------------------------------------------------------------
; Funzioni
; ------------------------------------------------------------
global pqnn64_index
global pqnn64_search
pqnn64_index:
; ------------------------------------------------------------
; Sequenza di ingresso nella funzione
; ------------------------------------------------------------
push rbp ; salva il Base Pointer
mov rbp, rsp ; il Base Pointer punta al Record di Attivazione corrente
pushfq ; salva i registri generali
; ------------------------------------------------------------
; I paramentri sono passati nei registri
; ------------------------------------------------------------
; rdi = indirizzo della struct input
; ------------------------------------------------------------
; Sequenza di uscita dalla funzione
; ------------------------------------------------------------
popfq ; ripristina i registri generali
mov rsp, rbp ; ripristina lo Stack Pointer
pop rbp ; ripristina il Base Pointer
ret ; torna alla funzione C chiamante
pqnn64_search:
; ------------------------------------------------------------
; Sequenza di ingresso nella funzione
; ------------------------------------------------------------
push rbp ; salva il Base Pointer
mov rbp, rsp ; il Base Pointer punta al Record di Attivazione corrente
pushfq ; salva i registri generali
; ------------------------------------------------------------
; I paramentri sono passati nei registri
; ------------------------------------------------------------
; rdi = indirizzo della struct input
; ------------------------------------------------------------
; Sequenza di uscita dalla funzione
; ------------------------------------------------------------
popfq ; ripristina i registri generali
mov rsp, rbp ; ripristina lo Stack Pointer
pop rbp ; ripristina il Base Pointer
ret ; torna alla funzione C chiamante