4242 .quad 0
4343out:
4444 .quad 0
45- siz:
45+ line:
46+ .quad 0
47+ file_size:
4648 .quad 0
4749st:
4850 .zero 1024
6062 mov $MMAP, %rax
6163 mov $0 , %rdi #addr
6264 mov $3 , %rdx #prot r=1 w=2
63- mov siz (%rip ), %rsi #len
65+ mov file_size (%rip ), %rsi #len
6466 mov $-1 , %r8 #fd
6567 mov $0 , %r9 #offset
6668 mov $34 , %r10 #flags map_private=0x02, map_anonymous=0x20
@@ -91,22 +93,22 @@ stat:
9193 lea st, %rsi
9294 syscall
9395 mov 48 (%rsi ), %rbx
94- mov %rbx , siz (%rip )
96+ mov %rbx , file_size (%rip )
9597 return
9698
97- read :
99+ read_file :
98100 enter
99101 mov $READ, %rax
100102 mov fh(%rip ), %rdi
101103 mov in (%rip ), %rsi
102- mov siz (%rip ), %rdx
104+ mov file_size (%rip ), %rdx
103105 syscall
104106 return
105107
106108copy:
107109 enter
108110 mov $0 , %rcx
109- cmp %rcx , siz (%rip )
111+ cmp %rcx , file_size (%rip )
110112 je copy_done
111113 mov in (%rip ), %rbx
112114copy_loop:
@@ -115,17 +117,56 @@ copy_loop:
115117 mov (%rbx , %rcx ), %rsi
116118 movb %sil , (%rdi )
117119 inc %rcx
118- cmp %rcx , siz (%rip )
120+ cmp %rcx , file_size (%rip )
119121 jne copy_loop
120122copy_done:
121123 return
122124
125+ read_line:
126+ enter
127+ sub $128 , %rsp
128+ mov $0 , %rcx
129+ cmp %rcx , file_size(%rip )
130+ je read_line_done
131+ mov in (%rip ), %rbx
132+ read_line_loop:
133+ mov %rcx , %rdi
134+ add line(%rip ), %rdi
135+ mov (%rbx , %rcx ), %rsi
136+ movb %sil , (%rdi )
137+ cmp $0xa , %sil
138+ je read_line_done
139+ inc %rcx
140+ cmp %rcx , file_size(%rip )
141+ jne read_line_loop
142+ read_line_done:
143+ mov %rcx , %rax
144+ return
145+
146+ copy_lines:
147+ enter
148+ sub $128 , %rsp
149+ mov $0 , %rcx
150+ cmp %rcx , file_size(%rip )
151+ je copy_lines_done
152+ mov in (%rip ), %rbx
153+ copy_lines_loop:
154+ mov %rcx , %rdi
155+ add out (%rip ), %rdi
156+ mov (%rbx , %rcx ), %rsi
157+ movb %sil , (%rdi )
158+ inc %rcx
159+ cmp %rcx , file_size(%rip )
160+ jne copy_lines_loop
161+ copy_lines_done:
162+ return
163+
123164write:
124165 enter
166+ mov 24 (%rbp ), %rsi # param: address
167+ mov 16 (%rbp ), %rdx # param: size
125168 mov $WRITE, %rax
126169 mov $STDOUT, %rdi
127- mov out (%rip ), %rsi
128- mov siz(%rip ), %rdx
129170 syscall
130171 return
131172
@@ -140,24 +181,33 @@ munmap:
140181 enter
141182 mov $MUNMAP, %rax
142183 lea in , %rdi
143- mov siz (%rip ), %rsi
184+ mov file_size (%rip ), %rsi
144185 syscall
145186 mov $MUNMAP, %rax
146187 lea out , %rdi
147- mov siz (%rip ), %rsi
188+ mov file_size (%rip ), %rsi
148189 syscall
149190 return
150191
151192main:
193+ enter
152194 call open
153195 call stat
154196 call mmap
155197 mov %rax , in (%rip )
156- call read
157198 call mmap
158199 mov %rax , out (%rip )
159- call copy
200+ call mmap
201+ mov %rax , line(%rip )
202+ call read_file
203+ #call copy
204+
205+ push in (%rip )
206+ push file_size(%rip )
160207 call write
208+ pop %rax
209+ pop %rax
210+
161211 call close
162212 call munmap
163213 call exit
0 commit comments