C++ 게임개발 인강02_조건문, 반복문 및 주소/배열
조건문
%include "io64.inc"
section .bss
a resb 1
section .text
global CMAIN
CMAIN:
mov rbp, rsp; for correct debugging
;write your code here
GET_DEC 1, ax ;div를 하기 위해서는 그 값이 ax에 저장되어야한다.
mov bl, byte 2
div bl ;ax의 값이 bl로 나눠어져서 ah에는 나머지 al에는 몫
cmp ah, byte 1
je EQUALS
PRINT_DEC 1, 0 ;위에서 점프를 하지 않았으면 짝수라는 뜻
jmp END ;순차적으로 진행하므로 jmp하지 않으면 EQUALS라벨 코드 실행됨.
EQUALS:
PRINT_DEC 1, 1
END:
xor rax, rax
ret
조건문에서 cmp 후 그 결과에 따라 EFLAGS 레지스터의 ZF플래그가 변화한다. je, jnp등의 조건명령어들은 플래그를 확인 후 분기한다.
위의 코드에서도 조건을 만족하게 되면 레지스터 윈도우의 eflags에서 ZF가 활성화된다.
반복문
반복문은 조건문과 JUMP를 혼합하여 구현한다.
%include "io64.inc"
section .data
msg db 'Hello', 0x0
section .text
global CMAIN
CMAIN:
mov rbp, rsp; for correct debugging
;write your code here
mov eax, 3
LOOP_HELLO:
PRINT_STRING msg
NEWLINE
dec eax ;카운트 감소
cmp eax, byte 0 ;카운트가 0인지 확인
jne LOOP_HELLO ;~플래그가 활성화 되었으면(0이면) 위의 LOOP_HELLO로 점프
xor rax, rax
ret
주소와 배열
%include "io64.inc"
section .data
arr db 0x01, 0x02, 0x03, 0x04, 0x05
arr2 times 5 db 0x01 ;0x01로 1byte씩 5개 할당
section .text
global CMAIN
CMAIN:
mov rbp, rsp; for correct debugging
;write your code here
mov rax, arr ;db 배열의 시작 주소를 rax에 저장
PRINT_HEX 1, [rax]
NEWLINE
PRINT_HEX 1, [rax + 1]
NEWLINE
PRINT_HEX 1, [rax + 2]
NEWLINE
PRINT_HEX 1, [rax + 3]
NEWLINE
xor rax, rax
ret
추가 : 만약 위의 배열의 단위가 word라면, 인덱스를 2칸씩 움직여야 하며, 리틀엔디안 빅엔디안또한 고려해줘야 할 수 있다.