오전
- 취업 상담 때문에 조금 듣다가 말았습니다 -
오후
<사물 인터넷 수업.>
MMU는 쉽게 말하자면 가상 주소를 만들어 주는 것이다.
안전을 위해 진짜 주소를 가짜주소로 바꾸어 주는 것이다.
운영체제는 왜 태어 났을까?
운영체제는 리소스관리이다. 하드드라이버 마우스 키보드 등을 관리하기 위함이다.
메모리의 주도권을 자신이
arm 할 때 레지스터가 ㄴ저무 많으니까 기준되는 레지스터만 써놓고 쭈욱 존재한다라고 써놓은 것 처럼 책에서도 이와같이 정의 되어 있다.
alt0 ~ alt5로 기능이 나뉘어져 있다. 우리가 예전에 봤던 그 예고편 수업때 언급 하셨었던
이것과 같은 내용이다. 라즈베리 파이의 칩도 ARM 칩이다. 신기하당
ex ) alt 0 모드 -> PWM0 - GPIO12
alt 5 모드 -> PWM0 - GPIO18
아트메가든 암이든 다 내부적으로 스위치가 존재한다. 무슨 말이냐면 방금 말한 것처럼의 기능으로 간에 붙었다 쓸개붙었다 할 수 있는 것이다.
우리 데이터 시터보면 핀 마다 TX, PWM 이렇게 쭉 써놓은 것을 볼 수 있는데 하드웨어적으로 내부적으로 스위치가 존재하고 설정해주는 소프트웨어 모드에 따라서 간에 붙었다 쓸개에 붙었다를 할 수 있는 것이다.
Tx는 Input MOSI, MISO 는 Clk 까지 존재한다면 그 자체가 SPI가 된다.
pwm을 이용하기 위해 BCM 라이브러리를 설치하여야 한다.
저대로 해주면 라즈베리 2 용 BCM 라이브러리가 설치된다.
그런 다음 책(441p)에 나와 있듯이,
쭉쭉쭉 해주고,
코드 치고
실행 하면 아주 잘된다.
<어셈블리>
반복하는 prefixes가 3개가 있다. 명령어인데 왜 프리픽스라 부르느냐. 명령어가 두개이다. 전 처리라 생각하면 된다. 프리픽스. 즉 뒤에있는 명령어를 앞에서 수정해 준다.
rep : 뒤의 스트링 명령을 (E)CX가 0이 될때까지 반복. (E)CX는 1씩 감소.
-> 명령어를 반복적으로 수행하는 기능 (모든 명령어에서 사용 할 수 있는 것은 아니다.)
-> 반복 수행은 ECX와(반복 카운터 용도의 레지스터) 연관이 있다.
이동 명령어가 아닌 다른 내용을 반복할 때에 zero flag를 건들일 수도 있다. 그럴때엔 따로 rep 명령어가 제공 된다.
책에 길게 기술 되어 있는 것은 돌 때 ecx 체크하는 것과 zero 체크하는 것이 두가지가 있는데 이걸 언제 체크 하냐 ? 라는 것이다.
ecx : 뺄셈을 실행하기 전에 체크한다. 즉, ecx 값을 먼저 체크하는 것이다. zero 플래그는 한단계 수행 후에 zero flag 값을 체크한다.
ex) c 언어 표현
int a = 2;
.
.
.
while ( a > 0 ) // ecx
{
if (a == 0) // zero 플래그
{
break;
}
}
repz, repe : Zero Flag가 1이고, ecx > 0인 동안 명령어 반복
repnz, repne : Zero Flag가 0이고, ecx > 0인 동안 명령어 반복
rep 리피트, ECX랑 맞물려서 내부 루틴에 자동으로 빼주는 루틴까지 있다라는 것을 예제를 통해 확인 할 수 있었다.
★ 5개의 기본 스트링 명령은 각각 바이트 단위 또는 워드 단위로 작업한다. 스트링 전체를 처리하려면 한 번에 한 바이트씩 또는 한 워드씩 처리하는 스트링 명령을 계속 반복하여 사용해야 한다.
★ 스트링 명령을 반복하여 사용하려면 REP(repeat) 명령을 그 스트링 명령의 바로 앞에 쓰면 된다.
REP MOVSB
★ REP를 사용하려면 먼저 CX를 스트링 명령의 실행 횟수로 세트하여야 한다.
예) MOVSB를 100회 실행하려면 다음과 같이 한다.
MOV CX, 100
REP MOVSB
★ REP의 두 가지 변형된 형태
- REPE : CX가 0이 아닌 동안 그리고 비교되고 있는 바이트나 워드가 같은 동안에 반복된다.
- REPNE : CX가 0이 아닌 동안 그리고 비교되고 있는 바이트나 워드가 같지 않은 동안에 반복된다.
★ REPE = REPZ, REPNE = REPNZ 이다.
* repne / repnz / repe / repz -- repne / repnz (Repeat while Nat Equal/Zero) 문자열 처리 명령을 cx 레지스터의 값만큼 또는 zf이 1이 될때까지 (즉, 문자나 값이 서로 다를 경우-zf가 0인 경우-에는 cx 값안에서 반복한다) 반복 실행시킨다. repnz과 repne명령은 서로 동일한 명령이다. 명령 종료 후 cx의 값은 반복 실행된 횟수만큼 감소한다. -- repe / repz (Repeat while Equal/Zero) 문자열 처리 명령을 cx 레지스터의 값만큼 또는 zf의 값이 0일 때까지 반복 수행시킨다. repe와 repz는 서로 동일한 명령이다. 명령 종료후 cx의 값은 반복 수행된 횟수만큼 감소한다.
<예제 소스>
; program to search for one string embedded in another
; author: R. Detmer revised: 10/97
.386
.MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
INCLUDE io.h
cr EQU 0dh ; carriage return character
Lf EQU 0ah ; linefeed character
.STACK 4096 ; reserve 4096-byte stack
.DATA
prompt1 BYTE "String to search? ", 0
prompt2 BYTE cr, Lf, "Key to search for? ", 0
target BYTE 80 DUP (?)
key BYTE 80 DUP (?)
trgtLength DWORD ?
keyLength DWORD ?
lastPosn DWORD ?
failure BYTE cr,Lf,Lf,"The key does not appear in the string.",cr,Lf,0
success BYTE cr,Lf,Lf,'The key appears at position'
position BYTE 11 DUP (?)
BYTE " in the string.", cr, Lf, 0
PUBLIC _start ; make entry point public
.CODE
_start:
output prompt1 ; ask for
input target, 80 ; and input target string
lea eax, target ; find length of string
push eax ; length parameter
call strlen
mov trgtLength, eax ; save length of target
output prompt2 ; ask for
input key, 80 ; and input key string
lea eax, key ; find length of string
push eax ; length parameter
call strlen
mov keyLength, eax ; save length of key
; calculate last position of target to check
mov eax, trgtLength
sub eax, keyLength
inc eax ; trgtLength Ð keyLength + 1
mov lastPosn, eax
cld ; left to right comparison
mov eax, 1 ; starting position
whilePosn:
cmp eax,lastPosn ; position <= last_posn?
jnle endWhilePosn ; exit if past last position
lea esi, target ; address of target string
add esi, eax ; add position
dec esi ; address of position to check
lea edi, key ; address of key
mov ecx, keyLength ; number of positions to check
repe cmpsb ; check
jz found ; exit on success
inc eax ; increment position
jmp whilePosn ; repeat
endWhilePosn:
output failure ; the search failed
jmp quit ; exit
found:
dtoa position, eax ; convert position to ASCII
output success ; search succeeded
quit:
INVOKE ExitProcess, 0 ; exit with return code 0
strlen PROC NEAR32
; find length of string whose address is passed on stack
; length returned in EAX
push ebp ; establish stack frame
mov ebp, esp
pushf ; save flags
push ebx ; and EBX
sub eax, eax ; length := 0
mov ebx, [ebp+8] ; address of string
whileChar:
cmp BYTE PTR [ebx], 0 ; null byte?
je endWhileChar ; exit if so
inc eax ; increment length
inc ebx ; point at next character
jmp whileChar ; repeat
endWhileChar:
pop ebx ; restore registers and flags
popf
pop ebp
ret 4 ; return, discarding parameter
strlen ENDP
END
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151106 출석번호 9번 김태현 비트맵파일 분석 (7) | 2015.11.06 |
---|---|
디바이스 드라이브 예제 소스파일 (3) | 2015.11.05 |
20151104 2번 강동조[커널 빌드와 디바이스 드라이버] (5) | 2015.11.05 |
20151102-김재홍-라즈베리파이_C프로그래밍&ASM_Translation (6) | 2015.11.02 |
2015-10-29 업무일지 천정호 (3) | 2015.10.30 |
20151028-업무일지-주재민 (3) | 2015.10.28 |
천정호 Task Switching (미완성) (0) | 2015.10.28 |
20151027 윤재희 task switching 소스 (0) | 2015.10.28 |