Menu
Coddy logo textTech

Buffer Address (rsi)

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

write syscall에서는 출력을 어디로 보낼지(파일 디스크립터는 rdi) OS에 알려준 다음, 무엇을 출력할지 알려줘야 합니다. 이를 위해 메모리에 있는 string의 address를 전달합니다.

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

버퍼란 무엇인가요?

버퍼는 단순히 데이터를 보관하는 메모리 블록입니다. 이 경우 버퍼는 우리가 출력하려는 string입니다.

왜 값 자체가 아니라 address인가요?

write syscall은 메모리에서 string이 시작되는 위치를 알아야 합니다. rdx에 지정한 길이에 도달할 때까지 해당 address에서 bytes를 읽습니다. 실제 문자를 syscall에 보내는 것이 아닙니다. 문자의 위치를 보냅니다.

예시:

section .data
    msg db 'Hello', 0x0a

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

msg가 실제로 의미하는 것:

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

address를 잊으면 어떻게 될까요?

rsi를 설정하지 않으면 레지스터에는 이전에 있던 임의의 값이 들어 있습니다. OS는 임의의 메모리 address에서 읽으려고 하며, 이로 인해 segmentation fault(충돌)가 발생할 가능성이 높습니다.

write syscall을 사용한 완전한 예제:

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

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

챌린지

greeting이라는 string이 주어지며, 값은 'Hi' 뒤에 줄바꿈이 이어집니다. greeting의 address를 rsi로 로드하는 코드 한 줄을 작성하세요.

rsi에 대한 mov instruction만 작성하세요.

직접 해보기

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실력 점검

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

기초의 모든 레슨

직접 연습해 보세요: Assembly 플레이그라운드