반응형
논리 명령어
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 |