어셈블리 분기문( compare<cmp>, jump<jmp> )에 대해서 정리한다.
분기문: if, switch
1. cmp: compare
- 레지스터나 메모리의 값을 변경하지 않는다.
- 플래그 레지스터에만 영향을 준다.
- SF,CF, ZF
- cmp left, right
( 문서를 통해서 참조한 EFLAGS Register의 형태이다... )
! 두 피연산자의 비교
left - right
( SUB 명령어와 같이 빼기 연산을 하고 그 결과에 따라서 플래그에 영향을 미치게 된다.. )
1). 결과가 0인 경우: 같은 경우
- ZF: 1, SF:0
2). 결과가 음수인 경우: right가 더 큰 경우
- ZF: 0, SF: 1
3). 결과가 양수인 경우: left가 더 큰 경우
- ZF:0, SF: 0
( cmp 명령을 이용해서 두 피연산자를 비교해도 해당 메모리나 플래그에는 영향을 미치지 않고
플래그 레지스터에만 영향을 주게 된다... )
( ZF 플래그는 0일 경우 켜지는 플래그이고 SF 같은 경우에는 부호가 있는 경우 켜지는 플래그이다.. )
2. 분기문
1). 무조건 분기문: jump
- jmp <address & offset>
2). 조건 분기문
- 플래그 레지스터를 보고 분기를 결정한다.
ex).
if ( 10 < 20) {
printf("less\n");
}
* 문서를 참조해보면 어셈블리 opcode로 표현될때는 예를 들어서 작거나같지않다와 크다의 op 코드는 서로 같게 표현이 된다.
( C언어 코드를 어셈블리로 변환해서 분석할때 이러한 표현에 주의해서 해석해야 한다 )
[실습]
* 어셈블리에는 논리연산자가 존재하지 않는다.
if (eax == 0 && ebx >= 1 && ecx < 2)
edx = 1
else
edx = 0
extern printf
section .data
prompt_int db '%d', 10, 00
section .text
global main
main:
cmp eax, 0
jne else
cmp ebx, 1
jl else
cmp ecx, 2
jge else
if:
mov edx, 1
jmp end
else:
mov edx, 0
end:
if (eax == 0 || ebx >= 1 || ecx < 2)
edx = 1
else
edx = 0
extern printf
section .data
prompt_int db '%d', 10, 00
section .text
global main
main:
cmp eax, 0
je if
cmp ebx, 1
jge if
cmp ecx, 2
jnl else
if:
mov edx, 1
jmp end
else:
mov edx, 0
end:
if ((eax == 0 && ebx >= 1) || ecx < 2)
edx = 1
else
edx = 0
extern printf
section .data
prompt_int db '%d', 10, 00
section .text
global main
main:
cmp eax, 0
jne jmp2
cmp ebx, 1
jge if
jmp2:
cmp ecx, 2
jnl else
if:
mov edx, 1
jmp end
else:
mov edx, 0
end:
'프로그래밍 > SYSTEM HACKING' 카테고리의 다른 글
[SYSTEM HACKING] 실행중인 프로세스의 전체 메모리 구조 / 스택에서 사용되는 레지스터 / 어셈블리에서 함수 (0) | 2017.10.26 |
---|---|
[SYSTEM HACKING] 어셈블리 반복문( jmp ) (0) | 2017.10.24 |
[SYSTEM HACKING] 어셈블리 명령어( shift 연산<shl, shr, sal, sar>, 논리연산<and, or, not>, 형변환<movzx, movsx>) (0) | 2017.10.21 |
[SYSTEM HACKING] 어셈블리 사칙연산 명령어( add, sub, mul, imul, div, idiv ) / 계산기 만들기 실습 (0) | 2017.10.20 |
[SYSTEM HACKING] 명령어( mov, lea ) (0) | 2017.10.18 |
댓글