작성
·
52
0
%include "io64.inc"
section .text
global main
main:
mov rbp, rsp; for correct debugging
PRINT_HEX 2, [b]
NEWLINE
PRINT_HEX 2, [b + 2]
NEWLINE
PRINT_HEX 2, [b + 4]
NEWLINE
PRINT_HEX 2, [b + 6]
xor rax, rax
ret
section .data
b dw 0x0001, 0x0001, 0x0001, 0x0001
위 코드에서 2를 더하는 이유가 무엇인가요? 1씩 더하면 왜 1 100 1 100이라 나오는지 모르겠습니다!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 오류님 문의하신 내용에 대해 설명드리겠습니다.
어셈블리 코드에서 PRINT_HEX 2, [b]
는 2바이트 단위로 데이터(16진수)를 출력하게 됩니다. b dw 0x0001, 0x0001, 0x0001, 0x0001
와 같은 데이터를 선언하면 이는 메모리상에 2바이트 단위로 저장됩니다. 그래서 다음과 같이 메모리에 저장됩니다:
0x0001
(첫 번째 2바이트)0x0001
(두 번째 2바이트)0x0001
(세 번째 2바이트)0x0001
(네 번째 2바이트)이전에는 메모리가 1바이트씩 이동한다면, PRINT_HEX 2, [b+1]
처럼 중간 주소에서 읽게 되어 엉뚱한 값을 출력하게 되지만, 현재 코드에서는 2바이트 단위로 이동하고 있어서 정상 출력됩니다.
PRINT_HEX 2, [b]
는 첫 번째 2바이트 (0x0001
)를 출력합니다.PRINT_HEX 2, [b + 2]
는 두 번째 2바이트 (0x0001
)를 출력합니다.PRINT_HEX 2, [b + 4]
는 세 번째 2바이트 (0x0001
)를 출력합니다.PRINT_HEX 2, [b + 6]
는 네 번째 2바이트 (0x0001
)를 출력합니다.따라서 PRINT_HEX 2
에서 2를 더하는 이유는 메모리에서 두 번째 2바이트 시작 주소로 이동하기 위한 것입니다. 이렇게 해야 데이터가 2바이트 단위로 끊어져 저장된 것과 일치하게 읽을 수 있습니다.
좀 더 자세한 내용은 다음 유사한 질문과 답변을 참고하시면 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.