Menu
CoddyTech

Buffer Address (rsi)

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

write 시스템 호출에서 OS에 출력을 어디로 보낼지(파일 디스크립터는 rdi) 알려준 다음에는 무엇을 출력할지도 알려줘야 합니다. 메모리에 있는 문자열의 주소를 전달하면 됩니다.

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

버퍼란 무엇인가요?

버퍼는 데이터를 저장하는 메모리 블록입니다. 여기서는 버퍼가 출력하려는 문자열입니다.

왜 값 자체가 아니라 주소일까요?

write 시스템 호출은 메모리에서 문자열이 어디서 시작하는지 알아야 합니다. rdx에 지정한 길이에 도달할 때까지 해당 주소에서 바이트를 읽습니다. 실제 문자를 시스템 호출에 전달하는 것이 아닙니다. 문자가 있는 위치를 전달합니다.

예:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi에는 msg의 주소가 저장됩니다

msg의 실제 의미:

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

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

기초의 모든 레슨

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