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
  ...