어제 16진법 에 대해서 설명하고 끝났을 거야
이번엔 8051 마이크로 콘트롤러가 뭔지 알아 보자고 .
8051이 뭐냐면 - 원칩 마이크로 컴퓨터의 일종이야. 기억장치를 내장하고 있지.
그러니까 하나의 독립된 컴퓨터로써 하나의 제어 대상을 위한 제어기로 사용되고 있지.
8051의 메모리는 내부 메모리와 외부 메모리로 구분하여 이해 해야되 이것이 8051을 사용할때 가장 중요한 부분중 하나이지.
내부 메모리는 프로그램 메모리와 데이터 메모리로 또 나뉘어지지.
8051 칩에 내장되어 있는 메모리는 이렇게 되있어
-128 byte 의 내부 메모리 (램)
(1)프로그램 메모리
4K byte 의 프로그램 메모리 (롬)을 제공하지 ,프로그램 메모리로 사용할 수 있는 용량은 64Kb 이고 내부 롬을 사용할 때는 하위4k의 영역을 할당받게되.
(2)데이터 메모리
128 바이트의 데이터 램 영역 (주소 00H~7FH)
128 특수기능 레지스터(*SFR,80H ~ FFH)
여기서 또 데이터 램은 또 3개로 분할되 ... 존나 어렵네..
4개의 8바이트 범용 레지스터 뱅크(32바이트, 00H ~ 1FH)
16 바이트 비트 어드레서블 영역 (20H ~ 2FH)
범용 램 영역 (30H~7FH)
(뭐 그냥 외우는 수밖에 없을거 같어 ...)
그럼 위에 있는 SFR이 뭔지 설명할게.
SFR의 영역의 레지스터들은 CPU가 작업을 수행하면서 그 결과를 저장하기도 하고 작업을 수행하기 위한 방법을 지정하기도 해.
SFR을 분해 해보면 이렇게 또 나뉘어져 .
ACC - 어큐뮤레이터, 산술논리 연산의 중심이 되고
B 레지스터 - 범용 레지스터고 곱하고 나눗셈 하는데 써.
DPTR - 데이터 포인터 레지스터고 DPH와 DPL 로 구성되, 16 비트를 8비트 씩 나누어 가지는거고. 외부메모리에 대한 어드레스 포인터로 사용하지.
PSW - 프로그램 상태어라고 하고 범용 레지스터 뱅크 지정 및 산술연산에 사용해
SP - 스택 포인터이고 최종적으로 데이터가 저장된 스택 영역의 주소를 지정하지.
진짜.... 어렵네 ㅡㅡ..
외부메모리..
원칩 마이크로 컴퓨터에는 칩에 내장된 메모리 용량이 좀 부족하거든.. 그래서 메모리를 확장해야되.
필요에 따라서 롬 아니면 램을 부가적으로 사용해서 프로그램 메모리와 데이터 메모리를 각각 64 Kb 로 사용할 수 있지.
너무 깊이 파고들면 나도 뭔소리인지도 모르겠고 읽는 사람도 머리아프니까 이정도로만 간단하게 구조만 쓸게.
이제 8051 명령어를 설명할게 ㅋㅋㅋ 드디어 어셈블리어가 나오는군.
그전에 미리 알아둬야 할게있어
무슨 숫자앞에 #이 붙으면 그냥 그건 데이터 값이야 이미디어트 상수라고 하지 , 쉽게 말해서 그냥 숫자라는 거지
#이 없어, 그냥 숫자만 붙이면 그건 주소를 말하는거야 , 3AH 는 3A 번지라고 해석하면되.
단, 이미디어트 상수에서 AFH 같은 문자로된 숫자는 문자앞에 0을 붙여 주어야되, #0AFH 처럼.
@ - 액트라고 읽는데 이건 간접주소 지정 방식이야 @가 쓰이는 주소는 R0 R1 DPTR 이것밖에 못쓰는 걸로 알고 있어.
나머지 설명할게 있으면 쓰면서 말할게.
이제 본론으로 넘어가서 데이터 전송명령으로 넘어가지.
MOV - 그냥 무브라고 읽으면 되 뜻을 간단하게만 쓸게 MOV는 여기다 저장해~ 라고 생각하면 될거야,
MOVX - 8051하고 외부 데이터 메모리 사이에 데이터를 전송하려고 써
MOVC - 프로그램 메모리에서 데이터를 읽는 데 쓰지.
기본으로 MOV <dest>,<src>로 표현을해.
<dest>는 어디다 저장할 것인가 ? <src>는 무엇을 저장할 것인가 라고 보면되
그럼 예를 들어 ㅡ MOV 3AH,#2BH 를 어떻게 해석하면 될까?
답은 간단해 3AH 번지에 2BH라는 데이터를 저장하세요. 라는 뜻이야
그럼 두번째, ㅡ MOV 3BA,4AH 는 어떻게 해석을 할까?
두번째 위치는 분명 주소인데 어떻게 주소에다가 주소를 저장하지?
이런 의문이 들 수가 있어. 하지만 답은 간단해,
3BA 번지에다가 4AH번지가 가지고 있는 데이터를 저장하세요, 라고 해석하면 되 .
마지막으로 MOV DPTR,#1234H 는 무엇이라고 해석을 할까?
물론 DPTR에 1234H를 저장하라는 것은 맞아, 그런데 좀더 자세히 보면
DPTR은 DPH와 DPL로 나누어져있다 그랬지 그리고 8비트씩 나누어 가진다 했잖아.
그러니까 DPH에 12H DPL에 34H 가 저장되는 거지.
쓰는 것도 힘드네 다음에는 PSW에 따라 범용 레지스터 주소가 어떻게 되는지 써볼게,
아, MOVX 랑 MOVC 도 같이 .. ㅋㅋ
ㅂㅂ
컴공과
BK27
c도 프로그래머 그다지 편의 제공이 안되어있는데
자바랑 c++가 좀 낫고
유입종자들이 중고딩이 많아져서 그래
C로 더하기 빼기 하니까 존나 만만해보이지 ㅋㅋㅋㅋㅋㅋㅋ
밀덕
씨발 자바를 해야하는데 C/C++만 존나하고 안해서 다잊어먹었ㅌ어
컴공과
Intellect
음..나중에 복수전공으로 공학분야도 할꺼라 미리 알아두면 좋을거같아서 질문남김.
마이스터
그런데 처리속도가 중요 하든지 C언어같은데서 지원하지 않는 기능이 있다고해 그럴때 어셈블리어를 쓰거든.
펌웨어나 임베디드 같은곳에도 쓰이고.
또, 어셈블리어 같은경우 기계어라 배우기도 어렵고 사용하는 사람도 적어서 회사에서 대우를 해준다 하네..
C언어를 배우기 위해서 구지기 어셈블리어를 배울 필요까지는 없어...허지만 같이 공부해도 나쁠건 없지.
밀덕
JAVA같은걸 사용시엔 접근을 못한다고 알고있음
고게이
이걸 분석해서 핵이나 여러가지 장난을 칠 수 가 있어
실행파일을 디스어셈블해서 어셈블 코드로 복원할 수 있어
또 어셈블 코드를 c언어로 다시 복원할 수가 있고
이걸 이용해 너가 메모리에 너가 원하는 코드로 삽입하면
소위 말하는 핵을 만들 수 있지
여기서 디스어셈블을 하기 위해서 어셈블리를 알아야 하고
더 low level인 기계어까지 알고 있어야 되
개발쪽도 어셈블리가 중요시 여겨지는 분야가 있는데
메스메티카, 대용량 데이터베이스, 검색 엔진, 게임과 같이 속도가 생명인 작업이야
여기서 게임이 중요한데 실제로 속도를 향상시키기 위해
c에서 일부 느린 연산을 어셈블리로 바꿔서 코딩하기도 해
너가 생각하기에 이게 불편하고 low level이라 어려울지 몰라도
같은 연산을 해도 속도가 10배이상 차이나는 경우도 있어
물론 debug mode 대신 relase mode로 하면 그 차이가 줄어들지만
어셈블리 언어가 c보다 훨씬 빠르지
c가 어셈블리 코드로 바꿔주는 listing file은 보면 c가 얼마나 비효율적인 걸 느끼게 될거야
이런 속도차이를 줄여주는 컴파일러가 있는데 개인이 사기에는 너무 비싼 컴파일러가 있긴 하지
김겟똥
어셈블리어를 미친듯이 파는거면 모를까(말이 쉬워 맨날 미친듯이 파는거지, 그런놈 주변에서 한놈도 못봤다)
학부생이 씨 배우면서 곁다리로 공부한 정도의 매우 낮은 어셈블리어 숙련도로도 해결할 수 있는 작업이 있다면,
그런 작업이 있는 곳에서 굳이 어셈블리어를 써서 문제를 해결할 턱이 없다고 생각함.
== 씨 배우다 곁다리로 공부할 정도의 어셈블리어를 쓸 수 있는곳은 없음
밀덕
Pajix
음란서생
밥아저씨
잉텔
잉텔