File tree Expand file tree Collapse file tree 4 files changed +30
-75
lines changed Expand file tree Collapse file tree 4 files changed +30
-75
lines changed Original file line number Diff line number Diff line change 77#include <sys/syscall.h>
88#include <sys/types.h>
99
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-
5710int main (int argc , char * argv [])
5811{
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 );
74- return 0 ;
12+ char message [3 ];
13+ message [0 ] = 0x41 ;
14+ message [1 ] = 0x55 ;
15+ message [2 ] = 0x41 ;
16+ printf ("%.*s" , 3 , message );
17+ fflush (stdout );
18+ syscall (__NR_exit , 0 );
19+ //return 0;
7520}
Original file line number Diff line number Diff line change 11default :
2- $(CC ) group3.s -c -g
3- $(LD ) -o group3 group3.o -e main
2+ $(CC ) group3.s -g -o group3 -e main
43
54clean :
65 @rm -f group3.o group3
Original file line number Diff line number Diff line change @@ -51,6 +51,15 @@ get_memory:
5151 pop_all
5252 return
5353
54+ flush:
55+ enter
56+ push_all
57+ xor %eax , %eax
58+ mov stdout(%rip ), %rdi
59+ call fflush
60+ pop_all
61+ return
62+
5463exit:
5564 enter
5665 push_all
@@ -145,7 +154,7 @@ close:
145154 enter
146155 push_all
147156 mov $CLOSE, %rax
148- lea fh, %rdi
157+ mov fh, %rdi
149158 syscall
150159 pop_all
151160 return
@@ -154,11 +163,11 @@ munmap:
154163 enter
155164 push_all
156165 mov $MUNMAP, %rax
157- lea inbuf, %rdi
166+ mov inbuf, %rdi
158167 mov file_size(%rip ), %rsi
159168 syscall
160169 mov $MUNMAP, %rax
161- lea out , %rdi
170+ mov out , %rdi
162171 mov file_size(%rip ), %rsi
163172 syscall
164173 pop_all
@@ -192,14 +201,12 @@ print_lines_loop:
192201 test %r9 , %r9
193202 jz print_lines_write_line
194203 write linebuf(%rip ), $3
195- writeln
196204print_lines_write_line:
197205 mov linebuf(%rip ), %r10
198206 add $2 , %r10 # skip two chars from linebuf
199207 movb $0x9 , (%r10 ) # replace third char with a tab
200208 sub $2 , %rax
201209 write %r10 , %rax
202- writeln
203210 inc %rbx
204211 cmp file_size(%rip ), %rbx
205212 jl print_lines_loop
@@ -222,6 +229,7 @@ main:
222229 mov %rax , linebuf(%rip )
223230 call init_file
224231 call print_lines
232+ call flush
225233
226234 call close
227235 call munmap
Original file line number Diff line number Diff line change 8686 pop %rsi
8787 .endm
8888
89+ .data
90+ format: .asciz "%.*s\n"
91+
8992 .text
9093 .globl main
9194
@@ -133,11 +136,11 @@ write_string:
133136 enter
134137 push_all
135138 push %rax
136- mov 24 ( %rbp ), %rsi # param: address
137- mov 16 (%rbp ), %rdx # param: size
138- mov $WRITE , %rax
139- mov $STDOUT , %rdi
140- syscall
139+ lea format( %rip ), %rdi
140+ mov 24 (%rbp ), %rdx # param: address
141+ mov 16 ( %rbp ) , %rsi # param: size
142+ mov $0 , %rax # number of vector arguments
143+ call printf
141144 pop %rax
142145 pop_all
143146 return
You can’t perform that action at this time.
0 commit comments