Skip to content

Commit 7a3ad0a

Browse files
committed
add memcpy
1 parent a54e8fe commit 7a3ad0a

File tree

10 files changed

+348
-108
lines changed

10 files changed

+348
-108
lines changed

cat/cat.s

Lines changed: 68 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,33 @@
77
.equ EXIT, 60
88
.equ MMAP, 9
99
.equ MUNMAP, 11
10-
.equ OFFSET_SIZE, 48
11-
.equ CHAR_O, 0x4f
12-
.equ CHAR_U, 0x55
13-
.equ CHAR_C, 0x43
14-
.equ CHAR_H, 0x48
15-
.equ BANG, 0x21
16-
.equ NEWLINE, 0xa
17-
18-
.macro sys_enter
10+
.equ OFFSET_SIZE, 48 # struct stat
11+
12+
.macro enter
13+
push %rbp
14+
mov %rsp, %rbp
1915
push %rcx
16+
push %r8
17+
push %r9
18+
push %r10
2019
push %r11
20+
push %rax
21+
push %rdi
22+
push %rdx
2123
.endm
2224

23-
.macro sys_leave
25+
.macro return
26+
pop %rdx
27+
pop %rdi
28+
pop %rax
2429
pop %r11
30+
pop %r10
31+
pop %r9
32+
pop %r8
2533
pop %rcx
26-
.endm
27-
28-
.macro frame_enter
29-
push %rbp
30-
mov %rsp, %rbp
31-
.endm
32-
33-
.macro frame_leave
3434
mov %rbp, %rsp
3535
pop %rbp
36+
ret
3637
.endm
3738

3839
.data
@@ -55,100 +56,79 @@ file:
5556
.globl main
5657

5758
mmap:
58-
movq $MMAP, %rax
59-
movq $0, %rdi #addr
60-
movq $3, %rdx #prot r=1 w=2
61-
movq siz(%rip), %rsi #len
62-
movq $-1, %r8 #fd
63-
movq $0, %r9 #offset
64-
movq $34, %r10 #flags map_private=0x02, map_anonymous=0x20
59+
enter
60+
mov $MMAP, %rax
61+
mov $0, %rdi #addr
62+
mov $3, %rdx #prot r=1 w=2
63+
mov siz(%rip), %rsi #len
64+
mov $-1, %r8 #fd
65+
mov $0, %r9 #offset
66+
mov $34, %r10 #flags map_private=0x02, map_anonymous=0x20
6567
syscall
66-
movq %rax, buffer(%rip) #store buffer
67-
ret
68+
mov %rax, buffer(%rip)
69+
return
6870

6971
exit:
70-
movq $EXIT, %rax
71-
movq $0, %rdi
72-
syscall
73-
ret
74-
75-
print:
76-
movq $WRITE, %rax
77-
pushq %rdi #print contents of rdi
78-
movq $STDOUT, %rdi
79-
pushq %rsp #push leaves RSP pointing to the data that was pushed
80-
popq %rsi #copy RSP to RSI
81-
movq $1, %rdx #size
72+
enter
73+
mov $EXIT, %rax
74+
mov $0, %rdi
8275
syscall
83-
popq %rdi
84-
ret
85-
86-
print_ouch:
87-
movq $CHAR_O, %rdi
88-
call print
89-
movq $CHAR_U, %rdi
90-
call print
91-
movq $CHAR_C, %rdi
92-
call print
93-
movq $CHAR_H, %rdi
94-
call print
95-
movq $BANG, %rdi
96-
call print
97-
movq $NEWLINE, %rdi
98-
call print
99-
ret
76+
return
10077

10178
open:
102-
movq $OPEN, %rax
103-
movq $file, %rdi #filename
104-
movq $0, %rsi #readonly
105-
movq $0644, %rdx #mode
79+
enter
80+
mov $OPEN, %rax
81+
mov $file, %rdi
82+
mov $0, %rsi
83+
mov $0644, %rdx
10684
syscall
107-
movq %rax, fh(%rip) #store fh
108-
ret
85+
mov %rax, fh(%rip)
86+
return
10987

11088
stat:
111-
movq $FSTAT, %rax
112-
movq fh(%rip), %rdi #load fh
113-
leaq st, %rsi #into st
89+
enter
90+
mov $FSTAT, %rax
91+
mov fh(%rip), %rdi
92+
lea st, %rsi
11493
syscall
115-
movq 48(%rsi), %rbx #store size
116-
movq %rbx, siz(%rip)
117-
ret
94+
mov 48(%rsi), %rbx
95+
mov %rbx, siz(%rip)
96+
return
11897

11998
read:
120-
movq $READ, %rax
121-
movq fh(%rip), %rdi #int fd
122-
movq buffer(%rip), %rsi #char *buf
123-
movq siz(%rip), %rdx #len
99+
enter
100+
mov $READ, %rax
101+
mov fh(%rip), %rdi
102+
mov buffer(%rip), %rsi
103+
mov siz(%rip), %rdx
124104
syscall
125-
ret
105+
return
126106

127107
write:
128-
movq $WRITE, %rax
129-
movq $STDOUT, %rdi #int fd
130-
movq buffer(%rip), %rsi #char *buf
131-
movq siz(%rip), %rdx #len
108+
enter
109+
mov $WRITE, %rax
110+
mov $STDOUT, %rdi
111+
mov buffer(%rip), %rsi
112+
mov siz(%rip), %rdx
132113
syscall
133-
ret
114+
return
134115

135116
close:
136-
movq $CLOSE, %rax #close
137-
leaq fh, %rdi #fh
117+
enter
118+
mov $CLOSE, %rax
119+
lea fh, %rdi
138120
syscall
139-
ret
121+
return
140122

141123
munmap:
142-
movq $MUNMAP, %rax #munmap
143-
leaq buffer, %rdi #buffer
144-
movq siz(%rip), %rsi #len
124+
enter
125+
mov $MUNMAP, %rax
126+
lea buffer, %rdi
127+
mov siz(%rip), %rsi
145128
syscall
146-
ret
129+
return
147130

148131
main:
149-
pushq %rbp
150-
movq %rsp, %rbp
151-
152132
call open
153133
call stat
154134
call mmap

draft/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ draft: draft.c
99
barf: draft.c
1010
$(CC) $(CFLAGS) -fno-omit-frame-pointer -S $^ -o draft.s
1111

12+
buildbarf:
13+
@rm -f draft
14+
$(CC) $(CFLAGS) draft.s -o draft
15+
1216
debug: barf
1317
$(CC) -o draft draft.s -g
1418

draft/draft.c

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,75 @@
11
#include <stdio.h>
2+
#include <stdbool.h>
23
#include <sys/stat.h>
34
#include <stddef.h>
45
#include <stdlib.h>
56
#include <unistd.h>
67
#include <sys/syscall.h>
78
#include <sys/types.h>
89

10+
char* in;
11+
char* out;
12+
13+
int get_zero() {
14+
int result = 128;
15+
while(true) {
16+
result = result / 2;
17+
if (result == 16) {
18+
return 0;
19+
}
20+
}
21+
return 1;
22+
}
23+
24+
int get_one() {
25+
int result = 128;
26+
while(true) {
27+
result = result / 2;
28+
if (result == 8) {
29+
return 1;
30+
}
31+
}
32+
return 2;
33+
}
34+
35+
int get_two() {
36+
int result = 128;
37+
while(true) {
38+
result = result / 2;
39+
if (result == 4) {
40+
return 2;
41+
}
42+
}
43+
return 1;
44+
}
45+
46+
int get_three() {
47+
int result = 128;
48+
while(true) {
49+
result = result / 2;
50+
if (result == 32) {
51+
return 3;
52+
}
53+
}
54+
return 2;
55+
}
56+
957
int main(int argc, char *argv[])
1058
{
11-
char out[11];
12-
out[0] = '0';
13-
out[1] = 'x';
14-
out[2] = 'd';
15-
out[3] = 'e';
16-
out[4] = 'a';
17-
out[5] = 'd';
18-
out[6] = 'b';
19-
out[7] = 'e';
20-
out[8] = 'e';
21-
out[9] = 'f';
22-
out[10] = '\n';
23-
syscall(__NR_write, 1, out, 11);
59+
in = malloc(4);
60+
out = malloc(4);
61+
in[0] = '0';
62+
in[1] = 'x';
63+
in[2] = 'a';
64+
in[3] = '\n';
65+
int zero = get_zero();
66+
int one = get_one();
67+
int two = get_two();
68+
int three = get_three();
69+
out[zero] = in[zero];
70+
out[one] = in[one];
71+
out[two] = in[two];
72+
out[three] = in[three];
73+
syscall(__NR_write, 1, out, 4);
2474
return 0;
2575
}

group3/.gdbinit

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ lay asm
33
define hook-quit
44
set confirm off
55
end
6+
break copy

group3/group3.s

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,13 @@
1717
push %r9
1818
push %r10
1919
push %r11
20-
push %rax
2120
push %rdi
2221
push %rdx
2322
.endm
2423

2524
.macro return
2625
pop %rdx
2726
pop %rdi
28-
pop %rax
2927
pop %r11
3028
pop %r10
3129
pop %r9
@@ -40,7 +38,9 @@
4038

4139
fh:
4240
.quad 0
43-
buffer:
41+
source_buffer:
42+
.quad 0
43+
out_buffer:
4444
.quad 0
4545
siz:
4646
.quad 0
@@ -65,7 +65,6 @@ mmap:
6565
mov $0, %r9 #offset
6666
mov $34, %r10 #flags map_private=0x02, map_anonymous=0x20
6767
syscall
68-
mov %rax, buffer(%rip)
6968
return
7069

7170
exit:
@@ -99,16 +98,32 @@ read:
9998
enter
10099
mov $READ, %rax
101100
mov fh(%rip), %rdi
102-
mov buffer(%rip), %rsi
101+
mov source_buffer(%rip), %rsi
103102
mov siz(%rip), %rdx
104103
syscall
105104
return
106105

106+
copy:
107+
enter
108+
mov $0, %rcx
109+
cmp %rcx, siz(%rip)
110+
je copy_done
111+
copy_loop:
112+
lea source_buffer(%rip), %rsi
113+
add %rcx, %rsi
114+
mov (%rsi), %rdx
115+
mov %rdx, out_buffer(%rsi)
116+
inc %rcx
117+
cmp %rcx, siz(%rip)
118+
jne copy_loop
119+
copy_done:
120+
return
121+
107122
write:
108123
enter
109124
mov $WRITE, %rax
110125
mov $STDOUT, %rdi
111-
mov buffer(%rip), %rsi
126+
mov source_buffer(%rip), %rsi
112127
mov siz(%rip), %rdx
113128
syscall
114129
return
@@ -123,7 +138,7 @@ close:
123138
munmap:
124139
enter
125140
mov $MUNMAP, %rax
126-
lea buffer, %rdi
141+
lea source_buffer, %rdi
127142
mov siz(%rip), %rsi
128143
syscall
129144
return
@@ -132,7 +147,11 @@ main:
132147
call open
133148
call stat
134149
call mmap
150+
mov %rax, source_buffer(%rip)
135151
call read
152+
call mmap
153+
mov %rax, out_buffer(%rip)
154+
#call copy TODO
136155
call write
137156
call close
138157
call munmap

0 commit comments

Comments
 (0)