Menulis fungsi peringkat rendah dalam pemasangan mungkin kelihatan menakutkan, tetapi ini merupakan cara terbaik untuk memperdalam pemahaman anda tentang cara sesuatu berfungsi di bawah hud. Dalam blog ini, kami akan mencipta semula dua fungsi perpustakaan standard C yang popular, strlen dan strcmp, dalam bahasa himpunan dan mempelajari cara memanggilnya daripada program C.
Panduan ini mesra pemula, jadi jangan risau jika anda baru dalam pengaturcaraan pemasangan. Mari selami! ?
Bahasa perhimpunan beroperasi pada tahap yang sangat rendah, hampir dengan kod mesin. Apabila digabungkan dengan bahasa peringkat tinggi seperti C, anda mendapat yang terbaik dari kedua-dua dunia:
Dalam panduan ini, kami akan menulis dua fungsi dalam pemasangan—my_strlen dan my_strcmp—dan memanggilnya daripada C untuk menunjukkan penyepaduan ini.
Kami akan meniru tingkah laku mereka dalam perhimpunan.
Jalankan arahan berikut:
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
Mari kita tulis program C yang memanggil fungsi pemasangan ini.
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
Dengan menulis strlen dan strcmp dalam pemasangan, anda memperoleh pemahaman yang lebih baik tentang:
Apakah fungsi perpustakaan standard C lain yang anda ingin lihat dicipta semula dalam pemasangan? Beritahu saya dalam komen di bawah!
Menikmati panduan ini? Kongsi pendapat anda atau tanya soalan di Twitter! Mari sambung dan terokai lebih banyak pengaturcaraan peringkat rendah bersama-sama. ?
Atas ialah kandungan terperinci Mencipta semula strlen dan strcmp dalam Assembly: Panduan Langkah demi Langkah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!