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 = 출력할 바이트 수length가 잘못되면 어떻게 될까요?
| 다음과 같이 설정하면 | 결과 |
|---|---|
| 너무 짧음 | string의 일부만 출력됩니다 |
| 너무 김 | OS가 string을 지나 쓰레기 메모리까지 계속 읽습니다. 무작위 문자가 출력되거나 충돌할 수 있습니다 |
| 0 | 아무것도 출력되지 않습니다 |
길이 자동 계산:
Chapter 3에서 이미 $ - label 패턴을 학습했습니다. already
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + 개행)이는 string을 변경하더라도 length가 항상 올바르도록 보장합니다.
완전한 예제:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; write 시스템 호출
mov rdi, 1 ; 표준 출력
mov rsi, msg ; 문자열의 주소
mov rdx, msgLen ; 바이트 수
syscall챌린지
color라는 문자열이 주어지며, 값은 'Red' 뒤에 newline이 옵니다. $ - color를 사용하여 colorLen이라는 상수가 이미 정의되어 있습니다.
colorLen 상수를 사용하여 rdx를 string의 길이로 설정하는 코드 줄을 작성하세요.
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: Assembly 플레이그라운드