ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시스템프로그래밍 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를 했는데 음수가 나오는 경우입니다

    반응형

    댓글

Designed by Tistory.