1. Conditional Structures
x86 명령어 집합에는 명시적인 상위 수준 논리 구조가 없지만 비교와 점프의 조합을 사용하여 구현할 수 있습니다
두 단계
1. CMP, AND 또는 SUB와 같은 연산은 CPU 상태 플래그를 수정합니다.
2. 조건부 점프 명령은 플래그를 테스트하고 새 주소로 브랜치를 생성합니다.
예제 1(jz)
jz (zero flag가 0인 경우에 해당 레이블로 점프)
cmp eax, 0
jz L1 ; jump if ZF = 1
.
.
L1:
예제 2 (jnz)
AND 명령은 DL 레지스터에서 비트 단위 AND를 수행하여 0 플래그에 영향을 줍니다
0 플래그가 비어 있으면 JNZ(0이 아닌 경우 점프) 명령이 점프합니다.
and dl , 10110000b
jnz L2 ; jum if ZF = 0
.
.
.
L2 :
Jcond
- 조건부 점프 명령은 조건이 참일 때 대상 레이블로 분기한다.
- 그렇지 않으면 플래그 조건이 거짓이면 조건부 점프 바로 다음에 명령이 실행됩니다.
- cond는 하나 이상의 플래그 상태를 식별하는 플래그 조건을 나타냅니다.
- CPU 상태 플래그는 산술, 비교 및 부울 명령으로 가장 일반적으로 설정됩니다.
- 조건부 점프 지침은 플래그 상태를 평가하여 점프를 해야 하는지 여부를 결정합니다.
예제 3 je
- 이건 jz와 같다.
- cmp 명령은 같다면 zeroflag가 설정된다.
cmp eax,5
je L1 ;jump if equal
예제 4 jl
- AX가 6보다 작기 때문에 JL 명령은 L1 레이블로 점프합니다
mov ax, 5
cmp ax, 6
jl L1 ; jump if less
예제 5 jg
- AX가 4보다 크므로 점프가 수행됩니다
mov ax, 5
cmp ax,4
jg L1 ; jump if greater
조건부 점프 명령의 유형
조건부 점프 명령은 부호 있는 정수와 부호 없는 정수를 비교하고 개별 CPU 플래그의 값에 따 라 작업을 수행할 수 있습니다.
조건부 점프 지침은 네 가지 그룹으로 나눌 수 있습니다:
- 특정 플래그 값에 따라 점프 Jumps based on specific flag values
- 피연산자 간의 동일성 또는 (E)CX 값에 따라 점프합니다. Jumps based on equality between operands or the value of (E)CX
- 부호 없는 피연산자의 비교를 기반으로 점프합니다. Jumps based on comparisons of unsigned operands
- 부호화된 피연산자의 비교에 기반한 점프 Jumps based on comparisons of signed operands
1. 특정 플랫값 기반 점프
2. Equality Comparisons
- 반드시 cmp 연산이 먼저 나올 필요는 없다.
- 어떤 경우는 두 피연산자를 비교하고 어떤 경우에는 (E) CX 값에 따라서 점프를 수행한다.
- JE 명령은 JZ 명령과 동일, JNE는 JNZ와 동일하다!!
Equality 비교 예시
3. Unsigned Comparisons
Comparisons(비교)와 연관되어있다. (3번과 4번은)
여기서 이건 unsinged와 연관있다. 여기는 zero flag와 carry flag를 가지고 판단한다.
각 명령에 대해서 무엇을 비교하는지 보기!
- JA : jump above 의 반대는 JBE가 된다. (크다의 반대는 같거나 작다.!!!)
- JA와 JNBE는 같다!!!
- 잘 보면 쌍으로 같은 것들이 매칭되어있다.!!
- 크다 작다를 가지고 하는것!!!
4. Signed Comparisons
sign flag와 overflow 를 비교해서 하는것 !! 각 명령에 대해서 무엇을 비교하는지 보기!
강조!! 항상 CMP연산이 와야하는 것? 아니다!!
예시
중요 ! 어셈블리에서는 타입이 없고 사이즈만 존재하기 떄문에 우리가 잘 생각해야 한다!!
Conditional Jump Applications (예시)
1. 상태비트 테스트
- 테스트 중인 비트의 값은 변경하고 싶지 않지만 CPU 상태 플래그의 값은 수정하고 싶은 경우가 종종 있습니 다.
- 조건부 점프 명령은 종종 이러한 상태 플래그를 사용하여 코드 레이블로 제어권을 이전할지 여부를 결정 합니다
2. 두 정수 중 큰값
3. 세 정수중 가장 작은 정수
4. 키를 누를 때까지 반복
예시 응용 프로그램 배열의 S등식 S자 곡선
다음 프로그램은 16비트 정수 배열에서 첫 번째 0이 아닌 값을 찾습니다
- 찾으면 값을 표시합니다
- 그렇지 않으면 0이 아닌 값을 찾을 수 없다는 메시지가 표시됩니다.
예시 – Application: Simple String Encryption
이거는 교수님 왈 별로 중요하지 않다고 생각하심..! XOR 할 때 암호화 알고리즘에서 사용할 수 있다는 엄청난 기술이라고 저자가 생각했다는데.. 교수님은.. 이건 좀.. 음… 굳이 이런말을 넣었을까.. 생각하심
Uploaded by N2T
'CSE > system programing' 카테고리의 다른 글
9-2강 Conditional Control Flow Directives (조건부 제어 흐름 지시어) (0) | 2023.05.15 |
---|---|
9 -1 강 Conditional Loop Instructions (LOOPZ,LOOPE) Conditional structure(조건부 구조 예시코드!) (0) | 2023.05.15 |
[시스템 프로그래밍 8-1]Boolean and Comparison Instructions (어셈블리어에서 불린 연산자) (0) | 2023.04.28 |
[시스템 프로그래밍 7-3] Irvine32 Library 정리 (0) | 2023.04.28 |
[시스템 프로그래밍 7-2] 프로시저(Procedures)와 USER OPERATOR (0) | 2023.04.28 |