strcasecmp 实现不打印
strcasecmp implementation not printing
我正在做一个小项目,我必须从 lib C 重新编码一个函数。实际上我正在做 strcasecmp
:
BITS 64
%include "minilib.inc"
section .text
my_strcasecmp:
init:
mov r10b, [rdi]
mov r11b, [rsi]
jmp while
while:
cmp r10b, 0
je end
cmp r11b, 0
je end
cmp r10b, 90
jle checkfirstup
cmp r11b, 90
jle checksecondup
jmp strcasecmp
strcasecmp:
cmp r10b, r11b
jne end
inc rdi
inc rsi
jmp init
checkfirstup:
cmp r10b, 65
jge r10btolowcase
jmp checksecondup
r10btolowcase:
add r10b, 32
jmp while
checksecondup:
cmp r11b, 65
jge r11btolowcase
jmp strcasecmp
r11btolowcase:
add r11b, 32
jmp while
end:
movzx rax, r10b
movzx rbx, r11b
sub rax, rbx
ret
这是 c 中的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int my_strcasecmp(const char *string1, const char *string2); /* Prototype */
int main(void)
{
char *str1 = "S";
char *str2 = "S";
int result;
result = strcasecmp(str1, str2);
if (result == 0)
printf("Strings compared equal.\n");
else if (result < 0)
printf("\"%s\" is less than \"%s\".\n", str1, str2);
else
printf("\"%s\" is greater than \"%s\".\n", str1, str2);
return 0;}
当我尝试我的 strcasecmp 时,我总是说“nanana 比 nanana 大”,我不明白为什么。
我该如何解决这个问题?
问题是,当第一个字符不在 [A,Z] 中时,您会立即跳转到 checksecondup,您只检查第二个字符的下限。 cmp r11b, 90
从未在那时执行过! (它会触发不需要的 add r11b, 32
。)
解决方案是分别对两个字符进行 LCase:
...
cmp r10b, 65
jb Next
cmp r10b, 90
ja Next
add r10b, 32
Next:
cmp r11b, 65
jb Next_
cmp r11b, 90
ja Next_
add r11b, 32
Next_:
cmp r10b, r11b
...
我正在做一个小项目,我必须从 lib C 重新编码一个函数。实际上我正在做 strcasecmp
:
BITS 64
%include "minilib.inc"
section .text
my_strcasecmp:
init:
mov r10b, [rdi]
mov r11b, [rsi]
jmp while
while:
cmp r10b, 0
je end
cmp r11b, 0
je end
cmp r10b, 90
jle checkfirstup
cmp r11b, 90
jle checksecondup
jmp strcasecmp
strcasecmp:
cmp r10b, r11b
jne end
inc rdi
inc rsi
jmp init
checkfirstup:
cmp r10b, 65
jge r10btolowcase
jmp checksecondup
r10btolowcase:
add r10b, 32
jmp while
checksecondup:
cmp r11b, 65
jge r11btolowcase
jmp strcasecmp
r11btolowcase:
add r11b, 32
jmp while
end:
movzx rax, r10b
movzx rbx, r11b
sub rax, rbx
ret
这是 c 中的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int my_strcasecmp(const char *string1, const char *string2); /* Prototype */
int main(void)
{
char *str1 = "S";
char *str2 = "S";
int result;
result = strcasecmp(str1, str2);
if (result == 0)
printf("Strings compared equal.\n");
else if (result < 0)
printf("\"%s\" is less than \"%s\".\n", str1, str2);
else
printf("\"%s\" is greater than \"%s\".\n", str1, str2);
return 0;}
当我尝试我的 strcasecmp 时,我总是说“nanana 比 nanana 大”,我不明白为什么。
我该如何解决这个问题?
问题是,当第一个字符不在 [A,Z] 中时,您会立即跳转到 checksecondup,您只检查第二个字符的下限。 cmp r11b, 90
从未在那时执行过! (它会触发不需要的 add r11b, 32
。)
解决方案是分别对两个字符进行 LCase:
...
cmp r10b, 65
jb Next
cmp r10b, 90
ja Next
add r10b, 32
Next:
cmp r11b, 65
jb Next_
cmp r11b, 90
ja Next_
add r11b, 32
Next_:
cmp r10b, r11b
...