$ 기호
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 29번째.
write 시스템 호출(5장)을 사용하여 문자열을 출력할 때, CPU에 몇 바이트를 출력할지 알려주어야 합니다.
문자를 수동으로 셀 수 있습니다:
message db 'Hello', 0x0a ; 6바이트 (H e l l o 줄바꿈)
mov rdx, 6 ; 수동 카운트하지만 수동으로 세는 것은 느리고 오류가 발생하기 쉽습니다. 문자열을 변경하면 다시 세고 숫자를 업데이트해야 합니다.
해결책: <strong>$lt;/strong>를 사용한 자동 길이 계산
$는 위치 카운터(location counter)입니다 — 이는 다음 바이트가 배치될 현재 메모리 주소를 나타냅니다.
예제 1: 단순 문자열
section .data
message db 'Hello', 0x0a
msgLen equ $ - message작동 원리:
message은(는) 시작 주소입니다 (예: 1000)- 6바이트를 저장한 후,
$은(는) 1006이 됩니다 $ - message= 1006 − 1000 = 6 (길이)
참고: equ는 equate의 약자입니다. 이것은 상수, 즉 값을 나타내는 이름을 생성합니다.
예제 2: 여러 개의 문자열
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', 줄바꿈)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', 줄바꿈)
각 문자열은 자동으로 계산된 고유한 길이를 가집니다. $는 각 계산마다 초기화되는데, 이는 항상 각 문자열 바로 뒤의 현재 위치를 참조하기 때문입니다.
챌린지
쉬움값은 'Paris'이고 뒤에 개행 문자(0x0a)가 오는 city라는 이름의 문자열을 생성하세요. 그런 다음 $ - city를 사용하여 길이를 자동으로 계산하는 cityLen이라는 이름의 상수를 생성하세요.
직접 해보기
%include "data.asm"
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, city
mov rdx, cityLen
syscall
mov rax, 60
mov rdi, 0
syscall이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.