Skip to content

Commit a694011

Browse files
committed
add strcmp
1 parent 2b00b92 commit a694011

File tree

5 files changed

+66
-13
lines changed

5 files changed

+66
-13
lines changed

action.sh

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
#!/bin/bash
2-
#see .github/workflows/make.yml
2+
#
3+
# see .github/workflows/make.yml
34

4-
cd cat
5-
make
6-
make check
5+
die() {
6+
echo "ERROR: $@"
7+
exit 1
8+
}
9+
10+
cd print_int
11+
12+
make print_int || die "make print_int"
13+
make write || die "make write"
14+
make strcmp || die "make strcmp"
15+
make check || die "make check"
16+
make check_write || die "make check_write"
17+
make check_strcmp || die "make check_strcmp"

print_int/.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 print_int
6+
break string_compare

print_int/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/print_int
22
/write
3+
/strcmp

print_int/Makefile

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
1-
build:
1+
print_int:
22
$(CC) main.s -c -o print_int.o
33
$(LD) -e main -o print_int print_int.o
44

5-
check: build
5+
check: print_int
66
./print_int | md5sum | grep -q ^3cca2fa && printf "\033[1;32m[OK]\033[0m\n"
77

8-
build_write:
8+
write:
99
$(CC) write.s -c -o write.o
1010
$(LD) -e main -o write write.o
1111

12-
check_write: build_write
12+
check_write: write
1313
./write | grep -q '^ABC$$' && printf "\033[1;32m[OK]\033[0m\n"
1414

15+
strcmp:
16+
$(CC) strcmp.s -c -o strcmp.o
17+
$(LD) -e main -o strcmp strcmp.o
18+
19+
check_strcmp: strcmp
20+
./strcmp | md5sum | grep -q ^00350de && printf "\033[1;32m[OK]\033[0m\n"
1521

1622
clean:
17-
rm -f *.o write print_int
23+
rm -f *.o write print_int strcmp

print_int/print_int.s

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@
3737
add $24, %rsp
3838
.endm
3939

40+
.macro strcmp s1 s2 count
41+
push \s1
42+
push \s2
43+
push \count
44+
call string_compare
45+
add $24, %rsp
46+
.endm
47+
4048
.macro write address size
4149
push \address
4250
push \size
@@ -191,9 +199,9 @@ copymem:
191199
enter
192200
push_all
193201
push %rax
194-
mov 32(%rbp), %rsi # param: source
195-
mov 24(%rbp), %rdi # param: destination
196-
mov 16(%rbp), %rdx # param: count
202+
mov 32(%rbp), %rsi # char *source
203+
mov 24(%rbp), %rdi # char *destination
204+
mov 16(%rbp), %rdx # int count
197205
mov $0, %rcx
198206
test %rdx, %rdx
199207
jz copymem_done
@@ -207,3 +215,30 @@ copymem_done:
207215
pop %rax
208216
pop_all
209217
return
218+
219+
string_compare:
220+
enter
221+
push_all
222+
mov 32(%rbp), %rsi # char *s1
223+
mov 24(%rbp), %rdi # char *s2
224+
mov 16(%rbp), %rdx # int count
225+
mov $0, %rcx
226+
test %rdx, %rdx
227+
jz string_compare_ret0
228+
string_compare_loop:
229+
mov (%rsi, %rcx), %rax
230+
mov (%rdi, %rcx), %rbx
231+
cmp %al, %bl
232+
jne string_compare_ret1
233+
inc %rcx
234+
cmp %rcx, %rdx
235+
je string_compare_ret0
236+
jmp string_compare_loop
237+
string_compare_ret1:
238+
mov $1, %rax
239+
jmp string_compare_done
240+
string_compare_ret0:
241+
mov $0, %rax
242+
string_compare_done:
243+
pop_all
244+
return

0 commit comments

Comments
 (0)