어셈블리에서는 if문이 딱하나의 문법으로 존재 하지 않아서 여러개 조합해서 만들어야한다.
조건 -> 흐름
문법
CMP dst, src (dst가 기준)
이렇게 계산을 하면 결과가 어딘가에는 저장이 되어있다.
곱셈이나 나눗셈의 경우 "지정한" 레지스터에 저장이 됨.
우리가 이전에 a, b, c, d 이런 범용적인 코딩을 할 때 사용하는 레지스터도 있는데
CMP dst, src를 하였을 때는 Flag Register라는 레지스터에 저장이 된다.
결과를 저장하기위한 특수 목적 레지스터도 존재한다.
(대표적인게 플래그 레지스터이다.)
JMP [ Label ] 시리즈
JMP : 무조건 JUMP
JE : JumpEquals 같으면 점프
JNE : JumpNotEquals 다르면 jump
JG : JumpGreater 크면 jump
JGE : JumpGreaterEquals 크거나 같은면 jump
JL
JLE
이런 여러 시리즈들이 있다.
CMP한 결과물들을 체크를 해가지고
=> 결과물이 Flag Register에 들어가 있는데
점프 시리지들을 체크를해서 분기문 처리를한다.
두 숫자가 같으면 1, 다르면 0을 출력하는 프로그램
코드가 순차적으로 아래로 쭉 냐려가면서 실행된다.
그래서 분기문 짤 때 jump 시리즈를 좀더 추가? 를 해야한다.
지금 cmp한 결과가 같다면 LABEL_EQUAL로 가는 것이다.
같을 때만 LABEL_EQUAL이 실행되기를 원하는데
다르다면 0으로 셋팅한다음에 EQUAL부분은 스킵을 하기를 원하는 것이다.
이렇게 추가를 해주도록 하자.
잘 나온다.
같을 경우 값이 이렇게 들어가는데 PF ZF IF ?
=> 의미가 궁금하다 => 구글링 ㄱㄱ.
나중에 C++로 만들면 훨씬 더 간단한데
지금 분기문 원리자체가
이런식이라는 것을 숙지를 해야한다.
어떤 숫자 1~100, 짝수면 1, 홀수면 0 출력
https://velog.io/@starkshn/CPPRO%EC%82%AC%EC%B9%99%EC%97%B0%EC%82%B0#%EB%82%98%EB%88%84%EA%B8%B0
div bl => ax / bl (al = 몫, ah나머지)
내가 짠 코드
강의 코드
je 이 아닐 경우 홀수이니까
rcx == 1이라면 짝수
rcx == 0 이라면 홀수이다.