해당 코드는 왜 오류가 날까요?
153
작성한 질문수 14
%include "io64.inc"
section .text
global main
main:
mov rbp, rsp; for correct debugging
mov ecx, 10
LABEL_LOOP_SUM:
PRINT_DEC 4, ebx
loop LABEL_LOOP_SUM
xor rax, rax
ret
해당 코드는 왜 오류가 날까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 오류님 수강생님. 질문에 대한 답변을 드리겠습니다.
주어진 코드에서 발생하는 오류는 어셈블리어에서의 루프(loop) 명령어와 관련이 있습니다. loop 명령어는 일반적으로 ecx 레지스터에 전역 카운터를 사용하여 감소시키고, 값이 0이 될 때까지 반복합니다. 그러나 주어진 코드에서 ecx 레지스터만 초기화하였고, 루프 내에서 ecx 값을 감소시키지 않았습니다. 따라서 루프가 영원히 지속되거나 예상치 않은 동작을 할 수 있습니다.
짧은 점프 거리 한계 관련 질문에서도 설명되었듯이, loop 명령은 전역 레지스터 ecx를 사용하여 동작합니다. 만약 레지스터를 감소시키거나 초기화하지 않으면, 루프가 의도한 대로 동작하지 않을 수 있습니다.
또한, PRINT_DEC에서 ebx 레지스터를 사용하고 있으나 초기화하지 않았기 때문에, 출력될 값이 예측할 수 없는 상태일 수 있습니다. ebx를 0으로 초기화하거나 원하는 출력 값을 설정해야 합니다.
이와 관련한 유사한 예로 아래 질문도 참고하실 수 있습니다:
- short jump is out of range 에러
- 이 질문에서는 점프 명령어 사용 시 발생할 수 있는 거리 한계와 루프 구조에 대한 설명이 제공됩니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
소스코드와 관련하여 질문드립니다
0
66
1
map 컨테이너의 emplace 함수에 대해
0
108
2
시작이 안되네요...!
0
95
2
EAX 명령어 실행 시 RAX의 상위 32비트가 초기화 되는 이유
0
125
1
리틀 엔디안 장점 질문합니다.
0
129
1
메모리 창에 주소를 넣었는데 영어 꺠짐
0
124
1
타입변환#2 build시 knight 인접 stack이 침범당했다는 error가 발생합니다.
0
94
2
map #1 8분 58초 맵은 레드블랙트리로 이루어진 것 같습니다.
1
138
2
hello world 부터 오류 ㅠㅜ
0
186
1
지역변수가 스택? 레지스터
0
126
2
마지막 문제 질문드립니다.
0
162
2
메모리창이 비활성화됩니다.
0
98
1
이중포인터 강좌 부분 질문있습니다.
0
145
1
2를 더하는 이유
0
132
1
메모리 주소 창 엔디안 질문 드립니다. 인프런 봇 답변도 괜찮습니다
1
109
1
마지막 문제 질문 있습니다.
0
115
1
강의 마지막부분에 질문이 있습니다.
0
190
2
Field초기화
0
140
1
virtual과 override 차이
0
313
2
3:30 참조자 리턴
0
165
1
map 찾기
0
155
1
프로그램 질문드려요
0
256
1
캐스팅 질문
0
135
1
암시적/명시적 생성자 쓸 때 주의할 점 공유
0
279
1





