mov eax,0 //mov 명령어는 ZR 플래그를 조작하는 명령어가 아님
cmp eax,0 //두개의 값이 같으면 Z(ZR) 에 1을 세팅함
je main //ZR값이 1 이면 점프 , jz 도 ZR 이 1 이면 점프, jz==je 이 둘은 같은 동작을 한다
jz 는 eax 값이 증가 했다가 감소 해서 0 이 되면 Z 가 1이 된다는 관점
je 는 cmp 로 두개를 비교하여 같으면 Z 가 1 이 된다는 관점
jne = jump not equal 로 Z가 0 일때 점프 한다
jze 도 Z 가 0 일 때 점프
cmp A, B
JA : 앞에 것이 크면 점프 (Above)
JB : 앞에 것이 작으면 점프(Below)
C : Carry 비트(더하기, 자리 올림)가 1이 됨 1111 + 1 또는 자리내림(빼기(1-2=-1)) 일때 C 가 1이 됨
cmp 연산에서 cmp a,b 는 a-b 연산을 하는대 이때 C 비트가 변경 된다
[부호가 없는 데이터 비교, 제일 앞의 비트또한 숫자로 처리한다]
JA 의 경우 C가 0이고 ZR 이 0 일 때 점프 한다
cmp 는 A-B 연산을 하는데 두 값이 같다면 A-B=0 , A>B 의 경우 결과는 양수이고 A 보다
결과가 작음으로 자리 올림은 발생 하지 않으며 ZR 은 두 값이 같지 않음으로 0 이 된다
JB 의 경우 C 가 1일때 점프 한다
ZR 은 0 이든 1이든 상관 없는데 그 이유는 A-B 결과가 음수가 되면서 이로 인해 자리내림으로 C 가 1이 되어서
이것으로 점프를 할지 말지 구분하면 됨
[부호가 없는 데이터 비교, 제일 앞의 비트를 부호로 처리한다]
JG
JL
JA, JG 가 같은 맥락인데 어떤 명령어를 사용 하느냐에 따라서 비트는 같지만 비트를 해석하는 방식이 달라진다
JNA == JBE
jc : carry 플래그 값만 보고도 점프가 가능한데(CY)
jo : overflow bit 가 1 일때 (OV)
js : sign 비트가 1 일때 (PL)
pl : 연산 값이 음수인경우 1 , 양수면 0
ov : char s=127
s+=1 == -128 이 되는데 이때 부호 비트까지 연산이 되어버리는 경우 ov 에 1이 세팅 됨
(c에서는 AC 가 보조 캐리비트)
cmp edx,eax 했을 때 cmp 한 연산 결과의 하위 4bit 에 대해 올림이 발생하면 그때 1이 됨
[BCD : 2진수 4자리를 묶어 10진수 한자리로 표현 하는 법]
16진수 표현 시 10=a~ 15=f 로 표현 되는데 이렇게 표현 하는 방식을 말함
그리하여 4bit까지 체크 하기 위한 비트가 AC 보조 캐리 비트다, 즉 15가 넘어 가게 될 경우 AC=1 이 된다(f에 대한 자리 올림)
ex) mov eax , 15
inc eax
cmp edx,eax 했을 때 cmp 한 연산 결과의 하위 8bit 에 대해 체크)
'프로그래밍(Programming) > 어셈블리어(asm)' 카테고리의 다른 글
어셈블리어단에서의 스텍프레임과 함수 호출 call, ret, ebp, esp, eip (0) | 2017.02.26 |
---|---|
loop 명령어 조건 정리 ECX (0) | 2017.02.25 |
상태 레지스터 플래그 (0) | 2017.02.24 |
_asm {점프 할때의 플래그들 정리} (0) | 2017.02.21 |
[어셈블리어 기초] CMP JMP CALL RET NOP (1) | 2013.02.06 |