EAX : 누산기(Accumulator) 레지스터. 더하기, 빼기 등 사칙연산에서 주로 사용되며, 함수의 리턴 값이나 return 100, return FALSE 등의 코드를 사용할 때 100이나 FALSE에 해당하느 값이 저장됩니다.
EDX : 데이터 레지스터. EAX와 마찬가지로 각종 연산에 사용되지만, 리턴 값의 용도로는 사용되지 않습니다.
ECX : 카운터 레지스터. for문을 사용할 때의 i 역할을 하여, 미리 루프를 돌 값을 넣어놓습니다. 3바퀴를 돈다면, 먼저 3으로 설정하고 i-- 를 하는 것과 같습니다. 카운팅이 필요 없다면, 변수로 사용해도 무방합니다.
EBX : 베이스 레지스터. 어떤 목적으로 만들어진 레지스터가 아닌, 공간이 더 필요할 때 등 적당한 용도를 프로그래머나 컴파일러가 알아서 만들어서 사용합니다. 위의 레지스터로 부족할 경우 사용합니다.
인덱스 레지스터
ESI : 시작지 인덱스(Source Index)입니다.
EDI : 목적지 인덱스(Destination Index)입니다. ESI에서 메모리를 읽어 EDI로 복사한다고 생각하면 됩니다.
포인터 레지스터 : 메모리 위치를 가리키는 32/64bit 주소를 저장하므로 포인터라 불립니다. 프로그램을 실행하고 메모리 관리를 하는데 사용되어 중요합니다.
ESP : 스택 포인터 레지스터. 어떤 명령어(PUSH, POP 등)는 ESP를 직접 조작합니다.
EBP : 베이스 포인터 레지스터. 함수가 호출 되었을때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 합니다.
=> 앞이 E로 시작하는 이유는 32bit 환경이기 때문으로, 64bit인 경우에는 R로 시작합니다.
PUSH,POP : 스택에 값을 넣는 것을 PUSH, 스택에 있는 값을 가져오는 것이 POP이다.
PUSHAD, POPAD는 모든 레지스터를 PUSH하고 POP하라는 명령어 입니다. 오퍼랜드는 push eax, push 1등 과 같이 1개만 있으면 됩니다.
MOV : 단지 값을 넣는 역할을 합니다. 예컨대 MOV eax, 1은 eax에 1을 넣는 코드가 되고, MOV ebx, ecx는 ebx에 ecx를 넣는 코드가 됩니다.
LEA : MOV는 값을 가져오는 것이고, LEA는 주소를 가져오라는 뜻입니다.
ADD : src에서 dest로 값을 더하는 명령입니다.
SUB : src에서 dest로 값을 빼는 명령입니다.
INT : 인터럽트(운영체제에서 컴퓨터에 예기치 않은 일이 발생하더라도 작동이 중단되지 않고 계속적으로 업무 처리를 할 수 있도록 해주는 기능)를 일으키는 명령어 입니다. 뒤의 오퍼랜드로 어떤 숫자가 나오느냐에 따라 각기 다른 처리가 일어납니다. 현재 32비트 시대에서는 애플리케이션 레벨에서의 인터럽트는 한계가 있고, ring0 레벨로 내려가기 전까진 거의 사용할 일이 없는 명령어가 되었습니다. 리버스 엔지니어링을 하다보면 INT 3 명령어로 옵코드가 0xCC인 DebugBreak()를 가장 많이 만난다고 합니다.
CALL : 함수를 호출하는 명령어로 뒤에 오퍼랜드로 번지가 붙는다. 해당 번지를 호출하고 작업이 끝나면 CALL 다음번지로 되돌아 옵니다. 왜냐하면 CALL로 호출된 코드 안에서는 반드시 RET를 만나게 되어 다시 호출한 쪽으로 돌아오기 때문입니다.
INC,DEC : 쉽게 INC는 i++; , DEC i--; 와 같습니다.
AND, OR, XOR : dest와 src를 연산합니다. 여기서 XOR은 dest와 src를 동일한 오퍼랜드로 처리 가능합니다. 예컨대 XOR EAX, EAX를 수행할 경우 EAX가 0이 됩니다. 즉, 같은 값으로 XOR을 하면 0이 되기 때문에 XOR로 같은 오퍼랜드를 전달했을떄 이것은 변수를 0으로 초기화 하는 효과를 줄 수 있습니다.
※ 비트연산 참고 ->
ko.wikipedia.org/wiki/%EB%B9%84%ED%8A%B8_%EC%97%B0%EC%82%B0
비트 연산 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기
ko.wikipedia.org
NOP : 아무것도 하지 말라는 명령어로 해킹이나 리버스 엔지니어링에서 가장 많이 쓰이는 명령어라고 합니다.
CMP, JMP : 비교해서 점프하는 명령어라고 생각하면 됩니다.
참조
m.blog.naver.com/aaasssddd25/220901909436
[정리] 어셈블리어 정리
안녕하세요. 칸입니다. 개인 사정으로 인하여 글을 너무 늦게 올리게 되었습니다.시험 마치고 바로...
blog.naver.com
[어셈] 레지스터
어셈블리어는 레지스터 변수로 이루어진 언어? 이다 그럼 레지스터에 대해서 알아보자 이런게 있다. 좌측에...
blog.naver.com
'프로그래밍 > CS' 카테고리의 다른 글
| [컴퓨터 통신] 데이터 통신 (0) | 2022.12.27 |
|---|---|
| hosts 파일 (0) | 2021.01.28 |
| TCP/UDP (0) | 2020.02.11 |
| NETWORKING stateless/stateful (0) | 2020.02.10 |
| 자료구조 - Stack vs Queue || Shallow/Deep Copy (0) | 2020.01.13 |