본문 바로가기

어셈블리 논리 명령어

@enable79972025. 6. 24. 12:49
반응형

논리 명령어

AND 명령어 (and)
AND [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값을 AND연산한다. 대응되는 비트가 두 개 전부 1일때만 결과가 1이고, 아니면 0이다. 
AND EAX, 13h
EAX가 0x10h 라고 가정하면 EAX의 2진수는 1010이고, 0x13h는 1101이다. 
두개를 AND 연산하면 1001으로 EAX에는 1001이 대입된다. 

 

OR 명령어 (or)
OR [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값을 OR연산한다. 대응되는 비트가 두 개 중 하나만 1일이거나 두 개 전부 1이면 결과가 1이고,
아니면 두 개 전부 0일때만 결과가 0이다. 
OR EAX, 13h
EAX가 0x10h 라고 가정하면 EAX의 2진수는 1010이고, 0x13h는 1101이다. 
두개를 OR 연산하면 1111 으로 EAX에는 1111이 대입된다. 

 

XOR 명령어 (exclusive or)
XOR [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값을 XOR연산한다. 대응되는 비트가 두 개 중 하나만 1일때만 결과가 1이고, 아니면 전부 결과가 0이다. 
XOR EAX, 13h
EAX가 0x10h 라고 가정하면 EAX의 2진수는 1010이고, 0x13h는 1101이다. 
두개를 XOR 연산하면 0110으로 EAX에는 0110이 대입된다. 

 

NOT 명령어 (invert)
NOT [피연산자1] 
[피연산자1]의 값을 NOT연산한다. 
[피연산자1]에 대해 1의 보수를 구한다. 
NOT EAX
EAX가 0x10h 라고 가정하면 EAX의 2진수는 1010이다. 
EAX를 NOT 연산하면 0101이 EAX에 대입된다.

 

TEST 명령어 (and function to flags, no result)
TEST [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값을 비교한다. 
CMP 명령어와 다르게 값을 빼는 과정을 저장하지 않고 값만 비교한다.
TEST EAX, 13h
EAX가 0x10h 라고 가정하면 EAX의 2진수는 1010이고, 0x13h는 1101이다. 
두개를 TEST 연산하면 두 개의 값이 다르므로 ZF는 1이된다. 

;예시 2
TEST EAX, 10h
라고 하면 EAX와 0x10h를 비트단위 AND 연산한다. EAX와 10h의 값이 같기 때문에  ZF는 0이 된다.

 

SHL 명령어 (shift left)
SHL [피연산자1] [피연산자2] 
[피연산자1]을 [피연산자2]의 값만큼 왼쪽으로 자리옮김(Shift)한다. 
밀려나서 범위를 벗어나는 비트는 캐리 플래그(CF)에 저장되고, 새로 생기는 빈자리는 특정 값(0 또는 부호 비트)으로 채워진다.
SHL AL, 1
mov al, 0b10110010  ; AL = 10110010b

shl al, 1           ; AL을 왼쪽으로 1칸 시프트
; 결과
; AL = 01100100b
; CF = 1 (원래 최상위 비트)

 

SAL 명령어 (shift arithmetic left)
SAL [피연산자1] [피연산자2] 
[피연산자1]을 [피연산자2]의 값만큼 왼쪽으로 자리옮김(Shift)한다. 
밀려나서 범위를 벗어나는 비트는 캐리 플래그(CF)에 저장되고, 새로 생기는 빈자리는 특정 값(0 또는 부호 비트)으로 채워진다.
SAL AL, 3
mov bl, 5           ; AL = 5 (00000101b)
sal Al, 3           ; AL을 왼쪽으로 3칸 시프트 (5 * 2^3 = 40)
; 결과
; AL = 40 (00101000b)
; CF = 0

 

SHR 명령어 (shift right)
SHR [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값만큼 오른쪽으로 자리옮김(Shift)한다. 
밀려나서 범위를 벗어나는 비트는 캐리 플래그(CF)에 저장된다.
비트를 오른쪽으로 이동시키고, 새로 생기는 왼쪽 빈자리를 항상 0으로 채우며 부호 없는(unsigned) 정수에 사용된다.
SHR AL, 1
mov al, 0b10110010  ; AL = 10110010b

shr al, 1           ; AL을 오른쪽으로 1칸 시프트
; 결과
; AL = 01011001b
; CF = 0 (원래 최하위 비트)

 

SAR 명령어 (shift arithmetic right)
SAR [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값만큼 오른쪽으로 자리옮김(Shift)한다. 
밀려나서 범위를 벗어나는 비트는 캐리 플래그(CF)에 저장된다.
비트를 오른쪽으로 이동시키고, 새로 생기는 왼쪽 빈자리를 원래의 부호 비트(최상위 비트) 값으로 채운다.
부호 있는(signed) 정수에 사용된다.
SAR AL, 1
; AL = 10110010b (부호 있는 8비트 정수로 -78)
mov al, 0b10110010

sar al, 1           ; AL을 산술 오른쪽으로 1칸 시프트 (-78 / 2 = -39)
; 결과
; AL = 11011001b (부호 비트 '1'이 유지됨, 십진수로 -39)
; CF = 0 (원래 최하위 비트)

 

ROL 명령어 (rotate left)
ROL [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값만큼 왼쪽으로 비트를 회전(rotate) 이동한다. 
ROL AL, 1
모든 비트가 왼쪽으로 한 칸씩 이동한다.
최상위 비트(MSB)는 캐리 플래그(CF)와 최하위 비트(LSB) 자리로 동시에 복사된다.

mov al, 0b10110010
rol al, 1
; 결과
; AL = 01100101b (원래 MSB '1'이 LSB로 이동)
; CF = 1 (원래 MSB)

 

ROR 명령어 (rotate right)
ROR [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값만큼 오른쪽으로 비트를 회전(rotate) 이동한다. 
ROR AL, 1
모든 비트가 오른쪽으로 한 칸씩 이동한다.
최하위 비트(LSB)는 캐리 플래그(CF)와 최상위 비트(MSB) 자리로 동시에 복사된다.

mov al, 0b10110010
ror al, 1
; 결과
; AL = 01011001b (원래 LSB '0'이 MSB로 이동)
; CF = 0 (원래 LSB)

 

RCL 명령어 (rotate through carry left)
RCL [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값에 자리올림(carry, CF)를 포함하여 왼쪽으로 비트를 회전(rotate) 이동한다. 
RCL AL, 1
모든 비트가 왼쪽으로 한 칸씩 이동한다.
최상위 비트(MSB)는 캐리 플래그(CF)에 들어간다.
원래의 캐리 플래그 값이 최하위 비트(LSB) 자리로 들어온다.

clc                 ; CF를 0으로 초기화
mov al, 0b10110010

rcl al, 1
; 결과 CF=0 이었으므로
; AL = 01100100b (원래 CF '0'이 LSB로 들어옴)
; CF = 1 (원래 MSB)

 

RCR 명령어 (rotate through carry right)
RCR [피연산자1] [피연산자2] 
[피연산자1]에 [피연산자2]의 값에 자리올림(carry, CF)를 포함하여 오른쪽으로 비트를 회전(rotate) 이동한다. 
RCR AL, 1
모든 비트가 오른쪽으로 한 칸씩 이동한다.
최하위 비트(LSB)는 캐리 플래그(CF)에 들어간다.
원래의 캐리 플래그 값이 최상위 비트(MSB) 자리로 들어온다.

stc                 ; CF를 1로 설정
mov al, 0b10110010

rcr al, 1
; 결과 CF=1 이었으므로
; AL = 11011001b (원래 CF '1'이 MSB로 들어옴)
; CF = 0 (원래 LSB)

 

반응형

'시스템 > 리버싱' 카테고리의 다른 글

어셈블리 전송 명령어  (0) 2025.06.23
어셈블리 산술 연산 명령어  (0) 2025.06.22
레지스터  (0) 2025.06.09
dreamhack Quiz:x86 Assembly 2  (0) 2022.08.25
목차