File tree Expand file tree Collapse file tree 8 files changed +40
-87
lines changed Expand file tree Collapse file tree 8 files changed +40
-87
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 @@ -145,7 +145,7 @@ close:
145145 enter
146146 push_all
147147 mov $CLOSE, %rax
148- lea fh, %rdi
148+ mov fh, %rdi
149149 syscall
150150 pop_all
151151 return
@@ -154,11 +154,11 @@ munmap:
154154 enter
155155 push_all
156156 mov $MUNMAP, %rax
157- lea inbuf, %rdi
157+ mov inbuf, %rdi
158158 mov file_size(%rip ), %rsi
159159 syscall
160160 mov $MUNMAP, %rax
161- lea out , %rdi
161+ mov out , %rdi
162162 mov file_size(%rip ), %rsi
163163 syscall
164164 pop_all
@@ -192,14 +192,12 @@ print_lines_loop:
192192 test %r9 , %r9
193193 jz print_lines_write_line
194194 write linebuf(%rip ), $3
195- writeln
196195print_lines_write_line:
197196 mov linebuf(%rip ), %r10
198197 add $2 , %r10 # skip two chars from linebuf
199198 movb $0x9 , (%r10 ) # replace third char with a tab
200199 sub $2 , %rax
201200 write %r10 , %rax
202- writeln
203201 inc %rbx
204202 cmp file_size(%rip ), %rbx
205203 jl print_lines_loop
@@ -222,6 +220,7 @@ main:
222220 mov %rax , linebuf(%rip )
223221 call init_file
224222 call print_lines
223+ call flush
225224
226225 call close
227226 call munmap
Original file line number Diff line number Diff line change 11print_int :
2- $(CC ) main.s -c -o print_int.o
3- $(LD ) -e main -o print_int print_int.o
2+ $(CC ) main.s -o print_int
43
54check : print_int
65 ./print_int | md5sum | grep -q ^3cca2fa && printf " \033[1;32m[OK]\033[0m\n"
76
87write :
9- $(CC ) write.s -c -o write.o
10- $(LD ) -e main -o write write.o
8+ $(CC ) write.s -o write
119
1210check_write : write
1311 ./write | grep -q ' ^ABC$$' && printf " \033[1;32m[OK]\033[0m\n"
1412
1513strcmp :
16- $(CC ) strcmp.s -c -o strcmp.o
17- $(LD ) -e main -o strcmp strcmp.o
14+ $(CC ) strcmp.s -o strcmp
1815
1916check_strcmp : strcmp
2017 ./strcmp | md5sum | grep -q ^00350de && printf " \033[1;32m[OK]\033[0m\n"
Original file line number Diff line number Diff line change 4040 log %rdx
4141 log %rsi
4242
43+ call flush
44+ call exit
45+
4346exit:
4447 movq $EXIT, %rax
4548 movq $0 , %rdi
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
95+ flush:
96+ enter
97+ push_all
98+ xor %eax , %eax
99+ mov stdout(%rip ), %rdi
100+ call fflush
101+ pop_all
102+ return
103+
92104write_char_debug:
93105 enter
94106 push_all
@@ -133,11 +145,11 @@ write_string:
133145 enter
134146 push_all
135147 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
148+ lea format( %rip ), %rdi
149+ mov 24 (%rbp ), %rdx # param: address
150+ mov 16 ( %rbp ) , %rsi # param: size
151+ mov $0 , %rax # number of vector arguments
152+ call printf
141153 pop %rax
142154 pop_all
143155 return
@@ -179,9 +191,6 @@ print_int_pop_loop:
179191 test %rcx , %rcx
180192 jnz print_int_pop_loop
181193
182- movb $0xa , -48 (%rbp , %rdx )
183- inc %rdx
184-
185194 lea -48 (%rbp ), %rsi
186195 write %rsi , %rdx
187196
Original file line number Diff line number Diff line change 3333 mov $2 , %rax
3434 strcmp %rdi , %rsi , $3
3535 log %rax
36+ call flush
3637 call exit
3738
3839exit:
Original file line number Diff line number Diff line change @@ -12,13 +12,13 @@ main:
1212 movb $0x41 , -24 (%rbp )
1313 movb $0x42 , -23 (%rbp )
1414 movb $0x43 , -22 (%rbp )
15- movb $0xa , -21 (%rbp )
1615 mov %rbp , %rsi
1716 sub $24 , %rsi
1817 mov %rsi , %rax
1918 sub $24 , %rax
20- memcpy %rsi , %rax , $4
21- write %rax , $4
19+ memcpy %rsi , %rax , $3
20+ write %rax , $3
21+ call flush
2222 call exit
2323
2424exit:
You can’t perform that action at this time.
0 commit comments