레지스터는 CPU의 작은 저장 공간으로 CPU가 데이터에 접근하는 가장 빠른 방법을 제공한다. x86 명령 셋에서 CPU는 8개의 범용 레지스터(EAX, EDX, ECX, ESI, EDI, EBP, ESP, EBX)를 사용한다. CPU에는 그 밖에도 다른 레지스터들이 있지만, 이 8개의 범용 레지스터가 요구되는 경우에 대해서만 살펴보자. 8개의 범용 레지스터는 CPU가 명령을 효과적으로 처리할 수 있도록 각기 용도에 맞게 설계됐다. 따라서 각 레지스터가 어떻게 사용되는지 이해하는 것이 중요하다.



EAX 레지스터는 어큐뮬레이터 레지스터(Accumulator Register)라고도 부르며, 산술 연산을 수행하기 위해 사용되거나 함수의 리턴 값을 전달하기 위해 사용된다. x86 명령 셋에서 최적화된 많은 명령이 데이터 계산과 저장으 위해 EAX 레지스터를 사용하게 설계됬다. 즉, 더하기, 빼기, 비교 연산 같은 대부분의 기본적인 연산이 EAX 레지스터를 사용하게 최적화됐다. 또한 곱하기나 나누기 같이 좀 더 특화된 연산의 경우는 EAX 레지스터 내에서만 수행될 수도 있다. 


앞에서 설명했듯이 함수의 리턴 값은 EAX 레지스 내에서만 수행될 수 있다. 따라서 EAX에 저장된 값을 조사하면 호출한 함수가 성공했는지, 실패했는지 여부를 쉽게 판단할 수 있으며, 함수가 반환한 리턴 값이 무엇인지 알 수 있다.



EDX 레지스터는 데이터 레지스터(Data Register)이다. 이 레지스터는 기본적으로 EAX 레지스터의 확장 개념으로 사용된다. 즉, 곱하기나 나누기 같이 복잡한 연산을 위해 추가적으로 데이터를 저장할 때 사용된다. EDX 레지스터는 범용 목적의 저장소로도 사용된다. 하지만 대부분의 경우 EAX 레지스터와 함께 연동해서 수행되는 연산에 사용된다.



ECX 레지스터는 카운터 레지스터(Counter Register)라 불리며, 반복적으로 수행되는 연산에 주로 사용된다. 반복 연산에서는 문자열을 저장하거나 카운트를 세는 작업이 수행된다. 그런데 중요한 점은, ECX 레지스터는 값을 증가시키면서 카운트를 세는 것이 아니라 값을 감소시키면서 카운트를 센다는 점이다. 다음의 간단한 파이썬 코드를 살펴보자.


counter = 0

while counter < 10:
	print "Loop number: %d" % counter
	counter += 1


위 코드를 어셈블리 언어로 변환해보면 카운트 값을 나타내는 ECX 레지스터의 값이 첫 번째 반복 연산을 수행할 때는 10이고, 두 번째 반복 연산을 수행할 때는 9로 감소한다는 점을 알게 될 것이다. 그런데 위 파이썬 코드에서의 카운트 값은 증가되는 방향으로 작성되어 있다. 이는 다소 혼동을 줄 수 있는데, 어셈블리 언어에서의 카운트 값은 항상 감소하는 식으로 동작한다는 점을 기억하면 혼동되지 않을 것이다.


x86 어셈블리 언어에서 데이터를 처리하는 반복문에서는 효과적으로 데이터를 처리하기 위해 ESI 레지스터와 EDI 레지스터를 사용한다. ESI 레지스터는 데이터 연산을 위한 원천지 인덱스(Source Index)를 나태내거나 입력 데이터 스트림의 위치를 나타내기 위해 사용된다. EDI 레지스터는 데이터 연산의 목적지 인덱스(Destination Index)를 나타내거나 데이터 연산의 결과가 저장되는 위치를 나타내는 데 사용된다. ESI 레지스터는 읽기 위해 사용되고 EDI 레지스터는 쓰기 위해서 사용된다고 생각하면, ESI, EDI 레지스터의 용도를 좀 더 쉽게 기억할 수 있을 것이다. 이처럼 데이터 연산에 인덱스 레지스터를 사용함으로써 프로그램의 실행 성능이 상당히 향상된다.


ESP 레지스터EBP 레지스터는 각기 스택 포인터(Stack Pointer)와 베이스 포인터(Base Pointer) 레지스터이다. 이 레지스터들은 함수 호출과 스택 연산에 사용된다. 함수가 호출될 때 먼저 함수에 전달되는 파라미터가 스택에 PUSH되고 그 다음에는 리턴 주소가 스택에 PUSH된다. ESP 레지스터는 스택의 가장 높은 위치를 가리킨다. 따라서 함수 호출시 ESP 레지스터는 리턴 주소를 가리킨다. EBP 레지스터는 호출 스택의 가장 낮은 위치를 가리키는 데 사용된다. 경우에 따라서는 컴파일러가 코드 최적화를 위해 스택 프레임 포인터로 사용되는 EBP 레지스터의 사용을 제거하는 경우도 있다. 이런 경우에는 EBP 레지스터를 다른 범용 레지스터와 동일한 용도로 사용한다.


EBX 레지스터는 특정한 목적으로 설계된 레지스터가 아니다. 따라서 추가적인 저장소로 이 레지스터를 사용한다.


또 하나의 특별한 레지스터로는 EIP 레지스터가 있다. 이 레지스터는 현재 실행 중인 명령의 주소를 가리킨다. CPU가 바이너리 코드를 실행시킴에 따라 EIP 레지스터는 CPU가 현재 어느 코드를 실행시키고 있는 중인지 나타내기 위해 계속적으로 실행되는 코드의 주소를 갱신한다.


디버거는 레지스터의 값을 읽거나 변경할 수 있어야 한다. 각 운영체제는 디버거가 CPU와 상호 작용하고 레지스터의 값을 읽거나 변경할 수 있는 인터페이스를 제공한다. 





< 요약 >

EAX 레지스터

: Accumulator Register, 산술 연산을 수행 or 함수의 리턴 값을 전달.

EDX 레지스터

: Data Register, EAX와 함께 복잡한 연산을 위한 추가적인 데이터를 저장할 때 사 용

ECX 레지스터

: Counter Register, 반복적으로 수행되는 연산(반복문)에 사용됨. 반복 연산에서 문자열을 저장하거나 카운트를 셈.


ESI 레지스터/ EDI 레지스터

: ESI레지스터는 Source Index를 나타내고, EDI 레지스터는 Destination Index를 나태낸다. 데이터 연산을 읽기 위해서 ESI 레지스터가 사용되고, 데이터 연산을 쓰기 위해 EDI 레지스터가 사용된다.


ESP 레지스터

: 특정한 목적은 없음. 레지스터의 일반 목적인 저장소로 쓰임.


EIP 레지스터

: 바이너리 코드 실행 중에 현재 실행되고 있는 명령의 주소를 가리킨다.





윈도우의 Eclipse와 Mac에서의 Eclipse는 큰 차이가 나는 것은 아닙니다. 하지만, 메뉴 바의 구성이 살짝 다르기 때문에, 흔히들 윈도우 Eclipse를 기준으로 설명하는 경우, Mac Eclipse랑은 메뉴 구성이 달라서 당황한 경험이 많을 것입니다.


보통, 윈도우에서는 Help > Software Updates > Find and Install 메뉴 등을 클릭하여 진행하는 반면,


맥에서는 다음과 같은 과정을 통해서 플러그인을 설치할 수 있습니다.



1. 메뉴바에서 'Help' 클릭 (단축키: 커맨드 + 쉬프트 + /)



2. 'Help' 탭에서 'Install new software' 클릭!




3. 새롭게 뜬 창에서 'Add..' 버튼을 클릭!




4. 또 새롭게 뜨는 창에서, Name 필드와 Location 필드를 원하는 플러그인에 맞게 작성 후 'OK' 버튼을 클릭한다. (제가 설치할 플러그인은 파이썬 어플리케이션 개발을 위한 PyDev 플러그인 입니다.)




5. 원하는 플러그인을 체크, 그리고 'Next'를 누른다.




6. 이후에 설치 세부사항등에 대한 이야기가 나오는데, 계속해서 'Next' 버튼을 누르고, 마지막에 라이센스를 확인하는 창이 뜨게 된다.

이 때, 반드시 라이센스에 동의한다는 표시에 체크를 하고 'finish' 버튼을 누른다.



7. 끝입니다.



간단하죠? 맥에서도 이클립스 플러그인 설치 어렵지 않게 쉽게 할 수 있습니다!! 






▲ Raspberry Pi 의 모습 (모델 B)



그림과 같이 라즈베리 파이는 싱글보드 컴퓨터인 만큼 CPU, GPU, 메모리, 입출력 장치를 모두 가지고 있는 완전한 PC다. 메인 칩으로는 700Mhz으로 동작하는 ARM11을 코어로 한 Broadcom의 BCM2835 SoC 멀티미디어 프로세서를 탑재하고 있다. 이는 CPU, GPU, RAM, 오디오, USB, GPIO 기능을 수행한다. 또한,USB허브 및 랜(LAN) 컨트롤러를 담당하는 LAN9512 칩을 사용하여 네트워크와 기타 장비를 제어하고 있다. BCM2835는 H.264 화상 압축용 프로세서와 3D 그래픽 엔진도 탑재되어 있어서, 1080p(1920x1080) Full HD 화상도의 멀티미디어 재생이 특징이다. 또한, ARM11(ARM1176JZ-F)는 RISC(Reduced Instruction Set Computer) 아키텍처를 채택하고 있기 때문에 소비전력이 매우 적은 것도 특징이다.



▼ 모델 A와 B의 외관상 차이




▼ 라즈베리파이 모델별 스펙 정리 표


 

 모델 A 

 모델 B 

 가격

 25 USD

 35 USD 

 SoC(System on Chip)

 Broadcom BCM2835 SoC

 CPU

 700Mhz Low Power ARM1176JZ-F 

 CPU

 Dual Core VIdeo Core IV 

 메모리

 256MB SDRAM

 512MB SDRAM 

 내장메모리 

 SD, MMC, SDIO 

 이더넷 

 없음 

 10/100 이더넷 RJ45 잭 

 USB 포트 

 1 개 

 2 개 

 비디오 출력 

 HDMI, 컴포지트 RCA, LCD 연결을 위한 DSI 포트 

 오디오 출력

 3.5mm 오디오 출력단자 및 HDMI 

 기타기능 

 GPIO, I2C, SPI, 카메라 연결을 위한 CSI 포트 

 운영체제 

 Linux(Raspbian, Arch Linux ARM, RISC OS 등) 

 전원

 MicroUSB 포트를 통한 5V 전원공급 

 전력

 500mA(2.5W)

 700mA(3.5W)

 크기

 8.6 x 5.4 x 1.5 cm 

 8.6 x 5.4 x 1.7 cm 








  이베이, 아마존과 같은 해외 사이트에서 물건을 구입하려고 할 때, 우리나라 돈이 아니라 엔화/미화 등으로 표기가 되어 있어서 정확하게 한국 가격이 어느 정도 되는지 궁금했던 경우가 많을 겁니다. 물론, 아래와 같이 네이버/구글에 들어가서 그 가격을 검색창에 치기만 해도 되고, 아니면 간단하게 암산을 통해서(미화 환율은 1달러/1000원, 엔화 환율은 1엔/10원 정도) 간략한 추정도 할 수 있을 것입니다. 





하지만, 강력한 기능의 오토메이터를 이용해 정확한 환율 계산 결과를 바로 확인할 수 있다면 어떨까요? 


이번 포스팅에서는 '엔화/미화 환율 계산하기'에 대한 서비스를 만드는 오토메이터 도큐멘트를 만들어볼까 합니다.






| 엔화(미화) 환율 계산하기 서비스


  오토메이터로 간단한 '네이버 영어사전 찾기' 서비스를 만들어본 분들이라면 이번 내용도 그리 어렵지 않을 것입니다. (솔직하게 말해서, 한 80퍼센트는 내용이 동일합니다.) 이번 오토메이터 도큐멘트의 개요는 다음과 같습니다. 


AppleScript -> 웹 사이트 팝업

1) AppleScript 처리: 입력받은 텍스트(브라우저에서 드래그한 숫자)를 네이버 검색 주소에 집어넣고 주소값을 반환한다.

2) 웹 사이트 팝업 모듈이 AppleScript단계에서 반환된 주소값으로 주소를 이동, 그 결과를 보여준다.



1. 도큐멘트 유형을 '서비스'로 선택한다.


2. 서비스가 받는 선택 항목은 '텍스트'로, 선택 항목 위치는 'Safari.app'으로 한다. (다른 브라우저에서도 적용시키려면 선택 항목 위치를 변경하면 된다.)


3. 작업공간에 'AppleScript 실행' 과 '웹 사이트 팝업' 모듈을 놓는다.


4. AppleScript 실행 모듈에 다음과 같은 AppleScript를 입력합니다.


on run {input, parameters}

return "http://search.naver.com/search.naver?query=" & (input as string) & ""

end run


5. '웹 사이트 팝업 모듈'에서 사이트 크기는 '사용자화'(여러분 원하는 크기대로), '사용자 에이전트'는 'iPhone', 출력은 '입력 URL'로 한다.


※ 웹 사이트 팝업 모듈에서 항목들을 여러분이 원하시는대로 바꾸셔도 됩니다. 하지만, 사용자 에이전트는 iPhone으로 할 것을 추천드립니다. 사이트 크기가 제한적일 경우, 사용자 에이전트를 Safari로 하게 되면, 한눈에 결과 값이 안 보일 수 있습니다. (스크롤 해야 합니다.)



▼ AppleScript로 workflow를 다 작성한 후, 

사파리에서 오른쪽 클릭 > 서비스 탭에서 다음과 같이 '엔화 환율 계산하기' 탭을 확인할 수 있습니다.




▼ 이렇게 한눈에 팝업창으로 환율 계산 결과를 확인할 수 있어요 :)




※ 미화 환율 계산하기는 안 가르쳐주냐구요? 여러분이 눈썰미가 조금만 있다면, 

어떻게 해야 할지 답은 여러분 머릿속에 바로 있을 것입니다. 

정말 모르시겠습니까?... 흠... 위 AppleScript에서 '엔'을 'USD'로 바꾸시기만 하면 됩니다.


HBE-MCU-All in One 에서 '블럭 피하기 게임'을 구현하였고, 그를 동영상 촬영하였습니다.






블럭 피하기 게임(부제: 미니언 러쉬)


사용한 모듈: 2x16 Text LCD, 2Color DotMatrix, Push Button, Piezo


1) 밑에 초록색 바가 움직이게 하여 내려오는 빨간색 블럭을 피하게 함. 

2) 초록색 바에는 '점프' 기능이 있음. 점프 기능을 이용해서 빨간색 블럭을 피하는 것도 가능함.

(점프하고 있는 중이면 주황색으로 바뀌게 됨. 실제로 초록색+빨간색 = 주황색이 되므로, 그냥 점프하는 모습도 주황색으로 보여지고, 빨간색 블럭들을 넘어서 점프하고 있는 모습도 주황색으로 보이게 됨.)

3) 시간이 지남에 따라 레벨이 오르고 점수도 오르게 됨. 레벨이 오를 수록 내려오는 빨간 블럭의 속도나 숫자도 더 많아짐.

4) 빨간 블럭과 부딪혀서 죽게 되는 경우, 2Color DotMatrix 모듈이 전체 빨간색으로 점멸하게 되며 실패 음악이 나옴.

5) 중간에 Pause를 누르게 되면 2Color DotMatrix 모듈이 전체 주황색으로 표시됨. 


※ 특이사항


1) 버튼들을 누르거나 특정 액션에 대해서 소리를 낼 수 있도록 Piezo 모듈을 사용함.

2) 블럭 피하기 게임에서 '점프' 기능을 구현.






| 간단하게 기부를 받고 싶다면 Paypal을 이용하세요!



  은행 이름과 계좌번호를 공유해 기부를 받는 것도 가능하겠지만, 계좌번호 같은 경우 일종의 개인 신상 정보 중 하나이므로 공유하기에 껄끄러울 수 있습니다. 이럴 때, 'Paypal'(페이팔)을 이용해서 기부를 쉽게 받는 방법이 있다고 합니다. 



▲ 위와 같은 사진을 만들어서 기부 받기 버튼을 만들 수 있습니다.







| Paypal 기부 스크립트 받기



1. Paypal 회원 가입 후 Profile > Add/Edit Bank Account 를 클릭합니다.





2. 상세 정보들을 기입합니다. 그리고 'Continue'를 눌러 진행합니다.


- Bank Name: 은행명을 영문으로 적어야 합니다. 여기를 참조해주세요.

- Account Number: 계좌번호를 적어야 합니다. 14자까지 기입 가능합니다.

- National ID: 주민등록번호를 적어야 합니다.




3. 그리고 'Create Paypal payment button' 단계에서, 원하는 내용을 기입하고 'Create Button'을 클릭합니다.


- Organization name/services 에는 조직의 이름이나 서비스의 이름등을 적으면 됩니다.

- Donation ID 는 말그대로 기부를 받을 아이디입니다. 원하는 아이디를 적으면 됩니다.




4. 다음과 같이 소스 코드가 생성됩니다. 소스 코드를 그대로 복사하여 HTML 소스 코드에 붙이면 됩니다.






+ Recent posts