반응형
directive
변수 매크로 프로시저 등을 정의하기 위한 영역
.data 변수를 포함하는 프로그램 영역
.code 실행가능한 명령어를 포함하는 영역
.stack 스택의 크기를 설정, 실행 스택을 가진 프로그램 영역
label
명령어 또는 데이터의 위치를 표시하는 식별자
데이터 레이블 : 코드에서 변수를 참조할수 있게 해주는 변수 위치 식별자
count DWORD 1000
array DWORD 1024,2048
count와 array의 변수가 데이터 레이블에 해당
코드 레이블 : 분기나 루프 명령어의 목적지로 사용되는 레이블, 콜론으로 끝나야 한다
L1:
mov ax,bx
jmp L1
L1이 코드 레이블에 해당
Register
General Purpose Register
EAX (Extended Accumulator Register)
입출력과 대부분의 산술 연산에서 사용
곱셈, 나눗셈, 변환 명령을 사용
win32 API 함수들은 모두 리턴값을 EAX에 저장후 리턴
EBX (Extended Base Address Register)
DS 세그먼트의 포인터를 주로 저장
ESI나 EDI와 결합하여 인덱스에 사용
BX는 메모리 주소 지정을 확장하기 위한
인덱스로 사용 가능한 범용 레지스터
ECX (Extended Counter Register)
루프가 반복되는 회수를 제어하는 값
왼쪽이나 오른쪽으로 이동되는 비트 수 등을 포함할 수 있다
EDX (Extended Data Register)
입출력 연산에 사용
큰 수의 곱셈과 나눗셈 연산에서 EAX와 함께 사용
Index Register
EDI (Extended Destination Register)
메모리에서 메모리로 값을 복사할 때 주로 사용되며
목적지 메모리 주소를 저장할 때 사용
ESI (Extended Source Register)
메모리에서 메모리로 값을 복사할 때 사용되며
출발지 메모리 주소를 저장할 때 사용
Pointer Register
ESP (Extended Stack Pointer Register)
현재 스택영역에서 가장 하위 주소를 저장
스택이 확장되면 스택포인터는 높은주소에서 낮은주소로 값을 변경
실제 메모리상 주소 참조시에는 SS 레지스터와 함께 사용한다
EBP (Extended Base Pointer Register)
스택 영역에서 현재 호출하여 사용하는 함수의 시작주소 값을 저장
함수로 전달되는 지역변수를 참조할 때 기준이 되며
ESP (Extended Stack Pointer Register)
레지스터와 함께 Stack Frame을 형성하기도 한다
함수가 끝나면 ESP에 EBP 값을 넘겨준다
실제 메모리상 주소 참조시에는 SS 레지스터와 함께 사용한다
EIP (Extended Instruction Pointer Register)
다음에 실행될 명령의 offset 주소를 가리킨다
현재 실행중인 코드 세그먼트에 속한 현재 명령을 가리키며
실제 메모리상 주소를 참조할때 CS 레지스터와 함께 사용
Segment Register
CS (Code Segment Register)
실행될 기계 명령을 포함
Code Segment의 시작주소를 가리킨다
DS (Data Segment Register)
프로그램에 정의된 데이터, 상수, 작업 영역을 포함
Data Segment의 시작주소를 가리킨다
프로그램은 참조하려는 데이터의 offset을
DS 레지스터에 저장된 주소값에 더해 DS안의 데이터를 참조
SS (Stack Segement Register)
프로그램을 실행할 때, 과정에서 필요한 데이터,
연산결과 등을 임시로 저장하거나 삭제하는 용도
Stack Segment의 시작주소를 가리킨다
ES
추가로 사용된 Data Segment의 주소를 가리킨다
메모리 주소 지정을 다루는 string 연산에 사용, EDI와 함께 사용
FS
GS
State Flags Register
SF (Sign Flags)
연산결과가 음수일 경우 1로 set
CF (Carry Flags)
부호없는 정수의 연산 결과가 자리수 초과시 1로 set
OF (Overflow Flags)
부호있는 정수의 연산결과가 자리수 초과시 1로 set
PF (Parity Flags)
연산결과시 1이 짝수개일 경우 1로 set
AF (Auximillary Carry Flags)
10진수 연산시 초과,빌림이 필요할 경우 1로 set
ZF (Zero Flags)
연산결과가 0이면 1로 set
Control Flags Register
TF (Trap Flags)
프로세서 처리시 사용, 0은 default, 1은 명령 실행후 특정 프로시저 호출
IF (Interrupt Flags)
인터럽트시 사용, 0이면 외부인터럽트 무시,1은 외부인터럽트 허용
DF (Direction Flags)
문자열 처리시 사용, 0이면 증가되는 방향으로 처리, 1이면 감소되는 방향으로 처리
모든 어셈블리어 명령어에서 [ ]사용시 해당 숫자를 주소로 인식
피연산자의 앞부분은 무조건 reg만 들어갈수 있으며 mem끼리의 연산은 불가능
연산시 무조건 같은 크기의 피연산자끼리만 연산 가능
ex) reg8, reg8 / reg16, imm16 / reg32, mem32
BYTE 1byte 8bit
WORD 2byte 16bit
DWORD 4byte 32bit
QWORD 8byte 64bit
PTR [402000]
포인터를 의미 [402000]의 위치
ex) DWORD PTR [402000]
[402000]부터 4바이트의 공간을 의미, [402000]~[402003]
MOV reg, reg/mem/imm
앞의 레지스터에 뒤에 설정된 값을 넣음
[ ] 사용시 해당 [ ] 안에 저장된 주소를 찾아가 주소에 있는 값을 세팅
CMP reg, reg/mem/imm
연산자끼리 비교
산술 연산
ADD reg, reg/mem/imm
연산자와 피연산자의 덧셈후 앞의 레지스터에 저장
ADC
Carry Flag를 포함한 덧셈 수행
SUB reg, reg/mem/imm
연산자와 피연산자의 뺄셈후 앞의 레지스터에 저장
SBB
Carry Flag를 포함한 뺄셈 수행
INC
피연산자의 수를 1 증가
DEC
피연산자의 수를 1 감소
NEG
부호있는 정수의 대하여 2의 보수를 취한다
음수 양수 변환
AAA
ASCII Adjust for Add
덧셈결과의 AL 값을 UNPACK 10진수로 보정
DAA
Decimal Adjust for Add
덧셈 결과의 AL 값을 PACK 10진수로 보정
AAS
ASCII Adjust for Subtract
뺄셈 결과의 AL 값을 UNPACK 10진수로 보정
DAS
Decimal Adjust for Subtract
뺄셈 결과의 AL 값을 PACK 10진수로 보정
MUL reg, reg/mem/imm
연산자와 피연산자의 곱셈후 앞의 레지스터에 저장
IMUL reg, reg/mem/imm
부호있는 숫자의 연산자와 피연산자의 곱셈
AAM
ASCII Adjust for Multiply
곱셈결과의 AX 값을 UNPACK 10진수로 보정
DIV reg, reg/mem/imm
연산자와 피연산자의 나눗셈후 앞의 레지스터에 저장
IDIV reg, reg/mem/imm
부호있는 숫자의 연산자와 피연산자의 나눗셈
AAD
ASCII Adjust for Divide
나눗셈결과의 AX 값을 UNPACK 10진수로 보정
CBW (Convert byte word)
1바이트의 데이터를 2바이트로 확장
AL -> AX
CWD (Convert word dword)
2바이트의 데이터를 4바이트로 확장
AX -> DX:AX
CWDE (Convert word dword EAX)
2바이트의 데이터를 4바이트로 확장
AX -> EAX
CDQ (Convert dword qword)
4바이트의 데이터를 8바이트로 확장
EAX -> EDX:EAX
논리연산
AND reg, reg/mem/imm
비트를 and 연산하여 앞의 레지스터에 보관
둘다 참일 경우 참
OR reg, reg/mem/imm
비트를 or 연산하여 앞의 레지스터에 보관
하나만 참일 경우 참
XOR reg, reg/mem/imm
비트를 xor 연산하여 앞의 레지스터에 보관
다르면 1 같으면 0
NOT reg
비트를 not 연산
TEST
데이터의 두 값을 비교할 때 사용한다.
CMP와는 다르게 1연산자에서 2연산자 값을 빼는 과정이 없다
결과로 ZF가 1로 세팅되면 서로 값이 같다는 의미가 되며
0으로 세팅되면 값이 다르다는 의미가 된다
SHL reg/mem/imm
Shift Left
논리 시프트 명령어 왼쪽 방향으로 피연산자 만큼 이동한다
SHR reg/mem/imm
Shift Right
논리 시프트 명령어 오른쪽 방향으로 피연산자 만큼 이동한다
SAL reg/mem/imm/CL
Shift Arithmetic Left
산술 시프트 명령어 왼쪽 방향으로 피연산자 만큼 이동한다
SAR reg/mem/imm/CL
Shift Arithmetic Right
산술 시프트 명령어 오른쪽 방향으로 피연산자 만큼 이동한다
ROL reg/imm
Rotate Left
비트를 operand만큼 왼쪽으로 회전
MSB를 LSB로 이동
ROR reg/imm
Rotate Right
비트를 operand만큼 오른쪽으로 회전
LSB를 MSB로 이동
RCL reg/imm
Rotate throutgh Carry Left
비트를 operand만큼 왼쪽으로 회전
MSB를 캐리플래그로 복사
캐리플래그를 LSB로 복사
RCR reg/imm
Roate throutgh Carry Right
비트를 operand만큼 오른쪽으로 회전
LSB를 캐리플래그로 복사
캐리플래그를 MSB로 복사
JUMP 명령어
JMP reg
해당 register로 무조건 이동
above와 below는 부호 없는 수를 말하며 CF를 체크
greater와 less는 부호 있는 수를 말하며 OF를 체크
※ A는 첫번째 비교대상 연산자
※ B는 두번째 비교대상 연산자
JZ (Jump if zero)
JE (Jump if equal)
연산결과값이 zero일 경우 이동
이동 Flag 조건
ZF = 1
JNE (Jump Not Equal)
JNZ (Jump Not Zero)
연산결과가 0이 아닐 경우 이동
이동 Flag 조건
ZF = 0
JECXZ reg/mem
ECX가 0로 세팅될 경우 이동
JCXZ reg/mem
CX가 0로 세팅될 경우 이동
부호 없는 연산자의 JUMP
JA (Jump above)
JNBE (Jump Not Below Equal)
비교시 앞의 값이 크면(작지 않거나 같지 않을 경우) 이동
A > B 경우 이동
이동 Flag 조건
CF = 0 and ZF = 0
JAE (Jump if above eqaul)
JNB (Jump if not below)
비교시 앞의 값이 크거나 같으면(작지 않을 경우) 이동
A >= B 경우 이동
이동 Flag 조건
CF = 0
JB (Jump Below)
JNAE (Jump Not Above Equal)
비교시 앞의 값이 작으면(크지 않거나 같지 않을 경우) 이동
A < B 경우 이동
이동 Flag 조건
CF = 1
JBE (Jump if Below Eqaul)
JNA (Jump if Not Above)
비교시 앞의 값이 작거나 같으면(크지 않을 경우) 이동
A <= B 경우 이동
이동 Flag 조건
(CF or ZF) = 1
부호 있는 연산자의 JUMP
JG(Jump if Geater)
JNLE (Jump Not Less Equal)
부호있는 연산자를 비교시 앞의 값이 큰 경우(작지 않거나 같지 않을 경우) 이동
A > B 경우 이동
이동 Flag 조건
ZF = 0 and SF = OF
JGE(Jump if Greater Eqaul)
JNL(Jump if Not Less)
부호있는 연산자를 비교시 앞의 값이 크거나 같으면(작지 않을 경우) 이동
A >= B 경우 이동
이동 Flag 조건
ZF = 1 or SF != OF
JL (Jump if Less)
JNGE (Jump Not Greater Equal)
부호있는 연산자를 비교시 앞의 값이 작은 경우(크지 않거나 같지 않을 경우) 이동
A < B 경우 이동
이동 Flag 조건
SF != OF
JLE (Jump if Less Eqaul)
JNG (Jump if Not Greater)
부호있는 연산자를 비교시 앞의 값이 작거나 같을 경우(크지 않을 경우) 이동
A <= B 경우 이동
이동 Flag 조건
ZF = 1 or SF != OF
상태 플래그 JUMP
JO (Jump Overflow flag set)
Overflow Flag 레지스터가 참일경우 이동
이동 Flag 조건
OF = 1
JNO (Jump Not Overflow flag set)
Overflow Flag 레지스터가 0일 경우 이동
이동 Flag 조건
OF = 0
JS (Jump Sign flag set)
Sigh Flag 레지스터가 참일 경우 이동
이동 Flag 조건
SF = 1
JNS (Jump Not Sign flag set)
Sigh Flag 레지스터가 0일 경우 이동
이동 Flag 조건
SF = 0
JC (Jump Carry flag set)
Carry Flag 레지스터가 참일 경우 이동
이동 Flag 조건
CF = 1
JNC (Jump Not Carry flag set)
Carry Flag 레지스터가 0일 경우 이동
이동 Flag 조건
CF = 0
JNP (Jump Not Parity)
JPO (Jump Parity Odd)
Parity Flag가 0일 경우 이동
이동 Flag 조건
PF = 0
JP (Jump Parity)
JPE (Jump Parity Even)
Parity Flag가 1일 경우 이동
이동 Flag 조건
PF = 1
LOOP reg/mem
counter register(ECX, CX)가 0이 아닐 경우 이동
자동으로 CX를 1씩 감소
LOOPZ reg/mem
LOOPE reg/mem
LOOP 조건 + ZF가 1로 설정시(연산결과가 0일시) 이동
LOOPNZ reg/mem
LOOPNE reg/mem
LOOP 조건 + ZF가 0으로 설정시(연산결과가 0이 아닐시) 이동
NOP
No Operation
아무 작업을 하지않는 명령
INTO
Overflow 발생시 인터럽트 실행
IRET
인터럽트에서 복귀
스택
PUSH reg/mem
스택에 해당 값을 넣음
BSP가 감소
POP reg
스택에서 값을 꺼내 해당 레지스터에 넣음
BSP가 증가
PUSHAD
범용 레지스터를 전부 메모리에 PUSH
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 순서대로 들어간다
POPAD
PUSHAD로 넣은 스택을 전부 순서대로 다시 꺼내서 범용 레지스터로 복구
PUSHFD
상태 레지스터를 전부 메모리에 PUSH
POPFD
PUSHFD로 넣은 스택을 전부 순서대로 다시 꺼내서 상태 레지스터로 복구
함수
CALL [주소값]
프로시저를 호출하는 명령
해당주소로 이동하여 프로시저를 실행
RET
프로시저를 종료하고 메인함수로 리턴하는 명령
CALL 실행시 스택에 PUSH된 주소값(다음에 실행될 주소)으로 리턴된다
프로세서 제어 명령
STC (Set Carry)
Carry Flag 1로 set
STD (Set Direction)
Direction Flag 1로 set
STI (Set Interrupt)
Interrupt Flag 1로 set
CLC (Clear Carry)
Carry Flag 0으로 clear
CLD (Clear Direction)
Direction Flag 0으로 clear
CLI (Clear Interrupt)
Interrupt Flag 0으로 clear
clear 명령어로서 해당 플래그 레지스터(Carry,Direction,Interrupt)를 0으로 set
HLT
프로세스 정지 명령
WAIT
프로세스를 일시 정지상태로 변경
ESC
프로세스 종료 명령
LAHF(Load status flags into AH register)
상태 레지스터를 AH 레지스터로 이동
최상위 비트 순으로 SF : ZF : 0 : AF : 0 : PF : 1 : CF 순서로 이동
SAHF(Store AH info register)
AH 레지스터를 상태 레지스터로 이동
최상위 비트 순으로 SF : ZF : 0 : AF : 0 : PF : 1 : CF 순서로 읽어온다
XCHG reg, reg/mem
앞의 피연산자와 뒤의 피연산자에 저장된 데이터를 교환
IN
피연산자가 지시한 포트로 AX에 데이터를 입력
OUT
피연산자가 지시한 포트로 AX의 데이터를 출력
XLAT
BX:AL이 지시한 테이블 내용을 AL로 로드
LEA reg,[reg,mem]
Load effective address
주소값 참조할때 사용, 플래그에는 영향을 미치지 않는다
두번째 operand의 결과값을 첫번째 레지스터로 이동
LES
LEA 명령과 유사한 방식으로 다른 ES 데이터의 주소 내용을 참조할 때 사용
MOVSX reg/mem
부호있는 정수의 경우 확장시 부호를 감안하여 확장하여 앞의 레지스터에 보관
MOVZX reg/mem
부호없는 정수의 확장하여 앞의 레지스터에 보관
MOVS EDI[mem]/ESI[mem]
특정 주소에서 특정주소로 문자열을 이동시킨다.
ESI와 EDI에 각각 문자열 시작점 메모리 주소를 넣은후에 이동
MOVSB, MOVSW, MOVSD는 byte,word,dword 단위로 문자열 이동
REP (Repeat string Operation Prefix)
명령어 앞에 붙히는 접두사
ECX에 설정된 횟수만큼 해당 명령어를 반복(ECX가 0이 될때까지 반복)
ex)
REP MOVS # ECX가 0이 될때까지 MOVS 명령어를 반복
CMPS ESI[mem]/EDI[mem] (Compare String)
문자열 단위로 비교, 반복작업시 접두사는 REPE, REPNE로만 사용
CMPSB,CMPSW,CMPSD는 byte, word, dword 크기단위로 비교
REPE (REP Equals)
CMPS에만 사용가능한 REP 명령어
비교시 같을때까지 반복
ECX = 0, ZF = 0일 경우 반복
REPNE (REP Not Equals)
CMPS에만 사용가능한 REP 명령어
비교시 같지 않을때까지 반복
ECX = 0, ZF = 1일 경우 반복
SCAS
AL 또는 AX가 ES:DI가 지시한 메모리 내용을 비교한 결과에 따라 플래그를 설정
Store: CPU에서 RAM으로 데이터를 저장하는것
STOS EDI[mem] (Store String)
EAX에 있는 데이터를 EDI에 지정된 메모리 주소에 저장
STOSB,STOSW,STOSD는 byte, word, dword 크기단위로 저장
Load: RAM에서 CPU로 데이터를 가져오는것
LODS(Load String)
EDI에 지정된 메모리 주소에 있는 데이터를 EAX에 로드
LODSB,LODSW,LODSD는 byte, word, dword 크기단위로 로드
반응형
'IT' 카테고리의 다른 글
Ubuntu 24.04에 Snort3(NIDS) 구축하기 (0) | 2025.01.03 |
---|---|
Python 흑백 사진 AI로 컬러로 바꾸는 프로그램 모델 파일 추가 (0) | 2023.12.31 |
자주 쓰이는 리눅스 명령어 (0) | 2023.05.25 |
[리뷰] 혼자 공부하는 컴퓨터구조+운영체제 (0) | 2023.05.23 |
[리뷰] IT 엔지니어를 위한 네트워크 입문 (0) | 2023.05.15 |