Maison >développement back-end >C++ >Recréer strlen et strcmp dans Assembly : un guide étape par étape
Écrire des fonctions de bas niveau en assembleur peut sembler intimidant, mais c'est un excellent moyen d'approfondir votre compréhension de la façon dont les choses fonctionnent sous le capot. Dans ce blog, nous allons recréer deux fonctions populaires de la bibliothèque standard C, strlen et strcmp, en langage assembleur et apprendre à les appeler à partir d'un programme C.
Ce guide est destiné aux débutants, alors ne vous inquiétez pas si vous êtes nouveau dans la programmation assembleur. Allons-y ! ?
Le langage assembleur fonctionne à un niveau très bas, proche du code machine. En combinaison avec un langage de haut niveau comme le C, vous obtenez le meilleur des deux mondes :
Dans ce guide, nous allons écrire deux fonctions en assembly (my_strlen et my_strcmp) et les appeler depuis C pour démontrer cette intégration.
Nous reproduirons leur comportement lors de l’assemblage.
Exécutez les commandes suivantes :
sudo apt update sudo apt install nasm gcc
sudo apt update sudo apt install nasm gcc
section .text global my_strlen my_strlen: xor rax, rax ; Set RAX (length) to 0 .next_char: cmp byte [rdi + rax], 0 ; Compare current byte with 0 je .done ; If 0, jump to done inc rax ; Increment RAX jmp .next_char ; Repeat .done: ret ; Return length in RAX
Écrivons un programme C qui appelle ces fonctions d'assemblage.
section .text global my_strcmp my_strcmp: xor rax, rax ; Set RAX (result) to 0 .next_char: mov al, [rdi] ; Load byte from first string cmp al, [rsi] ; Compare with second string jne .diff ; If not equal, jump to diff test al, al ; Check if we’ve hit <pre class="brush:php;toolbar:false">#include <stdio.h> #include <stddef.h> // Declare the assembly functions extern size_t my_strlen(const char *str); extern int my_strcmp(const char *s1, const char *s2); int main() { // Test my_strlen const char *msg = "Hello, Assembly!"; size_t len = my_strlen(msg); printf("Length of '%s': %zu\n", msg, len); // Test my_strcmp const char *str1 = "Hello"; const char *str2 = "Hello"; const char *str3 = "World"; int result1 = my_strcmp(str1, str2); int result2 = my_strcmp(str1, str3); printf("Comparing '%s' and '%s': %d\n", str1, str2, result1); printf("Comparing '%s' and '%s': %d\n", str1, str3, result2); return 0; }je .done ; If
nasm -f elf64 functions.asm -o functions.o gcc main.c functions.o -o main ./main, strings are equal inc rdi ; Advance pointers inc rsi jmp .next_char ; Repeat .diff: sub rax, [rsi] ; Return difference .done: ret
Length of 'Hello, Assembly!': 17 Comparing 'Hello' and 'Hello': 0 Comparing 'Hello' and 'World': -15
En écrivant strlen et strcmp en assembly, vous comprenez mieux :
Quelles autres fonctions de la bibliothèque standard C aimeriez-vous voir recréées en assembly ? Faites-le moi savoir dans les commentaires ci-dessous !
Vous avez apprécié ce guide ? Partagez vos réflexions ou posez des questions sur Twitter ! Connectons-nous et explorons ensemble davantage de programmation de bas niveau. ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!