Skip to content

Commit eb88c58

Browse files
committed
wip: chasing a bug where print_int clobbers registers
1 parent 4bd3043 commit eb88c58

File tree

4 files changed

+67
-95
lines changed

4 files changed

+67
-95
lines changed

group3/.gdbinit

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

group3/group3.s

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ in:
1717
.quad 0
1818
out:
1919
.quad 0
20-
line:
20+
linebuf:
2121
.quad 0
2222
file_size:
2323
.quad 0
@@ -101,14 +101,16 @@ copy_done:
101101

102102
read_line:
103103
enter
104+
mov 16(%rbp), %rax
104105
sub $128, %rsp
105106
mov $0, %rcx
106107
cmp %rcx, file_size(%rip)
107108
je read_line_done
108109
mov in(%rip), %rbx
110+
add %rax, %rbx
109111
read_line_loop:
110112
mov %rcx, %rdi
111-
add line(%rip), %rdi
113+
add linebuf(%rip), %rdi
112114
mov (%rbx, %rcx), %rsi
113115
movb %sil, (%rdi)
114116
cmp $0xa, %sil
@@ -120,24 +122,6 @@ read_line_done:
120122
mov %rcx, %rax
121123
return
122124

123-
copy_lines:
124-
enter
125-
sub $128, %rsp
126-
mov $0, %rcx
127-
cmp %rcx, file_size(%rip)
128-
je copy_lines_done
129-
mov in(%rip), %rbx
130-
copy_lines_loop:
131-
mov %rcx, %rdi
132-
add out(%rip), %rdi
133-
mov (%rbx, %rcx), %rsi
134-
movb %sil, (%rdi)
135-
inc %rcx
136-
cmp %rcx, file_size(%rip)
137-
jne copy_lines_loop
138-
copy_lines_done:
139-
return
140-
141125
close:
142126
enter
143127
mov $CLOSE, %rax
@@ -157,6 +141,42 @@ munmap:
157141
syscall
158142
return
159143

144+
print_lines:
145+
enter
146+
sub $128, %rsp
147+
mov $0, %rbx
148+
149+
print_lines_loop:
150+
151+
push %rbx
152+
call print_int
153+
pop %rbx
154+
155+
push %rbx
156+
call read_line
157+
158+
add %rax, %rbx
159+
160+
161+
push linebuf(%rip)
162+
push %rax
163+
call write_string
164+
pop %rax
165+
pop %rax
166+
pop %rax
167+
168+
call write_newline
169+
170+
inc %rbx
171+
172+
cmp $30, %rbx
173+
174+
jl print_lines_loop
175+
print_lines_done:
176+
push $0x31
177+
call write_char_debug
178+
return
179+
160180
main:
161181
enter
162182
call open_file
@@ -166,17 +186,14 @@ main:
166186
call get_memory
167187
mov %rax, out(%rip)
168188
call get_memory
169-
mov %rax, line(%rip)
189+
mov %rax, linebuf(%rip)
170190
call init_file
171-
call read_line
172-
#call copy
173-
174-
push line(%rip)
175-
push %rax
176-
call write_string
177-
call write_newline
178-
pop %rax
179-
pop %rax
191+
call print_lines
192+
#push $0xc
193+
#call read_line
194+
#push linebuf(%rip)
195+
#push %rax
196+
#call write_string
180197

181198
call close
182199
call munmap

print_int/main.s

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
.text
22
.globl main
33

4-
.include "../print_int/print_int.s"
4+
.include "print_int.s"
5+
6+
basic_method:
7+
enter
8+
mov $6, %rcx
9+
return
510

611
main:
712
mov $0x9084, %rax
813
shl $16, %rax
914
add $0xa412, %rax
15+
mov $5, %rcx
1016
push %rax
17+
call #print_int
18+
call basic_method
19+
push %rcx
1120
call print_int
1221
jmp exit
1322

print_int/print_int.s

Lines changed: 9 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,10 @@
44
.equ WRITE, 1
55
.equ EXIT, 60
66

7-
.macro sys_enter
8-
push %rcx
9-
push %r11
10-
.endm
11-
12-
.macro sys_leave
13-
pop %r11
14-
pop %rcx
15-
.endm
16-
17-
.macro frame_enter
18-
push %rbp
19-
mov %rsp, %rbp
20-
.endm
21-
22-
.macro frame_leave
23-
mov %rbp, %rsp
24-
pop %rbp
25-
.endm
26-
277
.macro enter
288
push %rbp
299
mov %rsp, %rbp
10+
push %rbx
3011
push %rcx
3112
push %r8
3213
push %r9
@@ -44,6 +25,7 @@
4425
pop %r9
4526
pop %r8
4627
pop %rcx
28+
pop %rbx
4729
mov %rbp, %rsp
4830
pop %rbp
4931
ret
@@ -53,13 +35,7 @@
5335
.globl main
5436

5537
write_char_debug:
56-
frame_enter
57-
sys_enter
58-
push %rax
59-
push %rcx
60-
push %rdx
61-
push %rsi
62-
push %rdi
38+
enter
6339
mov 16(%rbp), %rax
6440
movb $0x3e, -128(%rbp)
6541
movb %al, -127(%rbp)
@@ -70,42 +46,25 @@ write_char_debug:
7046
mov $STDOUT, %rdi
7147
mov $4, %rdx
7248
syscall
73-
pop %rdi
74-
pop %rsi
75-
pop %rdx
76-
pop %rcx
77-
pop %rax
78-
sys_leave
79-
frame_leave
80-
ret
49+
return
8150

8251
write_char:
8352
enter
84-
push %rax
85-
push %rcx
86-
push %rdx
87-
push %rsi
88-
push %rdi
8953
mov 16(%rbp), %rax
9054
movb %al, -64(%rbp)
9155
lea -64(%rbp), %rsi
9256
mov $WRITE, %rax
9357
mov $STDOUT, %rdi
9458
mov $1, %rdx
9559
syscall
96-
pop %rdi
97-
pop %rsi
98-
pop %rdx
99-
pop %rcx
100-
pop %rax
10160
return
10261

10362
write_newline:
104-
mov %rsp, %rbp
63+
enter
10564
push $0xa
10665
call write_char
107-
mov %rbp, %rsp
108-
ret
66+
pop %rax
67+
return
10968

11069
write_string:
11170
enter
@@ -117,15 +76,9 @@ write_string:
11776
return
11877

11978
print_int:
120-
frame_enter
79+
enter
12180
sub $128, %rsp
12281

123-
push %rax
124-
push %rsi
125-
push %rdx
126-
push %rcx
127-
push %rdi
128-
12982
mov 16(%rbp), %rsi
13083
mov $0, %rcx
13184

@@ -168,12 +121,5 @@ print_int_pop_loop:
168121
pop %rdx
169122
pop %rsi
170123

171-
pop %rdi
172-
pop %rcx
173-
pop %rdx
174-
pop %rsi
175-
pop %rax
176-
177-
frame_leave
124+
return
178125

179-
ret

0 commit comments

Comments
 (0)