7. 어셈블리어
• 기계어와 1:1 대응
• 비교적 사람이 보기 편한 문자로 구성
• 기계어와 어셈블리어의 성능 차이는 없다.
8. 고급언어(C/C++)
• 고급언어 -> 어셈블리어
• 고급언어와 어셈블리어는 1:1 대응되지 않는다.
• C는 꽤~ 1:1대응에 가깝다.
• C++로 작성하는 경우도 스타일에 따라 꽤 1:1대응에 가깝다.
• C or C스타일의 C++코드는 플랫폼 독립적인 어셈블리어라고도
한다.
• 어셈블리어의 성능/저수준 제어 + 이식성이 필요할때 C로
작성한다.
11. Reigister
컴퓨터의 프로세서 내에서 자료를 보관하는 아주 빠른 기억
장소이다.
일반적으로 현재 계산을 수행중인 값을 저장하는 데 사용된다.
대부분의 현대 프로세서는 메인 메모리에서 레지스터로 데이터를
옮겨와 데이터를 처리한 후 그 내용을 다시 레지스터에서 메인
메모리로 저장하는 로드-스토어 설계를 사용하고 있다.
프로세서 레지스터 - 위키백과, 우리 모두의 백과사전
(wikipedia.org)
12. X86의 주요 레지스터(user모드 기준)
• 범용 레지스터
• EAX,EBX,ECX,EDX
• 주소지정 레지스터
• ESI, EDI
• Flags register – eflags
• 프로그램 카운터 – EIP
• 스택 포인터 – ESP
• 스택 프레임 베이스 포인터 - EBP
13. Regis
ter
Accumulator Counter Data Base Stack Pointer Stack Base Pointer Source Destination
64-
bit
RAX RCX RDX RBX RSP RBP RSI RDI
32-
bit
EAX ECX EDX EBX ESP EBP ESI EDI
16-
bit
AX CX DX BX SP BP SI DI
8-bit AH AL CH CL DH DL BH BL SPL BPL SIL DIL
x86(x64) registers
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture
18. Visual Studio에서 Inline 어셈블리 코드 작성
• C/C++ 함수 안에서 __asm {}블록 안에 코딩
• 훌륭한 VS 디버거의 도움으로 무척 쉽게 작성 가능.
• C/C++함수로 전달받은 파라미터, 로컬 변수 그대로 asm코드에서
사용 가능.
• naked call이 아니라면(기본상태) 레지스터 보호 필요 없다.
• X64는 사용불가
• .asm파일로 작성하고 VS로 드래그앤 드롭하면 ml64로 어셈블 가능.
23. 산술연산
int __declspec(naked) __cdecl Mul_ASM(int a, int b)
{
__asm
{
push ebp
mov ebp,esp
mov eax,dword ptr[a]
mov ecx,dword ptr[b]
imul ecx
mov esp,ebp
pop ebp
ret
}
}
int __declspec(naked) __cdecl Div_ASM(int a, int b)
{
__asm
{
push ebp
mov ebp,esp
mov eax,dword ptr[a]
mov ecx,dword ptr[b]
idiv ecx
mov esp,ebp
pop ebp
ret
}
}
곱셈 나눗셈
24. 비교분기
• cmp 명령 사용 후 flags register의
내용에 따라 조건 분기
• cmp -> destination의 값을 변경하지
않는 sub와 같다.
25. flags register – eflags/rflags
• 연산 결과를 저장하거나 연산의 일부 옵션을 지정 가능한
레지스터
• User모드에서 사용 가능한 항목은 몇 개 안됨.
26. Visual Studio의 registers 윈도우
Flag Set value
Overflow (OF) OV = 1
Direction UP = 1
Interrupt EI = 1
Sign (SF) PL = 1
Zero (ZF) ZR = 1
Auxiliary carry (AF) AC = 1
Parity (PF) PE = 1
Carry (CF) CY = 1
47. int __declspec(naked) __cdecl Add_NakedCall_CDECL_LOCAL_VAR(int a, int b)
{
#define ARRAY_COUNT 4
int temp[ARRAY_COUNT];
__asm
{
push ebp
mov ebp, esp
push edi
; local variable
sub esp, __LOCAL_SIZE
; clear local variable
; &temp[0] -> (ebp-20) , &temp[1] -> (ebp-16), &temp[2] -> (ebp-12), &temp[3] -> (ebp-8)
mov ecx, ARRAY_COUNT
xor eax, eax
lea edi, dword ptr[temp]//
rep stosd
; a + b
mov eax,dword ptr[a]
mov edx,dword ptr[b]
add eax,edx
pop edi
mov esp,ebp
pop ebp
ret
}
}
Local 변수가 있을 경우
Release 모드 기준!!!
Stack frame