forked from seyfarth/ebe
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharray.asm
More file actions
118 lines (105 loc) · 2.75 KB
/
Copy patharray.asm
File metadata and controls
118 lines (105 loc) · 2.75 KB
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
;default rel
segment .data
a times 10 dw 0
segment .bss
b resw 10
segment .text
global main ; Tell linker about main
extern random, malloc
main:
array equ local1
push rbp
mov rbp, rsp ; setup stack frame
frame 2, 1, 2
sub rsp, frame_size
; Up to 6 integer parameters in rdi, rsi, rdx, rcx, r8, r9
; Up to 8 float parameters in xmm0-xmm7
lea rdi, [a]
mov esi, 10
call fill
lea rdi, [a]
mov esi, 10
call sort
lea rdi, [b]
mov esi, 10
call fill
lea rdi, [b]
mov esi, 10
call sort
mov edi, 2000
;call [malloc wrt ..got]
call malloc
mov [rbp+array], rax
mov rdi, [rbp+array]
mov esi, 1000
call fill
mov rdi, [rbp+array]
mov esi, 1000
call sort
leave
ret
fill:
;array equ local1
n equ local2
i equ local3
push rbp
mov rbp, rsp
frame 2, 3, 1
sub rsp, frame_size
mov [rbp+array], rdi
mov [rbp+n], rsi
xor ecx, ecx
.more:
mov [rbp+i], rcx
;call [random wrt ..got]
call random
and rax, 0x3ff
mov rcx, [rbp+i]
mov rdi, [rbp+array]
mov [rdi+2*rcx], ax
inc ecx
cmp rcx, [rbp+n]
jne .more
leave
ret
; void sort ( short *array, int n )
sort:
; {
push rbp
mov rbp, rsp
frame 2
sub rsp, frame_size
; int i; rcx
; bool sorted; rdx
;
; do {
top:
; sorted = true;
mov edx, 1
; for ( i = 0; i < n-1; i++ ) {
xor ecx, ecx
dec esi
for_top:
cmp ecx, esi
jnl for_end
; if ( array[i] > array[i+1] ( {
mov r8w, [rdi+2*rcx]
mov r9w, [rdi+2*rcx+2]
cmp r8w, r9w
jng no_swap
mov [rdi+2*rcx], r9w
mov [rdi+2*rcx+2], r8w
xor edx, edx
no_swap:
; swap array[i] & array[i+1]
; sorted = false;
; }
inc ecx
jmp for_top
for_end:
; }
; } while ( ! sorted );
cmp edx, 1
jne top
leave
ret