inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

어셈블리어 분기문2

391

움직이는YM

작성한 질문수 86

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진수로 표현하겠다는 뜻이 맞나요? 

C++

답변 4

2

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

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

1

움직이는YM

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

0

움직이는YM

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

친절한 답변 감사합니다!

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

541

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

442

1

strcpy() 구현 관련 질문

0

513

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

452

1

클래스 타입의 포인터 질문합니다

0

546

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

497

1

템플릿 특수화 관련 질문

0

384

1

포인터 관련 질문합니다!

0

263

1

Unable to start assembler. Check your settings.

0

830

2

cpu선택

0

539

1

포인터 질문이 있습니다

0

322

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

584

1

iterator 삭제관련

0

406

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

310

1

15 분 45초 대 질문

0

308

0

스택 프레임 질문합니다!

2

306

1

오른값 참조 in 게임

0

384

0

동적할당 질문이 있습니다

0

449

1

안녕하세요 메모리에 대해 질문드립니다.

0

304

1

함수객체 의 매개변수

0

358

1

복사생성자

0

434

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

419

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

353

1

스택 오버플로우

2

790

1