분기문
특정 조건에 따라서 코드 흐름을 제어하는 것, 그것이 분기문이다.
ex) 스킬 사용 버튼을 눌렀는가? yes -> 스킬 사용
ex) 제한 시간 내에 던전 입장 수락 버튼을 눌렀는가? yes -> 입장, no -> 던전 취소
분기문과 밑에 나올 반복문만 사용해도 어느정도 프로그램을 만들 수 있다.
조건이란 곧 흐름인 것이다. 이걸 명심하자
어셈블리어에서 비교를 하기 위해서는 CMP 명령어를 사용한다.(CMP dst, src (dst가 기준)) SASM - 1 포스팅에서 말했듯이 CPU에는 A,B,C,D 레지스터가 있다고 말했다. 레지스터가 그것만 있는 것은 아니다. 바로 Flag Register 가 있다. (물론 이것 말고도 더 있다.) 비교한 결과물은 Flag Register에 저장한다.
저장한 후 코드를 이동해야한다. 가령 스킬을 사용한다고 했으면 스킬 사용의 위치로, 안한다고 했으면 그냥 그대로 등 어떤 위치로 이동을 해 코드를 실행해야 한다. 그 명령어는 JMP [label] 시리즈가 있다.
- JMP : 무조건 라벨 위치로 이동
- JE : JumpEqual, 같으면 라벨 위치로 이동
- JNE : JumpNotEqual, 다르면 라벨 위치로 이동
- JG : JumpGreater, 크면 라벨 위치로 이동
- JGE : JumpGreaterEqual, 크거나 같으면 라벨 위치로 이동
- ...
- ...
이거 말고도 수많은 Jump 시리즈가 있다 코드를 살펴보자.
Label_Equal은 내가 임시로 만든 label이다. 이 이름은 뭐로 하든 상관이 없다. je를 통해 두 숫자를 비교하고 같으면 Label_Equal 위치로 이동해 코드를 쭉 실행한다. 만약 같지 않다면 그대로 코드가 쭉 실행되고 jmp를 통해 무조건 Label_Equal_END 위치로 이동하게 된다. 왜 jmp를 넣었을까?
만약 넣지 않았더라면 rcx를 0으로 설정해줬는데 다시 moc rcx,1을 통해 1로 설정되기 때문이다.
C++에서도 같은 맥락이 동작하기 때문에 알아두자.
분기문 연습문제
어떤 숫자를 입력 받고(1~100) 그 숫자가 짝수면 1, 홀수면 0을 출력하시오.
반복문
반복문은 특정 조건을 만족할 때까지 반복해서 실행하는 것
ex) Hello world를 10 번 출력해야 한다면??
그럼 가장 먼저 떠오르는 방법은 진짜 순수하게 10번을 실행하게 적는것이다. 하지만 이것이 만약 1000번, 10000번 이면 엄청 길고 노가다성이 짙은 코드가 완성이 될것이다.
C++ 에서는 자체적으로 while과 for문을 제공하고 있지만 어셈블리어에는 분기문에서 나온 JMP 키워드를 통해 구현할 수 있다.
물론 loop [lable] 이라는 명령어를 이용해도 된다. 이는 C++을 빌드 한 후 어셈블리어로 확인해 봤을 때 종종 볼 수 있다.
반복문 연습문제
1부터 100까지 더한 값을 출력하시오.
'C++ > 기초' 카테고리의 다른 글
[C++] 데이터 가지고 놀기 - 1 (정수, 불리언, 부동소수점, 문자열) (1) | 2023.11.22 |
---|---|
[Assemble] SASM - 5 (1) | 2023.11.21 |
[Assemble] SASM - 3 (1) | 2023.11.21 |
[Assemble] SASM - 2 (0) | 2023.11.21 |
[Assemble] SASM - 1 (2) | 2023.11.20 |