Computer Security

#14 산술 및 논리 연산 명령어2 본문

컴퓨터구조&어셈블리어

#14 산술 및 논리 연산 명령어2

쿠리 Kuri 2022. 5. 28. 18:30

증가와 감소

-INC와 DEC 명령어는 레지스터 또는 메모리 피연산자의 값을 1씩 증가/감소 시킨다.

-피연산자의 값을 1씩 변화시키지만, 캐리 플래그에는 영향을 미치지 않는다.

-플래그: AF, OF, PF, SF, ZF

                     INC   reg/mem

                     DEC  reg/mem

 

부호반전

-NEG명령어는 레지스터 또는 메모리 피연산자의 값에 2의 보수를 취한다.

-플래그:AF, CF, OF, PF, SF, ZF

                   NEG  reg/mem

 

불(Boolean)연산

AND 명령어

-플래그: CF(0), OF(0), PF, SF, ZF

-A AND B : 둘 다 1 ->1

           AND reg/mem    , reg/mem/imm

 

OR명령어

-플래그: CF(0), OF(0), PF, SF, ZF

-A OR B: 둘 중 하나가 1->1

          OR  reg/mem,  reg/mem/imm

 

XOR 명령어

-플래그: CF(0), OF(0), PF, SF, ZF

-A XOR B: 둘 다 같으면 0  , 서로 다르면 1

          XOR  reg/mem,  reg/mem/imm

 

 

NOT 명령어

-플래그: 아무 영향 미치지 않음

              NOT  reg/mem

 

 

비트 시프트와 비트 회전

 

논리 시프트와 산술 시프트

-비트 시프트는 레지스터나 메모리 피연산자의 비트열을 특정 방향으로 이동시키는 연산이다.

-시프트 되어 나가고 빈 공간은 대체로 0으로 채워진다.

-x86의 비트 시프트 명령어는 이동되어 나가는 비트 데이터를 캐리 플래그에 저장한다.

ex) 우측으로 한칸씩 옮기는 논리 시프트

                      CF

       10011010 

       01001101  0

       00100110  1

       00010011  0

 

산술 시프트

-우측 시프트 연산 시 왼쪽으로 부터 채워지는 비트가 부호 비트를 반영한다.(논리시프트는 단순히0채움)

ex)      10011010  CF

          11001101  0

          11100110  1 

          11110011  0

 

 

좌측 시프트는 최상위 비트가 왼쪽 CF로 한칸씩 옮겨지는것이다.

 

 

비트 시프트

SHL/SHR 명령어

-논리 시프트

-첫 번째 피연산자는 이동시킬 비트열을, 두 번째 피연산자는 이동할 비트 개수를 지정한다.

-8086/88에서 상수는 1만 가능하고 1보다 크면 CL에 넣어야 한다.

-그 이후의 프로세서에서 상수는 최대 31까지 지정 가능하다.

-플래그: CF, OF, PF, SF, ZF    

(CL = CX의 하위 8바이트)

SHL  reg/mem(옮기는대상), CL/imm(얼마나 옮길지)  (시프트 레프트 로지컬)

SHR reg/mem, CL/imm    

 

SAL/SAR 명령어

-산술 시프트

-플래그:CF, OF, PF, SF, ZF

 

SAL reg/mem, CL/imm

SAR reg/mem, CL/imm

 

 

비트 회전

-비트 회전 명령어는 레지스터 또는 메모리 피연산자의 비트열을 왼쪽이나 오른쪽으로 회전시킨다.

-이동되어 벗어나는 비트는 회전하여 비워진 비트에 채워진다.

-기본적으로 이동되어 벗어나는 비트는 캐리 플래그로 들어가는데, x86은 레지스터나 메모리 피연산자의 비트만을 회전시키는 ROL, ROR 명령어와 피연산자에 캐리 비트를 포함시켜  회전시키는 RCL, RCR 명령어를 제공한다.

 

우측 비트 회전 과정(ROR)       CF

         10011010  

         01001101                  0  (0이 CF에 들어옴과 동시에, 맨앞으로 이동)

         10100110                  1  (1이 CF에 들어옴과 동시에, 맨앞으로 이동)

         01010011                  0  (0이 CF에 들어옴과 동시에, 맨앞으로 이동)

 

 

캐리를 포함한 우측 비트 회전 과정(PCR)    CF
                       10011010                     x  (CF는 x)

                       x1001101                     0 (0이 CF에 들어옴과 동시에 CF에 있던 x가 맨 앞으로이동)

                      0x100110                      1 (1이 CF에 들어옴과 동시에 CF에 있던 0이 맨 앞으로 이동)

                      10x10011                      0 (0이 CF에 들어옴과 동시에 CF에 있던 1이 맨 앞으로 이동)

 

좌측 또한, 이와 같은 방식이다. (ROL, RCL)

 

 

ROL/ROR 명령어

-비트 회전 명령어

-첫 번째 피연산자는 이동시킬 비트열을, 두 번째 피연산자는 이동할 비트 개수를 지정한다.

-비트 시프트 명령어와 마찬가지로 8088/86에서 상수는 1만 가능하고 1보다 클 때는 CL에 넣어야한다.

-이후의 프로세서에서는 상수는 31까지 지정 가능하다.

-플래그: CF, OF

 

ROL   reg/mem, CL/imm

ROR   reg/mem, CL/imm

 

RCL/RCR 명령어

-캐리를 포함한 비트 회전 명령어

-플래긔:CF, OF

 

RCL reg/mem, CL/imm

RCR reg/mem, CL/imm

 

Comments