데이터 이동
lea : 데이터를 직접 읽지 않고 주소만 계산해서 레지스터에 저장을 하는 명령어
mov : 메모리에서 직접 데이터를 읽어오는 명령어
산술연산
inc : 레지스터나 메모리 값에 1을 더한다
dec : 레지스터나 메모리 값에서 1을 뺸다
add : 두 값(레지스터, 소스) 을 더한다
sub : 두 값을 뺀다 > 목적지 - 소스
논리 연산
and : 두 값의 비트 단위로 and 연산을 수행함, 둘 다 1인 경우에만 1을 반환한다.
or : 두 값의 비트 단위로 or 연산을 수행함, 둘 중 하나라도 1이면 1을 반환한다.
xor : 두 값의 비트 단위로 xor 연산을 수행함, 두 값이 다르면 0을 반환한다
not : 비트를 반전시킴, 즉 1은 0 으로 , 0은 1로 반전시킨다.
분기
jmp : 무조건 특정 주소로 점프한다.
je(jump equal) : 두 비교 값이 같을 때 특정 주소로 점프함 (zero flag가 설정되었을 때)
jne(jump not equal) : 값이 다를 때 특정 주소로 이동
jg : 비교 값이 더 클 때, 특정 주소 이동함
스택
push : 스택에 값을 호출한다, 현재 실행 중인 위치를 스택에 저장 후, 지정된 프로세서로 이동함
pop : 스택에서 값을 꺼냄, 가장 최근에 있는 값을 꺼낸다
프로시저
call : 함수 호출시에 사용이 된다 jmp 와 다른 점은 되돌아올 다음 명령을 스텍에 저장을 한다.
ret(return) : 프로시저 호출이 끝난 후, 원래 호출된 위치로 돌아간다
leave : 함수가 종료될 때 스택을 정리하는 데 사용됨, 함수에서 스택 프레임을 제거하는 과정
dword : 4바이트의 데이터를 의미
ptr : 메모리 주소를 다루는 것을 의미
레지스터(register) > 데이터를 저장하는 공간
범용 레지스터
eax(4byte), ebx(2byte) : 연산에 사용
ecx : 반복 명령어 사용시 카운터로 사용
edx : eax와 비슷하다, 연산에 사용
esi, edi : 메모리 복사
eip : CPU가 다음에 실행해야 할 메모리 주소가 저장
ebp : parame pointer / 스택 아래를 가리키는 포인터
esp : 스택 주소를 가리키는 포인터
esi : 32비트 레지스터 rsi : 64비트 레지스터
cmp : 두 연산자를 비교하는 명령어 > 두 연산자의 값이 같다면 결과는 0 ZF 는 1로 세트가 된다. 다르면 0
ZF(Zero Flag) : 처음 상태일 때는 Not Zero zf가 0으로 세트된 상태 계산 결과 값이 0일 경우 zf가 1로 세트 nz가 zr로 변경
call : 함수 호출시에 사용이 된다 jmp 와 다른 점은 되돌아올 다음 명령을 스텍에 저장을 한다.
operartion - 명령어가 수행할 연산
operand - 연산에 사용할 데이터 또는 위치
stat 에서는 지역변수가 저장이됨
- 레지스터를 0으로 초기화 하는 방법
mov ax, 0 > 일반적인 ax에 0값을 넣는 명령어
sub ax, ax > ax-ax 자신끼리 뺄셈 계산을 하는 방식이다
xor ax, ax > 서로 같은 값을 가질 경우 0이 되는 방식을 이용한다.
초기화 시키는 법 : 새로고침 (ctrl + f2) 시작코드(f9)로 이동
스택(stack) > 메모리(작업 테이블)에 있는 영역 (여러 일을 동시에 진행 할 수 있음)
레지스터(register) > 데이터를 저장하는 공간
범용 레지스터
덤프 메모리 > 데이터, 스택, 혹은 힙 등의 메모리 구조를 분석