1. 데이터 이동 명령어
mov
데이터를 한 레지스터에서 다른 레지스터, 혹은 메모리 간에 복사
MOV EAX, EBX ; EBX 값을 EAX로 복사
MOV EAX, [ADDR] ; 메모리 주소 ADDR의 값을 EAX로 복사
MOV [ADDR], EAX ; EAX 값을 메모리 주소 ADDR에 저장
xchg
두 레지스터(또는 레지스터와 메모리) 값 교환
XCHG EAX, EBX ; EAX와 EBX 값 교환
2. 산술 연산 명령어
add / sub
더하기, 빼기
ADD EAX, EBX ; EAX = EAX + EBX
SUB EAX, 5 ; EAX = EAX - 5
mul / imul
곱셈(부호 없는 곱셈 : mul, 부호 있는 곱셈 : imul)
MUL ECX ; EAX = EAX * ECX
IMUL EBX, 5 ; EBX = EBX * 5 (부호 있는 곱셈)
div / idiv
나눗셈(부호 없는 나눗셈 : div, 부호 있는 나눗셈 : idiv)
DIV ECX ; EAX:EDX ÷ ECX, 몫 = EAX, 나머지 = EDX
inc / dec
값 1 증가, 값 1 감소
INC EAX ; EAX = EAX + 1
DEC EBX ; EBX = EBX - 1
3. 논리 연산 명령어
and / or / xor
비트 단위 AND 연산, 비트 단위 OR 연산, 비트 단위 XOR 연산
AND EAX, 0xF ; EAX의 하위 4비트를 유지, 나머지 비트는 0
OR EBX, EAX ; EBX와 EAX의 비트를 OR 연산
XOR EAX, EAX ; EAX를 0으로 초기화
not
비트 반전
NOT EAX ; EAX의 모든 비트를 반전
cmp
두 값을 비교하여 플래그 설정
CMP EAX, EBX ; EAX와 EBX를 비교
test
비트 단위 AND 연산 후 플래그 설정
TEST EAX, EAX ; EAX가 0인지 확인 (ZF 플래그 설정)
4. 점프 및 흐름 제어
jmp
무조건 점프
JMP LABEL ; LABEL로 점프
je / jne
조건부 점프(ZF 플래그의 값에 따라)
je는 ZF = 1일 때, 점프
jne는 ZF = 0일 때, 점프
JE LABEL ; ZF = 1일 때 LABEL로 점프 (EAX == EBX)
JNE LABEL ; ZF = 0일 때 LABEL로 점프 (EAX != EBX)
call / ret
함수 호출, 함수 반환
CALL FUNC ; FUNC 함수 호출
RET ; 함수 반환 - 1
RET 8 ; 함수 반환 - 2
5. 스택 작업
push / pop
값을 스택에 저장, 스택에서 값을 가져옴
PUSH EAX ; EAX 값을 스택에 저장
POP EBX ; 스택에서 값을 꺼내 EBX에 저장
6. 시프트 및 회전
shl / shr
비트 왼쪽/오른쪽 시프트
SHL EAX, 1 ; EAX를 2배로 증가
SHR EAX, 1 ; EAX를 1/2로 감소
rol / ror
비트 왼쪽/오른쪽 순환 이동
ROL EAX, 1 ; EAX 비트를 왼쪽으로 순환 이동
ROR EBX, 1 ; EBX 비트를 오른쪽으로 순환 이동
7. 기타 명령어
lea
메모리 주소를 계산
LEA EAX, [EBX+4] ; EBX + 4의 주소를 EAX에 저장
int
인터럽트 호출 (시스템 호출, 디버깅)
INT 0x80 ; 리눅스 시스템 호출
nop
아무 작업을 하지 않음 (디버깅 또는 최적화 방지)
NOP ; No Operation
'IT공부' 카테고리의 다른 글
[ETC] 커널 전역 데이터 구조, 전역 or 프로세스별 커널 오브젝트 (0) | 2024.12.14 |
---|---|
[ETC] 지수와 로그 역관계 (0) | 2024.12.14 |
[ETC] 확률 (0) | 2024.11.13 |
[ETC] 경량 스레드 (Light-weight thread) (0) | 2024.04.23 |
[ETC] 함수형 프로그래밍과 객체 프로그래밍의 차이 (0) | 2024.01.29 |