자기개발/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;
}