< CortexM3 >
FTP -> 수업자료 -> Digtal ->CortexM3 복사 다운
um0462.zip
프로그램 올리는 용도
이제 컴파일러 다운
회원 가입 칸이 뜨는데 마구 갈겨서 회원 가입 후 다운.
다음 stm 홈페이지 간 뒤,
STM32F103ZE 검색 후, 클릭
1. 데이터 시트 다운
2. 레퍼런스 메뉴얼 다운
본격적으로 데이터 시트를 살펴보자.
우리가 쓰는 레퍼런스는 STM32F103xE
플래쉬 메모리의 구성.
무려...
사용 전압
저거 깔라고 계속 씨불씨불 거리는 거 같길래 그냥 깔아 버렸다
옆에 STM32F103ZE 장치명 클릭하고 나면 저거 세개 인스톨 - 업데이트 - 업데이트
예제소스 받아서,
컴파일러 이름 : MDK-ARM
프로젝트 파일로 확장명 바꾼뒤 저기 저 STM32_core.uvproj 파일 클릭
짠. 소스 등장
이건 겁나 비싼 (650만원 넘는 컴파일러) 기 때문에 과자 작업 실시
CID 복사 -> 붙여넣고 타겟 ARM 설정 -> MDK 프로페셔널 설정 -> generate -> 키가 나오면 복사 왼쪽에 붙여넣기
add lic 까지 해주면 끝.
다음 체크해봐야 할 것은 현재 타겟 설정.
output에 create hex file 에 체크가 되있는지 체킹
빌드 해봤을시 오류가 난다면 과자 작업이 제대로 되지 않았다는 것.
아까 말했던 프로그램 (hex 파일 올리는) 설치
설정 이대로
next
next
global erase : 그 전 펌웨어 소스를 지우기 위한 용도
.hex 파일 올리고
하이퍼 터미널로 실행
아주~ 잘 됨
<Assambly>
수업 핵심 내용!
1. public, extrn 프로시져
2. Stack에 사용하는 변수들( == 지역변수)
: 함수 호출 규약
- std call : 똥 싸고 안 치우는
- cdecl call : 똥 싸고 치우는
1. 이건 간단하다.
어제 마지막으로 다뤘던 소스로 예를 들자면,
PUBLIC을 안 붙여 준다면 다른 곳에서 접근이 불가능 해진다. ( == 외부 접근 가능 )
이 때 이 PUBLIC 으로 선언된 프로시져 들을 다른 외부 (.c) 에서 사용할 경우
EXTRN 이 붙는다.
2. 자 먼저, 책을 보며 설명하겠다.
212p 의 내용이다.
(Stack 영역)
지금 저 코드들이 main 의 상황이라고 친다면
처음 두 줄 push는 stack 영역으로 Value1 ==> esp - 4, ecx ==> (esp - 4) - 4
로써 스텍 포인터(esp)가 인자 값 대입으로써 -8Byte 만큼 이동하게 된다.
(함수 호출)
-> 여기서 함수 부분에 return 값이 없는 void 형 이라면 프로시져 라 명하고,
return 값이 있는 (ex> char, int ...) 애들인 경우 함수라 명한다. 라고 리촤드 c. 뎃뭐 가 책에 서술했다고 했다.
글쎄.. 아무튼
ASM == 프로시져
C == 함수
함수 이름과 같이 인자값들을 더 해 주는 간단한 예제로써 설명 하고 있음을 함수 이름으로 부터 유추해낼수 있겠고
실제 함수 내부 코드 모습을 그림으로 살펴보면,
자 코드를 보고 당황하지말고 자세히 살펴보자.
① push ebp ; save EBP
: 주석에 save EBP라 되 있는 것으로 보아 우리가 windbg 로 살펴본( call [프로시져] ) 부분에서 f11 로 디버그를 진행 했을 시 벌어지는 일( 돌아올 주소 값을 Stack영역에 저장하는 부분 )이라 보면 되겠다. [ ex> 2000번지 ] 즉, 현재 add2 프로시져의 시작 부분[ ex> 3000번지 ]에 이 주소값이 들어가게 되는 것 이다.
②mov ebp, esp ; establish stack frame
: 주석에.. stack 구조를 설립하다 라고 되어 있다. 미루어 짐작 해 보면 ebp에 함수 호출한 부분의 시작 주소 값을 넣 어 주겠다 라는 뜻이 될 것 같은 느낌 아닌 느낌 같은 너 가 된다. 이로써 ebp가 smart 함수의 시작 위치로 바뀌었다.
③mov ebp, esp ; copy second parameter value
: 주석에 두번째 매개 변수 값을 복사 한다. 라고 되어 있는데, 현재 ebp의 주소 값은 smart 함수의 시작 부분이다. ebp + 4 가 가르키는 곳은 return address 이고, ebp + 8 이 가르키는 곳은 바로 다름아닌 두 번째 인자값의 ecx 값이 들어가 있다. 그렇다면 ebp + 12 가 가르키는 곳은 첫 번째 인자 값이 되겠다. 자 분석 해 보자.
mov eax, [ebp + 8] ; 즉, 두 번째 인자 값을 eax 레지스터에 이동 시키고
④add eax, [ebp + 12] ; 첫 번째 인자 값은 add 시킨 다음 eax 레지스터에 저장한다.
자 ! 이제 add2 프로시져가 할 일은 모두 끝났다. 이제 복귀 하기 위한 작업이 개시 된다.
⑤pop ebp ; restore EBP
: 현재 스텍 포인터가 가르키는 곳은 아까 원래 ebp가 가지고 있던 주소값, 즉 원래 main의 ebp 주소 값이 저장되어 있다. 주석에도 나와 있다 싶히 원래의 ebp를 복구 시킨다 라는 코드 라인이다. 이렇게 되면 pop의 매커니즘에 의해 stack 영역 값을 ebp에 저장함으로써 ebp가 main의 시작부분으로 옮겨 가게 되고, pop 이므로 스텍 포인터가 + 4byte 이동하게 된다.
⑥ ret ; return
: ret 는 코드로 풀어 나타내 보면 pop eip 로 나타낼 수 있겠다. 즉, eip( 다음 실행할 주소 )에 리턴 주소를 넣고 pop 이므로 +4로 이동하게 되면 스텍 포인터는 결론적으로 add2 프로시져의 호출 부분의 두 번째 인자 값으로 돌아오게 된다. 여기서 인자가 몇개인지만 안다면 거기서 add esp, [인자 숫자 * 4byte] 만 해준다면 스텍 포인터는 처음 원래 위치로 돌아가게 된다.
와 엄청난 메카니즘이 아닐 수 없다.
그림을 그리며 하는게 무조건 옳다. 무조건.
특히나 이 부분은 내가 그림으로써 표현 하고 싶었지만.. 도저히 엄두가 나질 않았고 시간이 오래 걸릴꺼 같아 굳이 글로써 주저리주저리 설명했다. 글로써도 충분히 그림이 그려지므로 이해가 안되신 분들은 글을 보며 주쌤이 설명해주신 그림 그대로 그려보며 이해하는 것이 수월하겠다.
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151012-김재홍-어셈블리_Context Switching (9) | 2015.10.13 |
---|---|
20151008 - 김성주 - M3 : RCC / 어셈블리 : pushad를 이용한 구조체 삽입 (6) | 2015.10.08 |
20151007 - 권오민 - GPIO&AFIO / ASSEMBLY(C와 링크하기) (3) | 2015.10.07 |
201501006 - 2번 강동조 (오전: GPIO -LED 오후: ) (5) | 2015.10.06 |
2015.10.02 천정호 업무일지 - Assembly (7) | 2015.10.05 |
20150930-주재민-일일업무일지-어셈블리 (7) | 2015.10.01 |
20150930-26번-임현수-일일업무일지-취업특강, 어셈블리 loop 명령 (6) | 2015.10.01 |
20150925-23번-이량경-일일업무일지-ASM {jum, cmp}/ 적외선 온도 감지 센서 (6) | 2015.09.30 |