File tree Expand file tree Collapse file tree 5 files changed +93
-89
lines changed Expand file tree Collapse file tree 5 files changed +93
-89
lines changed Original file line number Diff line number Diff line change 88
99[ What is stack frame] ( https://stackoverflow.com/questions/3699283/what-is-stack-frame-in-assembly )
1010
11+ [ C headers in Asm] ( http://thomasloven.com/blog/2012/06/C-Headers-In-Asm/ )
12+
1113```
1214/usr/include/asm-generic/fcntl.h
1315```
Original file line number Diff line number Diff line change 99 .equ MUNMAP, 11
1010 .equ OFFSET_SIZE, 48 # struct stat
1111
12- .macro enter
13- push %rbp
14- mov %rsp , %rbp
15- push %rcx
16- push %r8
17- push %r9
18- push %r10
19- push %r11
20- push %rdi
21- push %rdx
22- .endm
23-
24- .macro return
25- pop %rdx
26- pop %rdi
27- pop %r11
28- pop %r10
29- pop %r9
30- pop %r8
31- pop %rcx
32- mov %rbp , %rsp
33- pop %rbp
34- ret
35- .endm
36-
3712 .data
3813
3914fh:
5732 .text
5833 .globl main
5934
60- mmap:
35+ .include "../print_int/print_int.s"
36+
37+ get_memory:
6138 enter
6239 mov $MMAP, %rax
6340 mov $0 , %rdi #addr
7653 syscall
7754 return
7855
79- open :
56+ open_file :
8057 enter
8158 mov $OPEN, %rax
8259 mov $file, %rdi
8663 mov %rax , fh(%rip )
8764 return
8865
89- stat :
66+ stat_file :
9067 enter
9168 mov $FSTAT, %rax
9269 mov fh(%rip ), %rdi
9673 mov %rbx , file_size(%rip )
9774 return
9875
99- read_file :
76+ init_file :
10077 enter
10178 mov $READ, %rax
10279 mov fh(%rip ), %rdi
@@ -161,15 +138,6 @@ copy_lines_loop:
161138copy_lines_done:
162139 return
163140
164- write:
165- enter
166- mov 24 (%rbp ), %rsi # param: address
167- mov 16 (%rbp ), %rdx # param: size
168- mov $WRITE, %rax
169- mov $STDOUT, %rdi
170- syscall
171- return
172-
173141close:
174142 enter
175143 mov $CLOSE, %rax
@@ -191,20 +159,21 @@ munmap:
191159
192160main:
193161 enter
194- call open
195- call stat
196- call mmap
162+ call open_file
163+ call stat_file
164+ call get_memory
197165 mov %rax , in (%rip )
198- call mmap
166+ call get_memory
199167 mov %rax , out (%rip )
200- call mmap
168+ call get_memory
201169 mov %rax , line(%rip )
202- call read_file
170+ call init_file
171+ call read_line
203172 #call copy
204173
205- push in (%rip )
206- push file_size( %rip )
207- call write
174+ push line (%rip )
175+ push %rax
176+ call write_string
208177 pop %rax
209178 pop %rax
210179
Original file line number Diff line number Diff line change 11build :
2- $(CC ) print_int .s -c
2+ $(CC ) main .s -c -o print_int.o
33 $(LD ) -e main -o print_int print_int.o
44
55run : build
Original file line number Diff line number Diff line change 1+ .text
2+ .globl main
3+
4+ .include "../print_int/print_int.s"
5+
6+ print_char: # debugging
7+ frame_enter
8+ sys_enter
9+ push %rax
10+ push %rcx
11+ push %rdx
12+ push %rsi
13+ push %rdi
14+ mov 16 (%rbp ), %rax
15+ movb $0x3e , -128 (%rbp )
16+ movb %al , -127 (%rbp )
17+ movb $0x3c , -126 (%rbp )
18+ movb $0xa , -125 (%rbp )
19+ lea -128 (%rbp ), %rsi
20+ mov $WRITE, %rax
21+ mov $STDOUT, %rdi
22+ mov $4 , %rdx
23+ syscall
24+ pop %rdi
25+ pop %rsi
26+ pop %rdx
27+ pop %rcx
28+ pop %rax
29+ sys_leave
30+ frame_leave
31+ ret
32+
33+ main:
34+ mov $0x9084 , %rax
35+ shl $16 , %rax
36+ add $0xa412 , %rax
37+ push %rax
38+ call print_int
39+ jmp exit
40+
41+ exit:
42+ movq $EXIT, %rax
43+ movq $0 , %rdi
44+ syscall
Original file line number Diff line number Diff line change 2424 pop %rbp
2525 .endm
2626
27- .text
28- .globl main
29-
30- print_char: # debugging
31- frame_enter
32- sys_enter
33- push %rax
27+ .macro enter
28+ push %rbp
29+ mov %rsp , %rbp
3430 push %rcx
35- push %rdx
36- push %rsi
31+ push %r8
32+ push %r9
33+ push %r10
34+ push %r11
3735 push %rdi
38- mov 16 (%rbp ), %rax
39- movb $0x3e , -128 (%rbp )
40- movb %al , -127 (%rbp )
41- movb $0x3c , -126 (%rbp )
42- movb $0xa , -125 (%rbp )
43- lea -128 (%rbp ), %rsi
44- mov $WRITE, %rax
45- mov $STDOUT, %rdi
46- mov $4 , %rdx
47- syscall
48- pop %rdi
49- pop %rsi
36+ push %rdx
37+ .endm
38+
39+ .macro return
5040 pop %rdx
41+ pop %rdi
42+ pop %r11
43+ pop %r10
44+ pop %r9
45+ pop %r8
5146 pop %rcx
52- pop %rax
53- sys_leave
54- frame_leave
47+ mov %rbp , %rsp
48+ pop %rbp
5549 ret
50+ .endm
51+
52+ .text
53+ .globl main
5654
57- # char *rsi, int rdx
5855write_string:
59- sys_enter
56+ enter
57+ mov 24 (%rbp ), %rsi # param: address
58+ mov 16 (%rbp ), %rdx # param: size
6059 mov $WRITE, %rax
6160 mov $STDOUT, %rdi
6261 syscall
63- sys_leave
64- ret
62+ return
6563
6664print_int:
6765 frame_enter
@@ -109,7 +107,11 @@ print_int_pop_loop:
109107 inc %rdx
110108
111109 lea -96 (%rbp ), %rsi
110+ push %rsi
111+ push %rdx
112112 call write_string
113+ pop %rdx
114+ pop %rsi
113115
114116 pop %rdi
115117 pop %rcx
@@ -120,16 +122,3 @@ print_int_pop_loop:
120122 frame_leave
121123
122124 ret
123-
124- main:
125- mov $0x9084 , %rax
126- shl $16 , %rax
127- add $0xa412 , %rax
128- push %rax
129- call print_int
130- jmp exit
131-
132- exit:
133- movq $EXIT, %rax
134- movq $0 , %rdi
135- syscall
You can’t perform that action at this time.
0 commit comments