쾌락없는 책임 (공부)/시스템프로그래밍

시스템프로그래밍 07 - Conditonal Processing(2)

허스크 2021. 5. 30. 21:59
반응형

본 포스트는 강동완 교수님의 '시스템프로그래밍' 강의를 듣고

이해한 것들을 정리한 포스트입니다.

- 강의자료는 올리지 않습니다


 

시스템프로그래밍 06 - Conditional Processing (1)

본 포스트는 강동완 교수님의 '시스템프로그래밍' 강의를 듣고 이해한 것들을 정리한 포스트입니다. - 강의자료는 올리지 않습니다 Boolean / Comparision Instructions  상위 언어에 있는 불리언 연산과

husk321.tistory.com

 이전 포스트에 이어서 나오는 내용들입니다. 위 and 등의 각종 연산들을 통해서 상위 언어에 있는 if, switch 등을 구현하는것이 이번 포스팅의 목표입니다.

 

J로 시작하는 명령어들 (Jcond Instruction)

1. 플래그 레지스터에 따라서

JC / JNC Carry Flag가 1/0이라면 destination으로 점프
JZ / JNZ Zero Flag가
JO / JNO Overflow Flag가
JS / JNS Sign Flag가
JP / JNP Parity Flag가

2. 같은걸 검사하는 명령어

JE 만약 left = right라면 점프
JNE left =/= right라면 점프
JCXZ cx = 0이라면 점프
JECXZ ECX = 0이라면 점프
JRCXZ RCX = 0이라면 점프 (64비트 프로세서)

3. unsigned 수들을 위한 비교

JA left > right 일때 점프
JNBE
JAE left >= right 일때 점프
JNB
JB left < right 일때 점프
JNAE
JBE left <= right  일때 점프
JNA

4. signed 수들을 위한 비교 (최상위 비트가 1이면 음수로 볼 것이다)

JG left > right 일때 점프
JNLE
JGE left >= right 일때 점프
JNL
JL left < right 일때 점프
JNGE
JLE left <= right  일때 점프
JNG

 

 

Conditional Loop

 기존 루프와 같은 기능을 하지만 조건이 추가된 모습입니다

LOOPZ ZF가 세팅되어 있을 때
LOOPE
LOOPNZ ZF가 클리어 되어 있을 때
LOOPNE

위 같은 뜻을 가진 것들은 서로 같은 기계어 코드를 가리키고 있습니다.

 

Conditional Structure

어셈블리어에서 if같은 구조를 만들기 위해서는 위에 나온 연산자들을 사용할 필요가 있습니다.

 

1. if 만들기

; if (a == b)
mov eax, a
cmp eax, b
jne L1

2. and or

- and와 or을 만들때 중요한건 코드를 줄이기 위해서 앞서 있는 operand가 true일때만 2번째 operand를 비교하면 됩니다.

; if(a>b && b>c)
cmp a, b
jbe next
cmp b, c
jbe next

; if(a>b || b>c)
cmp a, b
ja next
cmp b, a
ja next

3. while

;while (a < b) { a++, b-- }
	mov eax, a
while :
	cmp eax, b
    jnl while
    inc eax
    dec b
    jmp while
end:
	mov a, eax

4. Tabel-driven Selection

 주소를 넣은 테이블을 넣어 look-up 테이블을 만듭니다. 오버헤드가 조금 있지만 코드가 줄어들게 되고 비교가 많을때 유리하며 유지보수가 편해진다는 장점이 있습니다. 추가적으로 런타임시 변경이 가능합니다.

 

 

Conditional Control Flow Directives

  MASM에서 제공하는 directive들이 있어서 상위 언어에 있는 conditional structure들을 편하게 사용할 수 있습니다.

; if 예시
.IF condition
	statement
.ENDIF

 

반응형