Menu
Coddy logo textTech

Buffer Address (rsi)

Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 37번째.

write 시스템 호출(syscall)에서, 출력을 어디로 보낼지(rdi의 파일 디스크립터) OS에 알린 후에는, 무엇을 출력할지 알려주어야 합니다. 이는 메모리에 있는 문자열의 주소를 전달함으로써 수행됩니다.

버퍼 주소를 위한 레지스터는 rsi입니다.

버퍼란 무엇인가요?

버퍼는 단순히 데이터를 보유하는 메모리 블록입니다. 우리의 경우, 버퍼는 우리가 출력하고자 하는 문자열입니다.

왜 값이 아닌 주소인가요?

write 시스템 호출(syscall)은 문자열이 메모리의 어디에서 시작하는지 알아야 합니다. 이는 rdx에 지정한 길이에 도달할 때까지 해당 주소에서 바이트를 읽습니다. 시스템 호출에 실제 문자를 보내는 것이 아니라, 그 위치를 보내는 것입니다.

예시:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi는 msg의 주소를 보유합니다

<strong>msg</strong>의 실제 정체:

msg는 레이블입니다. 어셈블러는 이를 숫자, 즉 문자열 'Hello'가 저장된 메모리 주소로 바꿉니다. mov rsi, msg라고 작성하면, 해당 주소 숫자를 rsi에 넣는 것입니다.

주소를 잊어버리면 어떻게 되나요?

rsi를 설정하지 않으면, 레지스터에는 이전에 있던 쓰레기 값이 포함됩니다. OS는 무작위 메모리 주소에서 읽기를 시도할 것이며, 이는 아마도 세그멘테이션 결함(크래시)을 유발할 것입니다.

write 시스템 호출을 사용한 전체 예제:

section .data
    msg db 'Hello', 0x0a
    len equ $ - msg

section .text
    mov rax, 1          ; write 시스템 호출
    mov rdi, 1          ; 표준 출력(stdout)
    mov rsi, msg        ; 문자열 주소
    mov rdx, len        ; 바이트 수
    syscall
challenge icon

챌린지

'Hi'라는 값과 줄바꿈 문자가 포함된 greeting이라는 문자열이 주어집니다. greeting의 주소를 rsi에 로드하는 코드 한 줄을 작성하세요.

rsi에 대한 mov 명령어만 작성하세요.

직접 해보기

section .text
    global _start

_start:
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    ; rsi에는 이미 주소가 포함되어 있습니다 (학생의 코드에서 제공됨)
    mov rdx, greetingLen
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨