레지스터에서 eax 가 존재하고 물리적으로는 edx 가 일자로 위 그림처럼 위치해 있는것

eax 에서 연산하다가 넘치면 edx 로 넘친다



여기서 우선 중요한 레지스터는 

EAX, EDX, ECX, EBX, ESI, EDI 이고 이것들은 연산을 하기위한 레지스터들과 

데이터 조작을 할때 ESI, EDI 등을 사용한다 (Source, Destination)

EBP, ESP 는 스택포인터들을 말한다





어셈 명령어중


PUSHAD  : Push All General-Purpose Registers

POPAD    : Pop All General-Purpose Registers

가 있는데 pushad 는 레지스터를 빽업(스택에 저장) 하는것이고 popad 는 빽업했던 레지스터 내용들을 다시 복구하는 작업을 한다



int a=10,b=10, c=0;

__asm

{

  pushad

   mov eax,, a

   mov ebx,, b

   add eax, ebx

   mov c, eax

  popad

}



ㅇㅀ

  1. 사용하던 레지스터 값들을 스택에 빽업

  2. 위의 어셈블리에서연산 처리과정
    LSU 를 통해서 Memory Data 에서 변수 값을 읽어와 eax, edx  레지스터에 값을 복사

  3.  명령에셋 Instruction fetch 에서 더하기 명령어를 가져와서 ALU 에 넣는다 

  4. eax와 edx에 있는 값과 명령에셋에서 가져온 더하기 명령어와 함께 ALU 를 통해서 연산한다

  5. 더하기 연산을 한다음 eax 에 누적한다

  6. LSU 를 통해서 결과 값을 변수 c(메모리 영역에 있는 변수) 에 대입

  7. 이전 레지스터 값 복구





반응형

+ Recent posts