2011년6월14일_ATmega128복습(Datasheet 해석), C Code를 disassemble하여 메모리의 OPeration Code와 Operand를 분석하여 컴퓨터에 대해 알아가기, C과제9풀이, C과제10풀이

 

★ 자기 발전이 없으면 험한 세상을 살아 가기 힘들다.
   (인터넷의 발달로 사람들의 기호의 변화가 빨라 그에 맞추려면 빨리 변화에 대응해야 한다.)
★ 주 5일 근무제에선, 5일 동안 열심히 일하고
                     주말2일 동안 놀 계획을 짠다.
★ 서울사람들은 5시에 기상하고 7~8까지 학원에서 공부한 뒤에 출근하나,
   부산사람들은 대부분 공부를 하지 않는다.
   (자기계발을 하지 않으니 당연히 월급이 적지…)

 

 

ATmega128복습(Datasheet해석)



어제 강의한 내용 중에 Fully Static Operation의 설명이 잘 못 되었다.
명령어의 길이가 Intel CPU처럼 가변이 아닌 고정이라 설명하였는데,
CPU core 주변회로에 공급하는 클록관련 내용이다.

CPU ┬ core
      └ device 

CPU는 core와 device로 나눌 수 있고 MCU는 core와 device 모두 다 가진 칩이다.
core는 ALU + CU + Register로 구성되어 있으며 여기에 주변장치를 붙이면 MCU라 부른다.

 

소프트웨어적으로 MCU내의 장치를 ON/OFF시킬 수 있다.
CK(clock)을 장치에 공급하면 장치가 ON되고,
CK(clock)을 장치에 공급하지 않으면 OFF된다.

왼쪽 그림에서 16.000은 16Mhz 크리스탈이고,
MCK (마스터 클록)이라고 한다.

● 주변장치로 가는 클록을 제어함으로써 사용하지 않는,
   장치가 동작하지 않게 하여 소비전력을 줄일 수 있다.

 

MCU외부에 있으니 외부오실레이터라 하고, 내부에도 있는데 그것은 내부오실레이터라 한다.
외부크리스탈은 최대 주파수가 정해져 있어 그 이상 높일 수 없으니 PLL이라는 주파수체배기를 사용해 *3체배를 하면,
16Mhz * 3 = 48Mhz가 core에 공급된다.

내부와 외부 오실레이터를 비교하면,

  속도 크기 방식 가격
외부오실레이터 빠름 크다 수정발진위주 비싸다
내부오실레이터 느림 작다 RC발진위주 싸다

 


좀 더 자세히 알기 위해 “fully static operation”으로 검색해 보니…

관련 공개토론 게시물을 찾을 수 있었고, 그 중 신뢰할 만한 분의 글을 해석해보니…

예전 CPU는 DRAM을 사용하여 클럭을 항상 공급해야 했으나 AVR은 SRAM을 사용하여 클럭을 공급하지 않아도 내용이 유지된다. (0Hz)
전력소모를 줄이기 위해 CPU가 잠을 자는 sleep모드에서 SRAM은 내용이 유지되나 DRAM은 내용을 유지하기 위해 계속 리프레쉬용 클럭을 공급해야 하니 아무래도 전력소모가 늘 수 밖에 없다.
SRAM이란 데이터(변수, 상수)보관용 내부SRAM뿐만이 아닌 레지스터도 포함됨.

하단의 speed grade 참조. 0~16Mhz ATmega128

 

Datasheet p.3 Figure 2. Block Diagram을 보면…


ATmega128 MCU 내부회로가 어떻게 연결되어 있는가 블록다이어그램이 있다.
빨간 네모친 곳이 모두 core외의 주변장치로 AVR이 DRAM으로 구성되어 있다면 여러 장치를 제어하는 레지스터의 내용을 유지하기 위해 항상 클럭이 공급되야 해 전력소모가 늘어나나 SRAM으로 구성되어 있어 클럭을 공급하지 않아도 내용이 유지되니…
전력소모를 줄일 수 있어 큰 장점이라 할 수 있겠다.

 

//여기서 부터 자세한 설명은 나중에 –_-;


 

 

 

ADC한 값을 사인보간하여 DAC…
ADC가 녹음에 필요하다면 DAC는 재생시 필요한 회로..

 

 

 

 

 

 

 

 

 

 

 

 

프로그래머가 예상하지 못 한 코드의 결함이나 하드웨어적인 문제가 발생하였을 때,
WDT을 사용하여 초기상태로 돌림.

 

 

임베디드C p.18 p1-4.c Code를 disassemble하여 메모리의 opcode와 operand분석

 

프로젝트를 생성하여 length = 3; 명령줄에 F9키를 눌러 브레이크 포인트를 건 후…
F5키를 눌러 디버그 모드로 진입…

 

 

풀다운 메뉴 – Debug Windows – Disassembly를 선택하여 C Code를 Assembly Code로 보기

 

length = 3;이라는 명령줄의 어셈블리어는,
mov dword ptr [ebp-4], 3 이고,

그 어셈블리어와 1:1 매칭되는 기계어 코드(opcode)를 보려면…

 

메뉴 – Debug Windows - Memory를 클릭…

 

Address창에 mov dword ptr [ebp-4], 3 코드의 주소를 입력.

 

28번지와 2F번지의 차이는 7이므로 7Bytes만큼 차지한다는 것을 알 수 있으니..
상기의 메모리창에서,



28번지 부터 7Byte만큼만 보면 된다.

 

 
<출처: http://courses.engr.illinois.edu/ece390/resources/opcodes.html>

opcode의 구성이 어떻게 되어 있나 표를 보고 확인해보면...

length = 3; 이라는 C Code는 어셈블리어로 바꾸면,
mov dword ptr [ebp-4], 3 이고, 메모리창에서 확인한 기계어 코드를 나열해 보면,
C7 45 FC 03 00 00 00 이다.

이를 보기 좋게 2진수로 바꾸어 보면, (?) (기계가 보기 좋게)
1100 0111  0100 0101 1111 1100 0000 0011 0000 0000 0000 0000 0000 0000      ← 2진수
C      7        4      5      F      C      0      3      0      0      0      0      0      0         ← 16진수

C7은 쉽게 상기의 opcode표를 보면 확인할 수 있으나 w가 의문이고,
다음에 oo000mmm(0100 0101)이 무엇인지 모르니 찾아보자…


 

instruction위에 addressing-mode표가 있고,
좀 더 내려보면…


oo000mmm은 01000101이니 표를 보면..
SS : [EBP + disp8] 를 뜻한다.

SS는 SS레지스터를 뜻하고,
프로그램의 스택 세그먼트의 시작 주소를 나타낸다. SS세그먼트 레지스터의 내용에다. 스택 포인터 레지스터의 내용인 오프셋을 더하면 스택에서 참조하고자 하는 현재 워드의 주소를 나타낸다.

스택 포인터 레지스터라 하였는데 ESP를 뜻하는 것인지 EBP를 뜻하는 것인지 조금 헤깔린다.
다음에 EBP + disp8에서 EBP가 나오니 EBP를 뜻하는 것 같다.
disp8은 이 opcode 다음에 오는 8bit를 오프셋값으로 사용하겠다는 뜻이다.

다음에 오는 1Byte가 0xFC이다. 너무 큰 값인데 어떻게 된 것인가?


oo000mmm에서 앞에 oo는 01이니 부호있는 8bit 값이라는 것을 알 수 있다.
0xFC는 2진수로 1111 1100이고 최상위 비트가 1이니 음수이다.
즉, -4라는 것을 알 수 있다.

mov dword ptr [ebp-4], 3
stack영역 EBP에서 바로 위에 있는 공간에 3을 집어 넣으라는 명령이다.

 

 

 

(windows는 나중에)

//여기는 참조 복사

 

 

 

 

 

 

 

linux gdb를 사용해 opcode분석

 

 

-g옵션줘서 컴파일한 후 gdb로 디버그 진입…

 

list (또는 l)명령을 입력하여 소스코드를 확인한 후…
break (또는 b)명령을 입력하여 11행에 브레이크포인트를 건다.
확인은 info명령으로 하면 된다.

 

set disassembly-flavor intel 명령으로 AT&T어셈블리어 Code를 intel Code로 바꾼 후에..
disassemble(또는 disas)명령으로 main( ) 함수의 C Code를 disassemble한다.


0x08048406번지에 있는 mov DWORD PTR [ebp-4], 0x3  명령의 기계어 코드를 확인하려면…
x /7b main+6
x는 메모리내용덤프하는 명령이고 /7b은 다음에 오는 주소에서 7Bytes만큼 보여준다.
main + 6는 main함수의 시작주소로 부터 6만큼 떨어진 곳이라는 뜻이다.

VS6.0에서 디버깅한 결과와 같이 기계어 코드는 같다는 확인할 수 있다.


 

 

# objdump –d main.o 

objdump명령으로 쉽게 각 어셈블리어 1:1 대응하는 opcode를 쉽게 확인할 수 있다.
그러나 아쉽게도 intel포맷이 아닌 AT&T꺼다~ 아이 머리아파!
그래도 기계어는 동일하니 이번에는 별 문제없으나…

intel 어셈블 코드를 보려면...

 

#objdump –M intel –d main.o

-M intel옵션을 추가하면 intel방식 코드를 볼 수 있다.
opcode에 대해 자세히 알고 싶으면 아래의 링크를 클릭하면 된다.

opcode참조사이트 : http://courses.engr.illinois.edu/ece390/resources/opcodes.html

 

 

 

 

C과제9, 10풀이(임시 제목)

 

 

 

 

 

 

참조(Reference)

 

opcode참조사이트 : http://courses.engr.illinois.edu/ece390/resources/opcodes.html