Почему этот код сборки x86_64 не работает? - PullRequest
1 голос
/ 21 мая 2011
section .text
    global my_strlen

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

Я выполняю это с:

#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;
}

Но когда я запускаю программу, она ничего не выводит и не закрывается.

Ответы [ 3 ]

4 голосов
/ 21 мая 2011

Вам нужно увеличить rax внутри цикла.

3 голосов
/ 21 мая 2011

Увеличение rax в цикле.В противном случае вы всегда проверяете один и тот же байт.

my_strlen:
    xor rax, rax
    dec rax
.LOOP:
    inc rax
    cmp BYTE[rdi+rax], 0
    jne .LOOP
1 голос
/ 21 мая 2011

Увеличение rax вне петли

...