Das Schreiben von Low-Level-Funktionen in Assembly mag entmutigend erscheinen, ist aber eine hervorragende Möglichkeit, Ihr Verständnis dafür zu vertiefen, wie die Dinge unter der Haube funktionieren. In diesem Blog erstellen wir zwei beliebte C-Standardbibliotheksfunktionen, strlen und strcmp, in Assemblersprache nach und lernen, wie man sie aus einem C-Programm aufruft.
Diese Anleitung ist für Anfänger geeignet. Machen Sie sich also keine Sorgen, wenn Sie neu in der Assembler-Programmierung sind. Lass uns eintauchen! ?
Assemblersprache arbeitet auf einer sehr niedrigen Ebene, nahe dem Maschinencode. In Kombination mit einer Hochsprache wie C erhalten Sie das Beste aus beiden Welten:
In diesem Handbuch schreiben wir zwei Funktionen in Assembly – my_strlen und my_strcmp – und rufen sie aus C auf, um diese Integration zu demonstrieren.
Wir werden ihr Verhalten in der Montage nachbilden.
Führen Sie die folgenden Befehle aus:
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
Schreiben wir ein C-Programm, das diese Assembly-Funktionen aufruft.
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; }
nasm -f elf64 functions.asm -o functions.o gcc main.c functions.o -o main ./main
Length of 'Hello, Assembly!': 17 Comparing 'Hello' and 'Hello': 0 Comparing 'Hello' and 'World': -15
Durch das Schreiben von strlen und strcmp in Assembly erhalten Sie ein besseres Verständnis von:
Welche anderen C-Standardbibliotheksfunktionen würden Sie gerne in Assembly neu erstellt sehen? Lass es mich unten in den Kommentaren wissen!
Hat Ihnen dieser Leitfaden gefallen? Teilen Sie Ihre Gedanken oder stellen Sie Fragen auf Twitter! Lassen Sie uns gemeinsam mehr Low-Level-Programmierung vernetzen und erkunden. ?
Das obige ist der detaillierte Inhalt vonStrlen und strcmp in Assembly neu erstellen: Eine Schritt-für-Schritt-Anleitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!