- INC / DEC / ADD / SUB / NEG
INC는 값을 1 증가시킴.
a: 0
a: 2
DEC는 값을 1 감소시킴.
a: 0
a: -2
ADD는 상숫값을 더해준다,(상숫값)
a: 0
a: 15
SUB는 상숫값을 빼준다,(상숫값)
a: 0
a: -15
NEG는 피연산자의 2의 보수를 계산하여 결과를 피연산자에 저장한다.(부호를 바꿔줌)
- MOV / AND / OR / XOR / NOT
MOV = 연산자
a에 0x10 대입한다.
a: 0
a: 16
AND &연산 해줌
OR |연산 해줌
XOR ^연산 해줌
NOT ~연산 해줌
- SHR / SHL
15만큼 << 연산함
15만큼 >> 연산함
- PUSH / POP
퓌쉬 팝 하면 스택이 떠오른다.
push를 한만큼 pop을 해주어야 한다.
push의 경우 상숫값, 레지스터, 메모리 모두 가능하다.
pop의 경우 레지스터와 메모리만 가능하다.
pop은 데이터를 받아줄 공간이 필요함으로 상수에는 받지못함.
push / pop을 이용해 변수 두개의 값을 더하기
스택에 a를 넣는다.
eax 레지스터에 꺼낸다.
add를 이용해 a에 eax레지스터 값을 더한다.
출력
a = 15
b = 16
a = 31
- PTR
a를 0으로 생성
pa는 메모리 주소를 찾기위해 만듬.
시아웃 출력 0
a에 WORD만큼 크기에 0xffffffff(f8개)를 대입
시아웃 출력 65535
메모리를 보면 int에 4바이트중 2바이트를 ff ff로 채웠다.
a에 DWORD만큼 크기에 0xffffffff(f8개)를 대입
시아웃 출력 -1
메모리를 보면 ff ff ff ff int가 꽉찼다.
ptr을 사용하면 자료형크기 만큼 메모리에 값을 복사한다.
테스트로 char를 사용하면 1바이트 복사해서 int에 1바이트 자리에 값을 넣는다.
ff ff ff ff
char ptr a, 0x0 하면
00 ff ff ff로 가능함.
ptr은 데이터 타입을 재정의 하는 명령어.
- OFFSET
offset은 전역변수의 주소를 가저온다.
offset을 이용해 주소를 eax에 넣어줌.
[]인다이렉트 모드로 eax에 들어 있는 주소로 이동한다.
offset을 이용해 g_index의 주수를 eax에 넣어놨고 [eax]로 eax에 들어있는 주소를 참조해 g_index에 접근한다.
Direct모드 / Indirect모드 << 링크
- LEA
lea를 이용해 a의 주소를 eax에 넣고
mov를 이용해 a에 eax를 넣는다.
a에 들어있는 값 2948800을 hex로 표현하면 2CFEC0 a의 주소다.
- STOS
mov를 이용해 eax에 0xff를 넣어줌.
lea edi에 a의 주소를 넣음
stos는 edi에 주소에 eax의 값을 넣는다.
결과로 255가 출력
stos를 사용할땐 edi에 주소가 있어야하며, eax에 값이 있어야한다.
- JMP / CMP
JMP는 코드레이블로 표시되는 목적지로 무조건 이동시킨다. 어셈블러는 코드 레이블을 오프셋으로 변환한다. 구문은 다음과 같다.
JMP EXIT
CPU가 무조건 이동을 실행할 때 EXIT의 오프셋은 명령어 포인터로 이동되어 새로운 위치에서 계속해서 실행되게 한다.
루프 생성 JMP 명령어는 루프의 꼭대기에 있는 레이블로 점프하여 루프를 쉽게 만들 수 있게 한다.
goto랑 똑같음.
점프조건문 (if 명령어)
ja, jb, je, jne, jae, jbe, jz, jnz
CMP 사용해보기
스위치문 느낌
브레이크를 해줘야함.
쭉내려감.
- LOOP
한번 돌때마다 루프 카운터가 감소한다.
mov eax , 0x0 레지스터 eax에 0넣음
mov ecx, 0xf 레지스터 카운터에 15넣음
FOR: 레이블 만듬.
inc eax eax++시킴
loop FOR 루프가 있으면 지정된 레이블로 점프한다. ecx가 1감소 한다.
inc eax
반복
ecx 가 0이되면 루프탈출
mov a, eax eax는 15로 됨. a에 5를 넣어줌.
a출력값 5
'Programming > C/C++/C#' 카테고리의 다른 글
C# enum 타입 foreach 예제 (0) | 2016.08.04 |
---|---|
asm - 어셈블리 까먹을 까봐 정리함. (0) | 2016.07.14 |
C++ - 프로퍼티 get set (0) | 2016.07.13 |
asm - 어셈블리어 기초2 (4) | 2016.04.13 |
C++ - 비트 출력 해보기 (1) | 2016.03.09 |
C# - abstract 추상화 (0) | 2016.01.26 |
C# - Exception - PInvokeStackImbalance (3) | 2016.01.20 |
C# - 파일 존재 여부 확인방법 (0) | 2015.12.24 |