작성
·
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
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
1
0