전공/시스템 프로그래밍

[시스템 프로그래밍 8-2]Conditional Jumps (조건부 점프 명령)

뜨거운 개발자 2023. 4. 28. 11:19

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

728x90