linux – strlen in assembly

我在汇编中创建了自己的strlen实现,但它没有返回正确的值.它返回字符串长度4.因此.我不明白为什么……我希望你们中的任何一个……
装配来源:

section .text
    [GLOBAL stringlen:] ; C function

stringlen:  
    push ebp
    mov ebp, esp        ; setup the stack frame

    mov ecx, [ebp+8]

    xor eax, eax        ; loop counter


startLoop:
    xor edx, edx
    mov edx, [ecx+eax]
    inc eax

    cmp edx, 0x0 ; null byte    
    jne startLoop
end:    
    pop ebp

    ret

主要例程:

#include <stdio.h>

extern int stringlen(char *);

int main(void)
{
  printf("%d", stringlen("h"));

  return 0;
}

谢谢

解决方法:

您不是访问字节(字符),而是双字.因此,您的代码不会寻找单个终止零,它正在寻找4个连续的零.请注意,并不总是返回正确的值4,它取决于字符串包含的内存.

要修复,您应该使用字节访问,例如将edx更改为dl.

上一篇:Linux x86 ASM – 获取用户输入


下一篇:linux – 在没有printf的NASM中打印ARGC