안녕하세요
어셈블리어 공부를 하면서 주로 쓰이는 명령어들을 몇가지 정리를 해보았습니다.
아마 추가사항이 있을 경우에는 추가적으로 수정이 될듯합니다.
여기에 없는 명령어들도 있으며 x86 CPU 기준으로 사용되는 명령어입니다.
MOV
앞의 레지스터에 뒤에 설정된 값을 넣음
[ ] 사용시 해당 [ ] 안에 저장된 주소를 찾아가 주소에 있는 값을 세팅
CMP
연산자끼리 비교
ADD
연산자와 피연산자의 덧셈후 앞의 레지스터에 저장
SUB
연산자와 피연산자의 뺄셈후 앞의 레지스터에 저장
JMP
해당 register로 무조건 이동
JZ(Jump if zero)
연산결과값이 zero일 경우 이동
JA(Jump above)
CMP로 비교시 앞의 값이 크면 이동
JB(Jump below)
CMP로 비교시 앞의 값이 작으면 이동
JNA(Jump if not above)
CMP로 비교시 앞의 값이 크지않으면 이동
JBE(Jump if below eqaul)와 같음
JNB(Jump if not below)
CMP로 비교시 앞의 값이 작지않으면 이동
JAE(Jump if above eqaul)와 같음
JG(Jump if greater)
부호있는 연산자를 CMP로 비교시 앞의 값이 큰 경우 이동
JL(Jump if less)
부호있는 연산자를 CMP로 비교시 앞의 값이 작은 경우 이동
JNG(Jump if not greater)
부호있는 연산자를 CMP로 비교시 앞의 값이 크지않으면 이동
JLE(Jump if less eqaul)와 같음
JNL(Jump if not less)
부호있는 연산자를 CMP로 비교시 앞의 값이 작지않으면 이동
JGE(Jump if greater eqaul)와 같음
JO,JS,JC
overflow flag, sigh flag, carry flag
상태 레지스터가 참일경우 이동
JECXZ reg/mem
ECX가 0로 세팅될 경우 이동
JCXZ
CX가 0로 세팅될 경우 이동
LOOP
counter register(ECX, CX)가 0이 아닐 경우 이동
자동으로 CX를 1씩 감소
LOOPZ = LOOPE
LOOP 조건 + ZF가 1로 설정시(연산결과가 0일시) 이동
LOOPNZ = LOOPNE
LOOP 조건 + ZF가 0으로 설정시(연산결과가 0이 아닐시) 이동
NOP
No Operation
아무 작업을 하지않는 명령
MUL
연산자와 피연산자의 곱셈후 앞의 레지스터에 저장
DIV
연산자와 피연산자의 나눗셈후 앞의 레지스터에 저장
IMUL
부호있는 숫자의 연산자와 피연산자의 곱셈
IDIV
부호있는 숫자의 연산자와 피연산자의 나눗셈
AND
비트를 and 연산하여 앞의 레지스터에 보관
둘다 참일 경우 참
OR
비트를 or 연산하여 앞의 레지스터에 보관
하나만 참일 경우 참
XOR
비트를 xor 연산하여 앞의 레지스터에 보관
다르면 1 같으면 0
NOT
비트를 not 연산
NEG
부호있는 정수의 대하여 2의 보수를 취한다
음수 양수 변환
STC,STD,STI
set 명령어로서 해당 플래그 레지스터(Carry,Direction,Interrupt)를 1로 set
CLC,CLD,CLI
clear 명령어로서 해당 플래그 레지스터(Carry,Direction,Interrupt)를 0으로 set
SHL, SHR
논리 비트시프트 명령어 Left, Right 방향으로 가능
SAL, SAR,
산술 비트시프트 명령어 Left, Right 방향으로 가능
부호있는 숫자의 부호를 유지하며 산술시프트 실행
ROL
비트를 operand만큼 왼쪽으로 회전
MSB를 LSB로 이동
ROR
비트를 operand만큼 오른쪽으로 회전
LSB를 MSB로 이동
RCL
비트를 operand만큼 왼쪽으로 회전
MSB를 캐리플래그로 복사
캐리플래그를 LSB로 복사
RCR
비트를 operand만큼 오른쪽으로 회전
LSB를 캐리플래그로 복사
캐리플래그를 MSB로 복사
PUSH
스택에 해당 값을 넣음
BSP가 감소
POP
스택에서 값을 꺼내 해당 레지스터에 넣음
BSP가 증가
PUSHAD
범용 레지스터를 전부 메모리에 PUSH
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 순서대로 들어간다
POPAD
PUSHAD로 넣은 스택을 전부 순서대로 다시 꺼내서 범용 레지스터로 복구
PUSHFD
상태 레지스터를 전부 메모리에 PUSH
POPFD
PUSHFD로 넣은 스택을 전부 순서대로 다시 꺼내서 상태 레지스터로 복구
CALL [주소값]
프로시저를 호출하는 명령
해당주소로 이동하여 프로시저를 실행
RET
프로시저를 종료하고 메인함수로 리턴하는 명령
CALL 실행시 스택에 PUSH된 주소값(다음에 실행될 주소)으로 리턴된다
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
앞의 피연산자와 뒤의 피연산자에 저장된 데이터를 교환
LEA
Load effective address
주소값 참조할때 사용, 플래그에는 영향을 미치지 않는다
두번째 operand의 결과값을 첫번째 레지스터로 이동
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
MOVSX
부호있는 정수의 경우 확장시 부호를 감안하여 확장하여 앞의 레지스터에 보관
MOVZX
부호없는 정수의 확장하여 앞의 레지스터에 보관
MOVS
특정 주소에서 특정주소로 문자열을 이동시킨다.
ESI와 EDI에 각각 문자열 시작점 메모리 주소를 넣은후에 이동
MOVSB, MOVSW, MOVSD는 byte,word,dword 단위로 문자열 이동
REP (Repeat string Operation Prefix)
명령어 앞에 붙히는 접두사
ECX에 설정된 횟수만큼 해당 명령어를 반복
CMPS (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일 경우 반복
Load는 RAM에서 CPU로 데이터를 가져오는것
Store는 CPU에서 RAM으로 데이터를 저장하는것
STOS EDI[mem] (Store String)
EAX에 있는 데이터를 EDI에 지정된 메모리 주소에 저장
STOSB,STOSW,STOSD는 byte, word, dword 크기단위로 저장
LODS(Load String)
EDI에 지정된 메모리 주소에 있는 데이터를 EAX에 로드
LODSB,LODSW,LODSD는 byte, word, dword 크기단위로 로드
Python 흑백 사진 AI로 컬러로 바꾸는 프로그램 모델 파일 추가 (0) | 2023.12.31 |
---|---|
자주 쓰이는 리눅스 명령어 (0) | 2023.05.25 |
[리뷰] 혼자 공부하는 컴퓨터구조+운영체제 (0) | 2023.05.23 |
[리뷰] IT 엔지니어를 위한 네트워크 입문 (0) | 2023.05.15 |
x86 어셈블리어 상태 레지스터 (0) | 2022.12.01 |