> 백엔드 개발 > C++ > 어셈블리에서 strlen 및 strcmp 다시 만들기: 단계별 가이드

어셈블리에서 strlen 및 strcmp 다시 만들기: 단계별 가이드

DDD
풀어 주다: 2024-11-26 16:54:11
원래의
883명이 탐색했습니다.

Recreating strlen and strcmp in Assembly: A Step-by-Step Guide

어셈블리에서 하위 수준 함수를 작성하는 것은 어려워 보일 수 있지만, 내부적으로 작동하는 방식에 대한 이해를 심화할 수 있는 훌륭한 방법입니다. 이 블로그에서는 널리 사용되는 두 가지 C 표준 라이브러리 함수인 strlen 및 strcmp를 어셈블리 언어로 다시 만들고 C 프로그램에서 이를 호출하는 방법을 알아봅니다.

이 가이드는 초보자에게 적합하므로 어셈블리 프로그래밍이 처음이더라도 걱정하지 마세요. 뛰어 들어보세요! ?


목차

  1. 어셈블리 및 C 통합 소개
  2. strlen과 strcmp는 무엇입니까?
  3. 환경 설정
  4. 어셈블리에서 strlen 작성
  5. 어셈블리에서 strcmp 작성
  6. C와 어셈블리 통합
  7. 프로그램 컴파일 및 실행
  8. 예상 출력
  9. 결론
  10. 트위터에 연결

1. 어셈블리 및 C 통합 소개

어셈블리 언어는 기계어에 가까운 매우 낮은 수준에서 작동합니다. C와 같은 고급 언어와 결합하면 두 가지 장점을 모두 누릴 수 있습니다.

  • 높은 수준의 가독성.
  • 낮은 수준의 제어 및 최적화.

이 가이드에서는 my_strlen 및 my_strcmp라는 두 가지 함수를 어셈블리로 작성하고 C에서 호출하여 이러한 통합을 보여줍니다.


2. strlen과 strcmp는 무엇인가요?

  • strlen: 이 함수는 null로 끝나는 문자열( 로 끝나는 문자열)의 길이를 계산합니다.
  • strcmp: 이 함수는 두 문자열을 문자별로 비교합니다. 다음을 반환합니다.
    • 문자열이 동일하면 0입니다.
    • 첫 번째 문자열이 더 작으면 음수 값입니다.
    • 첫 번째 문자열이 더 크면 양수 값입니다.

우리는 어셈블리에서 그들의 행동을 복제할 것입니다.


3. 환경 설정

필요한 도구:

  1. NASM (Netwide Assembler): 어셈블리 코드를 어셈블합니다.
  2. GCC (GNU Compiler Collection): C 및 어셈블리 코드를 컴파일하고 링크합니다.

도구 설치(Linux):

다음 명령을 실행하세요:

sudo apt update
sudo apt install nasm gcc
로그인 후 복사
로그인 후 복사

4. 어셈블리에서 strlen 작성

strlen의 논리:

  1. 0으로 초기화된 카운터로 시작합니다.
  2. 널 종결자( )가 발견될 때까지 문자열의 각 문자를 읽습니다.
  3. 카운터를 길이로 반환합니다.

my_strlen의 어셈블리 코드:

sudo apt update
sudo apt install nasm gcc
로그인 후 복사
로그인 후 복사
  • 사용된 레지스터:
    • RDI: 입력 문자열을 가리킵니다.
    • RAX: 문자열 길이(출력)를 저장합니다.

5. 어셈블리에서 strcmp 작성

strcmp의 논리:

  1. 두 문자열의 문자를 비교합니다.
  2. 문자가 다르거나 널 종결자( )에 도달하면 중지하세요.
  3. 반품:
    • 문자열이 같으면 0입니다.
    • ASCII 값이 다를 경우 차이가 납니다.

my_strcmp의 어셈블리 코드:

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
로그인 후 복사
  • 사용된 레지스터:
    • RDI 및 RSI: 입력 문자열에 대한 포인터입니다.
    • RAX: 결과(출력)를 저장합니다.

6. C와 어셈블리 통합

이러한 어셈블리 함수를 호출하는 C 프로그램을 작성해 보겠습니다.

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

7. 프로그램 컴파일 및 실행

  1. 어셈블리 코드를 function.asm에 저장하세요.
  2. C 코드를 main.c에 저장하세요.
  3. 컴파일 및 링크:
Length of 'Hello, Assembly!': 17
Comparing 'Hello' and 'Hello': 0
Comparing 'Hello' and 'World': -15
로그인 후 복사

8. 예상 출력


9. 결론

어셈블리에서 strlen과 strcmp를 작성하면 다음 사항을 더 잘 이해할 수 있습니다.

  • 저수준 메모리 작업.
  • 기계 수준에서 문자열이 처리되는 방식.
  • C와 어셈블리를 통합하여 두 언어의 장점을 활용합니다.

어셈블리에서 다시 생성되었으면 하는 다른 C 표준 라이브러리 함수는 무엇입니까? 아래 댓글로 알려주세요!


10. 트위터로 연결

이 가이드가 마음에 드셨나요? Twitter에서 생각을 공유하거나 질문하세요! 더 낮은 수준의 프로그래밍을 함께 연결하고 탐색해 봅시다. ?

위 내용은 어셈블리에서 strlen 및 strcmp 다시 만들기: 단계별 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿