linux - 组装中的强项

标签 linux assembly x86 nasm strlen

我在汇编中实现了自己的 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 - 组装中的强项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5041481/

相关文章:

linux - 监控多台服务器

r - 无法加载共享对象 quantreg.so

linux - 创建一个参数以在linux中查找以特定字母开头的文件

c++ - 有没有办法刷新与程序相关的整个CPU缓存?

c - c编译器如何处理无符号和有符号整数?为什么无符号和有符号算术运算的汇编代码相同?

optimization - SIMD 指令降低 CPU 频率

assembly - 在内存中彼此相邻的 NASM 标签中,打印两个字符串而不是第一个字符串

c++ - 在 debian linux 中使用 c 复制文件

c - nasm 中的链接 c 函数

java - 用于 java (JNI) 的 x86 到 x64 库包装器