어셈블리어 분기문2
391
작성한 질문수 86
강의 마지막 문제에서(아직 반복문을 듣기 전입니다)
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
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이라는 툴에서 편리하게 사용하라고 건내준 매크로에 불과하니
깊게 고민할 부분이 아닙니다.
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





