어셈블리에서 하위 수준 함수를 작성하는 것은 어려워 보일 수 있지만, 내부적으로 작동하는 방식에 대한 이해를 심화할 수 있는 훌륭한 방법입니다. 이 블로그에서는 널리 사용되는 두 가지 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; }
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!