为什么这个x86_64汇编代码不起作用?

为什么这个x86_64汇编代码不起作用?

问题描述:

section .text 
    global my_strlen 

my_strlen: 
    xor rax, rax 
.LOOP: 
    cmp BYTE[rdi+rax], 0 
    jne .LOOP 
    inc rax 
    ret 

我执行它:为什么这个x86_64汇编代码不起作用?

#include <stddef.h> 
#include <stdio.h> 

extern size_t my_strlen(const char *str); 

int main(int argc, char *argv[]) { 
    if(argc!=2) return 1; 
    printf("%lu\n", (unsigned long)my_strlen(argv[1])); 
    return 0; 
} 

但是,当我执行程序时,它不会不输出任何东西,它不会关闭。

+0

不应该'inc rax'在循环内吗? – sl0815 2011-05-21 10:36:18

在循环中增加rax。否则,你总是测试相同的字节。

my_strlen: 
    xor rax, rax 
    dec rax 
.LOOP: 
    inc rax 
    cmp BYTE[rdi+rax], 0 
    jne .LOOP 
+0

INC会不会影响标志? – 2011-05-21 11:46:54

+0

@波佩尔松 - 我的错误 - 我编辑了答案。 – MByD 2011-05-21 11:57:31

您需要在循环中增加rax。

在循环外增加rax