diff --git a/dos/main.k b/dos/main.k index ecbb58d..1abc656 100644 --- a/dos/main.k +++ b/dos/main.k @@ -24,6 +24,10 @@ main: mov ax1, 10 call print_n + mov ax0, .buf + mov ax1, .msg + call strcmp + leave ret diff --git a/dos/str/strcmp.k b/dos/str/strcmp.k new file mode 100644 index 0000000..c2f2457 --- /dev/null +++ b/dos/str/strcmp.k @@ -0,0 +1,52 @@ +; The OS/K Team licenses this file to you under the MIT license. +; See the LICENSE file in the project root for more information. + +; +; int strcmp(const char *str1, const char *str2) +; +; Returns: +; 0 if the contents of both strings are equal +; 1 if the first character that does not match has a greater value in str1 than in str2 +; -1 if the first character that does not match has a lower value in str1 than in str2 +; + +strcmp: + cmp b[ax0], b[ax1] + cjmpnz .1 + + test b[ax0], b[ax0] + cjmpz .1 + + inc ax0 + inc ax1 + jmp strcmp + +.1: + mov rax, b[ax0] + sub rax, b[ax1] + sgn rax, rax + ret + +; +; int strncmp(const char *str1, const char *str2, int maxn) +; +strncmp: + mov rcx, ax2 + +.1: + cmp b[ax0], b[ax1] + cjmpnz .1 + + test b[ax0], b[ax0] + cjmpz .1 + + inc ax0 + inc ax1 + loop strcmp + +.1: + mov rax, b[ax0] + sub rax, b[ax1] + sgn rax, rax + ret + diff --git a/dos/str/string.k b/dos/str/string.k index 2e73c55..866140c 100644 --- a/dos/str/string.k +++ b/dos/str/string.k @@ -4,4 +4,5 @@ include "str/strlen.k" include "str/strrev.k" include "str/strcpy.k" +include "str/strcmp.k" diff --git a/pc/instrs/INSTRS b/pc/instrs/INSTRS index 5b935e4..f5729ae 100644 --- a/pc/instrs/INSTRS +++ b/pc/instrs/INSTRS @@ -200,6 +200,27 @@ cdecz m cdecnz r cdecnz m +sgn r r +sgn r i +sgn r m +sgn m r +sgn m i +sgn m m + +csgnz r r +csgnz r i +csgnz r m +csgnz m r +csgnz m i +csgnz m m + +csgnnz r r +csgnnz r i +csgnnz r m +csgnnz m r +csgnnz m i +csgnnz m m + # # Comparison instruction # diff --git a/pc/instrs/arith.c b/pc/instrs/arith.c index c249253..5cac01b 100644 --- a/pc/instrs/arith.c +++ b/pc/instrs/arith.c @@ -10,6 +10,7 @@ IMPL_COND(add); IMPL_COND(sub); IMPL_COND(mul); IMPL_COND(div); +IMPL_COND(sgn); // // Unsigned arithmetic instructions @@ -72,3 +73,9 @@ IMPL_START_1(dec) } IMPL_OUT; +IMPL_START_2(sgn) +{ + v1 = (v2 ? ((long)v2 > 0 ? 1 : (ulong)-1L) : 0); +} +IMPL_OUT; +