자기개발/SIMD

SIMD - (feat C++, Assembly 조건 제어문)

pi92 2021. 10. 7. 16:28

프로그램을 제어하기 위해서 if else 문이나 for loop 문과 같은 조건 제어문이 필요하다.

c, c++ 과 많이 다르기는 하지만 프로그램의 순서와 동작을 결정하는 부분이므로 매우 중요하다.

 

비교 명령어(cmp)

--------------------------------------

cmp reg, reg

cmp reg, mem

cmp mem, reg

--------------------------------------

__asm

{

 mov eax, 5

 cmp eax, 8

}

--------------------------------------

 

비교 구문이다. cmp 명령 수행 후 비트 플래그에 두 값이 같은지, 더 큰지 작은지가 남아있다.

위 구문을 수행하면 내부적으로 eax가 더 작다고 저장되어 있다.

Zeroflag = 0, Carryflag =1의 값을 가진다.

 

Jump 명령어

앞서 수행한 cmp 연산 혹은 inc, dec와 같은 연산 후에 저장된 flag 값을 보고 어디로 제어할지 결정한다.

--------------------------------------

//특정 플래그 값에 따르는 점프
Jp	또는 Jmp(jump)		무조건 점프(PF = 1)
Jnp (jump not parity)	(PF = 0)
Jz	(jump zero)		값이 0이면 점프(ZF = 1)
Jnz	(jump not zero)		값이 0이 아니면 점프(ZF = 0)

//동등 비교에 따르는 점프(cmp)
Je	(jump equal)		두 값이 같으면 점프 (left = right)
Jne	(jump not equal)	두 값이 다르면 점프(left ≠ right)

//부호없는 비교에 따르는 점프
Ja	(jump above)		값이 더 크면 점프(left > right)
Jae	(jump above equal)	값이 크거나 같으면 점프(left ≥ right)
Jb	(jump below)		값이 작으면 점프(left < right)
Jbe	(jump below equal)	값이 작거나 같으면 점프(left ≤ right)

//부호있는 비교에 따르는 점프
Jg	(jump greater)		값이 더 크면 점프(left > right)
Jge	(jump greater equal)	값이 크거나 같으면 점프(left ≥ right)
Jl	(jump less)		값이 작으면 점프(left < right)
Jle	(jump less equal)	값이 작거나 같으면 점프(left ≤ right)

cmp와 jp 명령어

int main(int argc, char* argv[])
{
	int nValue = 0;

	__asm
	{
		pushad
		mov eax, 0		//eax = 0;
		SIMDLOOP:		//반복 수행할 라벨 goto와 같다
					//실해할 연산 입력
		inc eax			//eax++
			cmp eax, 1000	//if(eax != 0)
			jne SIMDLOOP	//goto LOOP
			//jump not equal LOOP
			mov nValue, eax	//nValue = eax;
			popad
	}

	cout << "Result : " << nValue << endl;


	return 0;
}