목록보안 (29)
Jiyong's STUDY
자료구조에서 배울 수 있는 stack 자료구조에 대한 설명. 일단 stack 자료구조의 ADT와 예제 func.h #pragma once #ifndef __AB_STACK_H__ #define __AB_STACK_H__ #define TRUE 1 #define FALSE 0 #define STACK_LEN 100 typedef int Data; typedef struct _arrayStack { Data stackArr[STACK_LEN]; int topIndex; }ArrayStack; typedef ArrayStack Stack; void StackInit(Stack* pstack); int SIsEmpty(Stack* pstack); void SPush(Stack* pstack, Data data)..
//책에서는 명령어를 강제적으로 외우지 않는 것을 권함. PUSH, POP 스택에 값을 넣는 것을 PUSH, 그리고 스택에 있는 값을 가져오는 것이 POP다. (PUSHAD, POPAD는 모든 레지스터를 PUSH, POP 하라는 명령어다) MOV MOV는 단지 값을 넣는 역할을 한다. LEA LEA는 주소를 가져오는 역할이다. MOV와 헷갈릴 수 있다. MOV는 값을, LEA는 주소를 가져온다. 대부분 가져올 src 오퍼랜드가 주소라는 의미로 []로 둘러쌓여 있다. 예시로 esi: 0x401000 *esi: 5640EC83 esp+8: 0x13FF40 *(esp+8): 33 lea eax, dword ptr ds:[esi] : esi가 0x401000이므로 eax에는 0x401000이 들어온다. mov ..
IA-32 레지스터는 범용 레지스터가 8개 있다. 레지스터를 '변수'로 이해하면 이해하기 쉽다. 정확하게 "변수는 변수인데, CPU가 사용하는 변수다." 레지스터는 EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP로 총 8개다. EAX부터 EDX까지는 ABCD순인데 정확히는 EAX, EDX, ECX, EBX의 순으로 외우는게 맞다. EAX (Extended Accumulator Register) Accumulator. 이 레지스터의 역할을 요약하면 산술 계산을 하며, 리턴값을 전달한다. 쉽게 생각하면 단지 "변수"이며, 구체적으로는 "가장 많이 쓰는 변수"이다. 계산식에 사용되며 사칙연산 등에 자주 등장한다. 함수의 리턴값이나 return 100, return FALSE 등의 코드를 ..
x86 CPU의 기본 구조인 IA-32 기준 IA-32의 기본 형태는 "명령어 + 인자" 로 이루어졌다. 예를 들어 push 337 으로 되어있다면 여기서 mov나 push같은 것을 명령어라고 한다. 이는 옵코드(opcode)라고 한다. 그 뒤에 인자가 들어오는데 인자는 명령어 다음에 "어떤 장소로 값을 넣을 것인지", 또는 "명령어에 해당하는 값" 등이 된다. 이는 오퍼랜드(operand)라고 한다. mov eax, 1 이런식으로 있다면 여기서 옵코드는 mov, 오퍼랜드는 eax와 1 두개가 된다. 참고로 모든 오퍼랜드는 앞의 것이 destination이고 뒤의 것이 source이다. (예시로 memcpy, strcpy)
냉장고에서 물을 꺼내서 마신다는 경우에, C/C++ 코드로 작성한다면 void 물마심(){ bool b0pen = 냉장고문오픈(); if (b0pen){ 물을꺼냄(); 마심(); } } 이런식이 된다. 하지만 이것을 어셈블리어로 표현한다면? _asm{ 냉장고앞으로간다 냉장고문을잡는다 냉장고문을연다 오픈성공: 냉장고안을본다 손을든다 냉장고안에넣는다 물병을잡는다 물병을꺼낸다 뚜껑을연다 물을컵에따른다 컵을손에든다 컵에든것을마신다 이런식이다. 차이점은 간단하게는 "한 가지 동작"을 한다는 것이다. 어셈블리어는 한 번에 한 가지 동작밖에 하지 못한다. 즉 짧은 코드도 어셈블리어로 바꾸면 엄청나게 길어진다는 점이 있는데, 이를 해석하는 방법을 알아야 한다.