Byte Count (rdx)
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 38번째.
OS에게 어디에 출력할지(rdi)와 무엇을 출력할지(rsi)를 알려주었습니다. 이제 몇 바이트를 출력할지 알려주어야 합니다.
바이트 수를 위한 레지스터는 rdx입니다.
OS에 왜 길이가 필요한가요?
OS는 문자열이 어디서 끝나는지 알지 못합니다. 길이가 없다면, 메모리를 영원히 계속 읽게 될 것입니다. 길이는 OS에게 정확히 언제 멈춰야 할지를 알려줍니다.
예제:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = 출력할 바이트 수길이가 잘못되면 어떻게 되나요?
| 설정할 경우 | 결과 |
|---|---|
| 너무 짧음 | 문자열의 일부만 출력됨 |
| 너무 긺 | OS가 문자열을 지나 쓰레기 메모리(garbage memory)까지 계속 읽습니다. 무작위 문자가 출력되거나 충돌이 발생할 수 있습니다. |
| 0 | 아무것도 출력되지 않음 |
길이 자동 계산:
여러분은 이미 3장에서 $ - label 패턴을 배웠습니다:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + 줄바꿈)이것은 문자열을 변경하더라도 길이가 항상 정확하게 유지되도록 보장합니다.
전체 예제:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; write 시스템 콜
mov rdi, 1 ; 표준 출력(stdout)
mov rsi, msg ; 문자열 주소
mov rdx, msgLen ; 바이트 수
syscall챌린지
'Red' 값과 줄바꿈 문자가 포함된 color라는 이름의 문자열이 주어집니다. $ - color를 사용하여 colorLen이라는 상수가 이미 정의되어 있습니다.
colorLen 상수를 사용하여 rdx를 문자열의 길이로 설정하는 코드 한 줄을 작성하세요.
rdx에 대한 mov 명령어만 작성하세요.
직접 해보기
section .text
global _start
_start:
; 학생의 코드가 먼저 실행됩니다 (rdx를 설정함)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; rdx에는 이미 길이가 포함되어 있습니다 (학생의 코드로부터)
syscall
mov rax, 60
mov rdi, 0
syscall이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.