20140721 (ARM adc 소스 작성중, asm)
106일차
--------------
ARM ADC
--------------
------- 소스
--- adc.h
--- adc.c
-----------
asm
-----------
------- Reg
registers 종류 : data reg , general reg
EAX - EBX - ECX - EDX = Data Reg Or General Reg 라 한다.
여기서 특히 사용 많이 하는 EAX 레지스터를 accumulator 라 한다.
그래서 특히 4개중에 속도가 최고로 빠르다.
각각의 레지스터들은 32 비트이다 .
여기서 EAX는 반을 나누어서 사용한다 . 오른쪽은 AX 라하며 왼쪽은 호칭은 없다
여기서 AX를 또 반을 이용해서 사용하는데 반을 나눈 두가지를 AH AL 이라한다.
Ex) 레지스터 사용되는 형식
int A = 100; short B = 100; char C = 100; 여기서 연산을 A= A+1 을 할 경우 1. mov EAX,A의 주소 2. add EAX,1 ; EAX=EAX + 1 3. mov A의 주소,EAX B = B+1 을하면 EAX 대신에 AX를 대입하고 A의 주소에 B의 주소를 넣으면 된다. C = c+1 을하면 EAX 대신에 AL를 대입하고 A의 주소에 C의 주소를 넣으면 된다. |
이렇게 앞의 type에 따라 용량에 맞춰 레지스터가 사용된다.
---- Index Reg
-- Index Reg - ESI , EDI
1. 주로 주소를 저장하는 레지스터이다.
2. 연산을 할 때도 사용할 수 있다.
3. 데이터를 복사할때 사용하면 편리하다.
-출발점 주소를 ESI 도착점 주소를 EDI로 지정하면
ESI가 가리키는 주소를 EDI가 가르키는 복사된다..
-- Index Reg - ESP , EBP
ESP = Stack Pointer EBP = Base Pointer 라 한다.
이 두개의 레지스터는 함수호출할때 사용되며 중요한 레지스터이므로 함부로 설정하지 않는다.
----- Segment Reg
CS |
코드 영역 |
DS |
데이터 영역 |
ES |
확장 영역 |
FS |
안 중요함 |
GS |
안 중요함 |
SS |
스택 영역 |
----- EIP (Reg Or instruction pointer)
- 명령어를 저장하는 주소
- 다른 CPU에서는 PROGRAM COUNT 라 하고 PC이다. PC 와 EIP는 같은 것이다.
EFLAGS Reg : 상태를 저장하는 레지스터
----- PC Hardware : Input / Output
Memory mapped i/o : ARM/AVR 방식 , C로 접근가능 I/O레지스터가 메모리에 있음
I/O mapped i/o : 인텔방식 C로 접근불가 I/O레지스터가 메모리에 없음 어셈블리로 접근가능
Integrated development environments (IDE)
- test compiler debugger 3개를 합쳐서 통합개발환경이라 한다.
--- 예제 소스
- 명령어
add eax, 158
- directive (라벨, 지시자)
. 으로 시작.
- macro
- mnemonic 니모닉이라고 읽음.
name mnemonic operand(s) ; comments
Zerocount: mov ecx, 0 ; ecx = 0;
(name은
생략 가능)
(라벨, 지시자)
name만 쓸 수도 있다.
- .386
.MODEL FLAT
이 두 명령어는 sam 작성시 가장 앞에 써줘야 한다.
- asm으로 작성할 때 .386을 안쓰면 그 하위 버전용으로만 동작한다.
.586등 높은 수를 사용하면 최신기능을 사용할 수 있으나
하위 cpu들은 그 기능을 사용할 수 없다.
- 함수 선언
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
(cpu, reg를 만지고 원래 상태로 되돌리는 기능)
- 헤더파일 포함
INCLUDE io.h
- cr EQU 0dh (h:hexa, 0d = 13)
이 코드는 C로
#define cr 0dh
EQU(이퀄, 같다)
정리하면 cr이란 단어가 나오면 16진수 0D로 변환하라는 뜻.