-
시스템프로그래밍 06 - Conditional Processing (1)쾌락없는 책임 (공부)/시스템프로그래밍 2021. 5. 30. 21:01반응형
본 포스트는 강동완 교수님의 '시스템프로그래밍' 강의를 듣고
이해한 것들을 정리한 포스트입니다.
- 강의자료는 올리지 않습니다
Boolean / Comparision Instructions
상위 언어에 있는 불리언 연산과 비교 연산을 하는 일입니다. 어셈블리어는 기계어 기반이다 보니 2진수의 bit 연산을 하게 되며 각종 연산들이 플래그 레지스터에 영향을 줘 이후 나오는 비교나 루프 등에 유용하게 사용됩니다.
<AND>
AND destination, source
역시나 destination에는 상수가 올 수 없으며 그 외에는 reg, mem, imm 등이 올 수 있습니다. 단 mem, mem 연산은 제공하지 않으며 두 operand간 크기가 같아야 합니다.
연산 결과를 통해서 destination와 source와 and를 한 값이 destination에 저장되게 됩니다.
<OR>
OR destination, source
or연산을 하는 것으로 위 and와 같은 과정을 거치게 됩니다.
* 위 2가지의 연산을 통해서 Overflow, Carry Flag들은 0으로 클리어되게 되는데 나머지 플래그들은 결과에 따라 세팅되게 됩니다.
<XOR>
AND, OR과 동일한 operand 조건을 가지고 있으며 플래그들도 동일하게 영향을 받게 됩니다. XOR의 경우 토글로 사용하거나 간단한 암호화를 위해 사용되며 Parity bit를 위해서 사용됩니다.
* Parity bit : x86에서는 des의 하위 8비트만 체크하며 0과 xor을 해 값은 그대로 유지하지만 parity플래그에는 영향이 가기 때문에 이를 통해서 오류 검출이 가능합니다.
<NOT>
결과를 1의 보수로 만들어주며 operand는 1개만 사용, 플래그에는 영향을 주지 않습니다.
+ NEG : 2의 보수로 만들어줍니다.
<TEST>
AND와 같은 일을 하지만 destination의 값이 변경되지 않으면서 플래그 레지스터에 영향을 주게 됩니다. 이 연산의 경우 각 비트의 상태를 알아볼 때 사용하게 됩니다.
<CMP>
두 operand를 비교하게 됩니다. 이 연산은 SUB 연산을 통해 이루어지지만 operand들의 값은 유지됩니다. 바뀐 플래그를 통해서 비교 결과를 가져오게 되는데 그 기준은 아래와 같습니다.
- 두 operand를 unsigned로 한 경우
결과 Zero Flag Carry Flag destinatino < source 0 1 destinatino > source 0 0 destinatino = source 1 0 - 두 operand를 signed로 한 경우
결과 Flag destinatino < source SF =/= OF destinatino > source SF = OF destinatino = source ZF = 1 ex)
mov ax, 5 cmp ax, 10 ; zf = 0, cf = 1, sf = 1, of = 0
위 연산들을 이용해서 플래그 레지스터들을 세팅하기
위 연산들을 통해서 각종 플래그 레지스터들을 쉽게 세팅할 수 있습니다.
ZF 클리어 0과 AND / TEST 세팅 1과 OR SF 클리어 최상위 비트가 1인 수와 OR 세팅 최상위 비트가 0인 수와 AND / TEST CF 클리어 stc (명령어) 세팅 clc (명령어) OF 클리어 두 양수를 더할시 음수가 되는 연산 세팅 위에 있는 OR, AND 연산을 하면 클리어 * CF, OF 차이
Carry Flag의 경우 n bit + n bit 연산을 했을시 자리수가 over나 n+1 비트의 값이 나오는 경우 세팅되게 됩니다.
Overflow Flag의 경우 연산 결과로 인해서 표현 가능한 수의 범위가 벗어날 경우 세팅되게 됩니다. 즉 127 + 4를 했는데 음수가 나오는 경우입니다
반응형'쾌락없는 책임 (공부) > 시스템프로그래밍' 카테고리의 다른 글
시스템프로그래밍 08 - 어셈블리어에서 비트 연산 (0) 2021.06.01 시스템프로그래밍 07 - Conditonal Processing(2) (0) 2021.05.30 시스템프로그래밍 05 - 조금 더 상위 연산들 (0) 2021.05.30 시스템프로그래밍 04 - 어셈블리어 조금 더 맛뵈기02 (2) 2021.04.19 시스템프로그래밍 03 - 어셈블리어 조금 더 맛뵈기01 (0) 2021.04.19