$ 기호
Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 29번째.
write 시스템 호출(5장)을 사용하여 문자열을 출력할 때는 CPU에 출력할 바이트 수를 알려야 합니다.
문자를 수동으로 셀 수도 있습니다:
message db 'Hello', 0x0a ; 6바이트 (H e l l o 개행)
mov rdx, 6 ; 수동 카운트하지만 수동으로 세는 작업은 느리고 오류가 발생하기 쉽습니다. 문자열을 변경하면 다시 세고 숫자를 업데이트해야 합니다.
해법: $를 사용한 자동 길이 계산
$는 위치 카운터입니다. 다음 바이트가 배치될 현재 메모리 주소를 나타냅니다.
예제 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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: Assembly 플레이그라운드