본문 바로가기
코스웨어/15년 스마트컨트롤러

20151030 - 홍준모 오전 : UART 이용. 오후 : 사물 인터넷 (라즈베리파이), 어셈블리

by 알 수 없는 사용자 2015. 10. 30.
728x90
반응형

오전

- 취업 상담 때문에 조금 듣다가 말았습니다 -


















오후

<사물 인터넷 수업.>


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를 스트링 명령의 실행 횟수로 세트하여야 한다.

) MOVSB100회 실행하려면 다음과 같이 한다.

MOV CX, 100

REP MOVSB

REP의 두 가지 변형된 형태

- REPE : CX0이 아닌 동안 그리고 비교되고 있는 바이트나 워드가 같은 동안에 반복된다.

- REPNE : CX0이 아닌 동안 그리고 비교되고 있는 바이트나 워드가 같지 않은 동안에 반복된다.

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


728x90