본문 바로가기
reversing/어셈블리어

어셈블리어 명령어 (2)

by 코끼리_땃쥐 2023. 3. 12.
분기 명령어
조건부 코드 (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

'reversing > 어셈블리어' 카테고리의 다른 글

조건부 점프  (0) 2023.04.17
while 문  (0) 2023.03.24
함수의 사용  (0) 2023.03.06
루프  (0) 2023.03.06
어셈블리어 명령어 (1)  (0) 2023.03.04

댓글