인프런 커뮤니티 질문&답변

움직이는YM님의 프로필 이미지
움직이는YM

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

어셈블리어 분기문2

작성

·

289

0

강의 마지막 문제에서(아직 반복문을 듣기 전입니다)

ax가 100인 상황에서만 값을 판단하는 것뿐만 아니라 

ax가 100 99 98 97 96 ...이렇게 줄어들면서 홀/짝 판단을 하는 코드를 만들고 싶었습니다.

%include "io64.inc"

section .text

global CMAIN

CMAIN:

;write your code here

  mov ax, 100

  mov bl, 2

LOP:

  div bl

  cmp ah, 0

  je EVENNUMBER

  jmp ODDNUMBER

ODDNUMBER:

  mov rcx, 1

  PRINT_HEX 1, rcx

  NEWLINE

  sub ax, 1

  cmp ax, 0

  je END

  jmp LOP

EVENNUMBER:

  mov rcx, 0

  PRINT_HEX 1, rcx

  NEWLINE

  sub ax, 1

  cmp ax, 0

  je END

  jmp LOP

END:

  xor rax, rax

ret

따라서 이와 같이 코드를 작성했습니다. 하지만 0 1 0 1 0 1이 아닌 0 0 1 0 1 0 0 0..이런식으로 무한루프에 빠지고 있습니다

혹시 코드의 어느 부분이 잘못되었는지 궁금합니다.

또한 PRINT_HEX 1, rcx에서 저 1이 1byte인 것은 알겠습니다. 그렇다면 옆 코드의 의미는 rcx의 내용을 1byte만큼 16진수로 표현하겠다는 뜻이 맞나요? 

답변 4

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

div bl를 하게 되면 al에 몫이, ah에 나머지게 들어가게 되는데
그렇다는 것은 ax 의 값도 같이 바뀌기 때문입니다.
즉 레지스터 설정이 잘못 되어서 발생한 문제입니다.

ecx나 edx를 카운팅 용도로 설정하고,
LOP:에서 div를 하기 바로 전에
mov ax, cx 등을 넣어주시면 되겠습니다.
(ecx로 카운팅을 한다면 PRINT_HEX는 거꾸로 필요없는 eax로 바꾸고, sub, cmp도 cx로 해줘야겠죠)

PRINT_HEX size 가 나오는 것은 맞는데 뒤에 메모리가 올 경우에만 의미가 있고
레지스터가 오면 그냥 그 레지스터 안에 있는 값을 표시해준다고 생각하시면 됩니다.
참고로 PRINT_HEX는 딱히 어셈블리 표준 명령어 같은 개념이 아니고
SASM이라는 툴에서 편리하게 사용하라고 건내준 매크로에 불과하니
깊게 고민할 부분이 아닙니다.

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

맞습니다 ㅎㅎ 매의 눈을 가지셨군요!

1

중간에 cmp ax, 0은 cmp cx, 0인 것을 확인했습니다.

0

아 제가 레지스터 구조에 대한 생각이 부족했던 것 같습니다.

친절한 답변 감사합니다!

움직이는YM님의 프로필 이미지
움직이는YM

작성한 질문수

질문하기