하나로 합치기
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 39번째.
여러분은 write 시스템 호출(syscall)의 네 가지 구성 요소를 모두 배웠습니다:
| 레지스터 | 보관하는 내용 | 화면 출력을 위한 값 |
|---|---|---|
rax | 시스템 호출 번호 | 1 (write) |
rdi | 파일 서술자 | 1 (stdout) |
rsi | 버퍼 주소 | 문자열의 주소 |
rdx | 바이트 수 | 문자열의 길이 |
이제 이 모든 것을 하나로 합칠 시간입니다.
전체 write syscall 패턴:
mov rax, 1 ; write를 위한 syscall 번호
mov rdi, 1 ; 파일 디스크립터 (stdout)
mov rsi, msg ; 문자열의 주소
mov rdx, msgLen ; 출력할 바이트 수
syscall ; OS에 출력을 요청완전하게 작동하는 프로그램:
section .data
msg db 'Hello, World!', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscall이 프로그램의 기능:
| 단계 | 수행 내용 |
|---|---|
| 1 | 화면에 "Hello, World!"를 출력합니다 |
| 2 | 새 줄로 이동합니다 |
| 3 | 코드 0으로 정상 종료합니다 |
순서가 중요합니다:
syscall을 실행하기 전에 레지스터를 설정해야 합니다. syscall 전에 네 가지가 모두 설정되어 있는 한 mov 명령어의 순서는 중요하지 않습니다.
챌린지
메시지 "Assembly is fun"을 출력하고 줄바꿈을 한 뒤, 깔끔하게 종료하는 전체 프로그램을 작성하세요.
문자열과 그 길이는 이미 정의되어 있습니다. _start: 내부에 코드만 작성하면 됩니다.
직접 해보기
section .data
msg db 'Assembly is fun', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO: write 시스템 콜을 설정하고 호출합니다
; rax=1, rdi=1, rsi=msg, rdx=msgLen을 사용하세요
; TODO: 종료 코드 0으로 정상 종료합니다
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.