CPP_RO_분기문

CJB_ny·2022년 7월 2일
0

C++ 정리

목록 보기
9/95
post-thumbnail

어셈블리에서는 if문이 딱하나의 문법으로 존재 하지 않아서 여러개 조합해서 만들어야한다.

조건 -> 흐름

문법

CMP dst, src (dst가 기준)

이렇게 계산을 하면 결과가 어딘가에는 저장이 되어있다.

곱셈이나 나눗셈의 경우 "지정한" 레지스터에 저장이 됨.

결과물 저장

우리가 이전에 a, b, c, d 이런 범용적인 코딩을 할 때 사용하는 레지스터도 있는데

CMP dst, src를 하였을 때는 Flag Register라는 레지스터에 저장이 된다.

결과를 저장하기위한 특수 목적 레지스터도 존재한다.

(대표적인게 플래그 레지스터이다.)

JUMP

  • 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 이라면 홀수이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글