어셈블리 ( 정리중 )
Assembly 는 기계어와 1:1로 대응 되는 저급언어. 기계의 종류가 여러가지가 있듯이 그에 일대일 대응 되는 어셈블리 언어도 여러가지가 있다. 어셈블리 언어간에 형식은 비슷하나 규약이 있는건 아니다.
레지스터
"등록" 이라고 번역 되는데, 값을 저장하는 용도의 cpu 저장 장치의 주소이다.
연산자
대입 mov
덧셈 add
뺄셈 sub
곱셈 imul
나누기 idiv
명령어
함수 호출 CALL
비교 CMP
레이블 이동 ZNE
함수CALL종료 RET
코드 주소로 이동 JMP ( 프로그래머는 CALL 호출하고 내부적으로 JMP가 래핑 된다 )
2 + 3 - 4 * ( 5 / 6 )
mov eax, 2
add eax, 3
sub eax, 4
imul eax, 5
나눗셈의 결과인 몫과 피제수(나눌 대상)의 레지스터는 eax / 나머지의 레지스터는 edx 로 고정 돼 있다. 제수(몇으로 나눌지)를 어셈블리어로 정해주면 된다. 나머지의 레지스터인 edx는 초기화 돼 있지 않으면 나누기 연산 후에 주소 참조 에러가 발생한다
mov ebx, 6
mov edx, 0
idiv ebx
캐시메모리와 레지스터의 차이
캐시는 cpu와 붙어있고, 레지스터는 cpu의 구성품이다.
플래그
OV
UP
EI
PL
ZR
AC
PE
CY
CMP 연산자의 매개변수로 들어온 두 값이 같으면 ZR을 1 다르면 0으로 셋팅한다
흐름제어
__asm
{
mov eax, 0
START:
add eax, 1
cmp eax, 3
jne START
}
cmp 명령어로 eax와 3을 비교 후 ZR이 0이 되면 jne 명령어를 통해 START레이블로 이동한다.
함수 리턴값은 eax고정이기 때문에 아래 처럼 초기화 해 주면 리턴 레지스터에 저장 된다.
__asm
{
mov eax, 0
}
__declspec(naked) 를 함수 정의 전에 써 주면 순수 어셈블리어로만 작성 해야하고, 위배되면 error 발생
//////////////
function call 매개변수 넘기고 function을 asm으로 작성할경우 리턴 후 오류 나는 증상확인. esp 값 변화를 되 돌려야 하는 이유. 매개변수 지역변수
/////////