在彙編中編寫低階函數可能看起來令人畏懼,但這是加深您對事物底層工作原理的理解的絕佳方法。在本部落格中,我們將用彙編語言重新建立兩個流行的 C 標準函式庫函數 strlen 和 strcmp,並學習如何從 C 程式中呼叫它們。
本指南適合初學者,所以如果您是彙編程式設計新手,請不要擔心。讓我們深入了解一下! ?
組合語言的運作等級非常低,接近機器碼。與 C 等高階語言結合使用時,您將獲得兩全其美的效果:
在本指南中,我們將在彙編中編寫兩個函數 - 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; }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
透過在彙編中編寫 strlen 和 strcmp,您可以更好地理解:
您希望看到在組譯中重新建立哪些其他 C 標準函式庫函數?請在下面的評論中告訴我!
喜歡本指南嗎?在 Twitter 上分享您的想法或提出問題!讓我們一起聯繫並探索更多底層程式設計。 ?
以上是在彙編中重新建立 strlen 和 strcmp:逐步指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!