분기 명령어
조건부 코드 (CC) | 설명 | 플래그 값 |
E / Z | 같은 / 0인 | ZF = 1 |
NE / NZ | 다른 / 0이 아닌 | ZF = 0 |
L / NGE | 작은 (부호있는 연산) | (SF^OF) = 1 (SF ≠ OF) |
G / NLE | 큰 (부호있는 연산) | ((SF^OF) | ZF) = 0 |
GE / NL | 크거나 같은 (부호있는 연산) | (SF^OF) = 0 |
LE / NG | 작거나 같은 (부호있는 연산) | ((SF^) | ZF) = 1 |
B / NAE | 작은 (부호없는 연산) | CF = 1 |
AE / NB | 크거나 같은 (부호없는 연산) | CF = 0 |
P / PE | PF가 1이면 (짝수 ) | PF = 1 |
NP / P0 | PE가 0이면 (홀수) | PF = 0 |
O | OF가 1이면 | OF = 1 |
S | SF가 1이면 | SF = 1 |
ECXZ | ECX가 0이면 | ECX = 0 |
루프 명령어
REP 명령 | 설명 |
rep | ECX가 0이 될 때까지 반복함 |
repe, repz | ECX가 0이거나 ZF가 0일 때까지 반복함 |
repne, repnz | ECX가 0이거나 ZF가 1일 때까지 반복함 |
REP 관련 명령 | 설명 |
insn | DX 레지스터가 지정한 I/O 포트에서 ESI 또는 RSI가 지정한 메모리로 n바이트 데이터를 입력함 |
outsn | ESI 또는 RSI가 지정한 메모리에서 DX레지스터가 지정한 I/O 포트로 n바이트 데이터를 출력함 |
movsn | ESI또는 RSI주소에서 EDI또는 RDI 주소로 n바이트 데이터를 이동함 (memcpy()와 같음) |
lodsn | ESI또는 RSI 주소에서 n바이트 데이터를 EAX 또는 RAX 레지스터로 적재함 |
cmpsn | ESI 또는 RSI 주소의 값과 EDI 또는 RDI 주소의 값을 n바이트 비교한 (memcmp()와 같음) |
LOOP 명령 | 설명 |
loop rel | RCX 또는 ECX 카운터를 감소시키고, 카운터가 0이 아니면 rel 주소로 이동함 |
loope rel | RCX 또는 ECX 카운터를 감소시키고, 카운터가 0이 아니고 ZF가 1이면 rel 주소로 이동함 |
loopne rel | RCX 또는 ECX 카운터를 감소시키고, 카운터가 0이 아니고 ZF가 0이면 rel 주소로 이동함 |
다형성 코드
컴파일을 하게 되면 코드 최적화 과정을 거치면서 적절한 어셈블리어로 변환하게 된다. 이과정에서 큰 이동(far jump)과 작은 이동(near jump)에 따라 어셈블리어의 주소 오퍼랜드 크기가 달라진다. 큰 이동은 목적지 주소를 그대로 사용하지만, 작은 이동은 목적지 주소와 현 위치의 차이 값만 표현하여 명령어 코드 길이를 줄인다.
어셈블리어에서 몇 가지 명령어 코드는 같은 의미를 갖는다. 일반적으로 같은 의미를 같는 여러가지 코드를 다형성(polymorphism) 코드라 한다.
기계어 | 어셈블리어 | 의미 |
B8 00000000 | mov ea, 0 | eax에 0을 저장함 |
31C0 | xor eax, eax | |
83 E0 00 | and eax, 0 | |
6A 00 58 |
push 0 pop eax |
|
83F8 00 | cmp eax, 0 | eax가 0인지 비교함 |
85C0 | test eax, eax |
댓글