アセンブリで低レベル関数を記述するのは難しそうに思えるかもしれませんが、内部でどのように機能するかについて理解を深めるには優れた方法です。このブログでは、2 つの一般的な C 標準ライブラリ関数 strlen と strcmp をアセンブリ言語で再作成し、C プログラムからそれらを呼び出す方法を学びます。
このガイドは初心者向けなので、アセンブリ プログラミングが初めてでも心配する必要はありません。飛び込んでみましょう! ?
アセンブリ言語は、マシンコードに近い非常に低レベルで動作します。 C のような高級言語と組み合わせると、両方の長所を活用できます。
このガイドでは、アセンブリで 2 つの関数 (my_strlen と my_strcmp) を作成し、C から呼び出してこの統合を示します。
アセンブリでの動作を再現します。
次のコマンドを実行します:
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
これらのアセンブリ関数を呼び出す C プログラムを書いてみましょう。
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
アセンブリで strlen と strcmp を記述することで、以下についてより深く理解できます。
アセンブリで再作成したい他の C 標準ライブラリ関数は何ですか?以下のコメント欄でお知らせください。
このガイドは気に入りましたか? Twitter でご意見やご質問を共有してください。一緒に接続して、より低レベルのプログラミングを探索しましょう。 ?
以上がアセンブリでの strlen と strcmp の再作成: ステップバイステップ ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。