레지스터에서 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
}
ㅇㅀ
- 사용하던 레지스터 값들을 스택에 빽업
- 위의 어셈블리에서연산 처리과정
LSU 를 통해서 Memory Data 에서 변수 값을 읽어와 eax, edx 레지스터에 값을 복사 - 명령에셋 Instruction fetch 에서 더하기 명령어를 가져와서 ALU 에 넣는다
- eax와 edx에 있는 값과 명령에셋에서 가져온 더하기 명령어와 함께 ALU 를 통해서 연산한다
- 더하기 연산을 한다음 eax 에 누적한다
- LSU 를 통해서 결과 값을 변수 c(메모리 영역에 있는 변수) 에 대입
- 이전 레지스터 값 복구
반응형
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
RVO(Return Value Optimization), NRVO(Named Return Value Optimization) (0) | 2018.04.28 |
---|---|
메모리관점에서 본 전역(global)변수와 정적(static)변수의 차이 (0) | 2018.02.16 |
__declspec(align(n)) 으로 바이트 정렬하기 (0) | 2018.02.10 |
__attribute__ ((noinline)) (0) | 2017.05.14 |
상속의 복사생성자 (0) | 2016.11.06 |