Programming/Assembly

어셈블리어 - Shift, 논리연산, 분기문

lee308812 2021. 3. 13. 18:53

[ Shift 연산 ]

 

[ 논리 연산 ]

 

자기 자신과 XOR하면 무조건 0이 되는데, 아래 부분은 C에서 return 0의 의미를 갖게 된다.

 

[ 분기문 ]

C에서의 if문을 구현하기 위해 CMP 및 JUMP 계열의 명령어를 사용하게 된다.

 

먼저 if문 안의 조건에 해당하는 비교 연산을 수행하기 위해서는 CMP 명령어를 사용한다.

cmp rax, rbx	; 여기서 아래 나올 조건 (Jump If Greater 등)의 기준은 rax이다.

 

비교를 위해서 cmp a, b 했을 경우 a에서 b를 빼게 되며, 그 결과는 Flags Register에 저장된다.

만약, a와 b가 같으면 a - b = 0이므로 ZF(Zero Flag)가 1이 된다.

 

Intel CPU의 EFLAGS Register

 

CMP rax, rbx의 결과가 서로 같으므로 ZF(Zero Flag) = 1

 

그리고 이 eFlags Register의 값에 따라서 코드의 분기를 수행하기 위해서는 JUMP 계열의 명령어를 사용하게 된다.

JUMP 계열의 명령어는 여러가지가 있으며 만약 CMP로 비교한 2개 값이 같을 경우에 JUMP하려면 JE(Jump Equals)를 사용한다.

JE 레이블

 

JUMP 계열 명령어를 정리하면 아래와 같다.

출처 : https://stackoverflow.com/questions/49772797/conditional-jump-and-flag-bit-in-assembly

 

연습문제) 숫자 N(0<=N<=100)을 입력 받아서 짝수이면 1, 홀수이면 0을 출력하는 프로그램을 작성하라.