2011-05-21 5 views
1
section .text 
    global my_strlen 

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

J'exercerai avec:Pourquoi ce code d'assemblage x86_64 ne fonctionne-t-il pas?

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

Mais quand j'exécute le programme, il ne affiche rien et il ne ferme pas.

+0

Le 'inc rax' ne devrait-il pas être dans la boucle? – sl0815

Répondre

4

Increment rax dans la boucle. Sinon, vous testez toujours le même octet.

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

L'INC ne va-t-il pas affecter les drapeaux? –

+0

@Bo Persson - Mon erreur - J'ai édité la réponse. – MByD

5

Vous devez incrémenter le nombre de lignes dans la boucle.

1

augmentation rax extérieur de la boucle