일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 시스템해킹
- css
- Leviathan
- 프로그래밍
- 시그널
- 시스템
- 리눅스커널
- 취약점
- 워게임
- Pwnable.kr
- 리눅스 커널
- wargame
- 리눅스
- 시스템 프로그래밍
- pwncollege
- 커널
- C++
- 어셈블리어
- radare2
- kernel
- 컴퓨터구조
- write up
- C언어
- 시스템프로그래밍
- 드론
- Bandit
- 리버싱
- 알고리즘
- pwn.college
- px4
- Today
- Total
Computer Security
#14 산술 및 논리 연산 명령어2 본문
증가와 감소
-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
'컴퓨터구조&어셈블리어' 카테고리의 다른 글
#16 어셈블리어-스택과 프로시저 (0) | 2022.05.30 |
---|---|
#15 어셈블리 - 분기명령어 (0) | 2022.05.29 |
#13 산술 및 논리 연산 명령어1 (0) | 2022.05.27 |
#12 컴퓨터의 데이터표현 2 (0) | 2022.05.26 |
#11 컴퓨터의 데이터 표현 (0) | 2022.05.25 |