▲ 위와 같이 실행 코드를 일시 중지시키는 기능의 '브레이크포인트'



실행 중인 디버깅 대상 프로세스를 멈추게 하려면 브레이크 포인트를 설정한다. 브레이크포인트에 의해 프로세스가 일시 중지되면 중지된 시점의 변수나 스택 파라미터, 특정 메모리 위치의 값들을 조사해 볼 수 있다. 프로세스를 디버깅할 때 가장 흔히 사용하는 기능이 바로 브레이크포인트다. 브레이크포인트는 세 가지 종류가 있는데, 1) 소프트 브레이크포인트, 2) 하드웨어 브레이크포인트, 3) 메모리 브레이크포인트다. 세 가지 브레이크포인트 모두 유사한 동작을 수행하지만 구현되는 방법은 완전히 다르다.


1) Soft Breakpoint (소프트 브레이크포인트)

2) Hardware Breakpoint (하드웨어 브레이크포인트)

3) Memory Breakpoint (메모리 브레이크포인트)












레지스터는 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 레지스터

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









▲ 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 






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) 블럭 피하기 게임에서 '점프' 기능을 구현.








| 태그 설명을 위한 일반 규칙


HTML 태그들은 필요에 따라 여러 가지 효과를 적용할 수 있는데 이것을 속성(attribute)이라고 한다. 속성은 시작하는 태그 안에 한 칸을 비우고 사용한다. 또한 태그의 각 속성들은 속성에 변화를 주기 위한 값이 필요한데 = 기호로 속성값을 부여한다. 속성값이 빈칸으로 구분된 두 단어라면 " "로 감싸서 값을 부여한다. 하나의 단어라도 " "로 감싸서 사용할 수 있다.


예시:

<meta http-equiv="Content-Type" content="text/html">

<태그 속성=속성값 속성=속성값...>





| 헤드(<head>) 부분에 작성해야 할 태그들


HEAD 태그는 웹 문서의 본문에 나오는 내용이 아니라 웹 문서에 대한 설명 부분이다. TITLE, META 등의 태그를 포함할 수 있다.


(1) TITLE 태그


브라우저의 제목표시줄에 나타나는 웹 문서의 제목이 들어간다. 정보검색 엔진에서 사용자의 검색어가 title 태그 내에 있으면 정확한 웹 문서로 인정하여 결과 목록 중에서 앞쪽에 위치하게 된다. 따라서 정보검색 엔진에 홈페이지를 등록할 떄 적절한 제목을 사용하는 것이 좋다.


<head>
<title>This is a title.</title>
</head>


(2) META 태그


문서의 작성자, 날짜, 주요 단어 등 웹 브라우저의 내용에는 나타나지 않는 웹 문서의 일반 정보를 나타날 때 사용한다.


▼ 속성 및 속성값


 <meta name=author|keywords|content>

 작성자, 핵심어, 요약

 <meta content="문자열">

 각 name의 값

 <meta http-equiv=refresh>

 해당문서를 새롭게 고침


<meta name="Author" content="맛난 양갱">
<meta name="Keywords" content="HTML 마크업 언어">
<meta name="Content" content="HTML 기본 기초에 대한 지식을 다룹니다.">




| 바디(<body>) 부분에 작성해야 할 태그들


웹 문서의 실제 내용을 표현한다. HEAD에 포함되는 태그를 제외한 모든 태그들을 포함한다. 이하에서 설명할 모든 태그들은 BODY 태그 안에 놓인다. 


▼ 속성 및 속성값


<body background="URL"> 

 브라우저의 배경화면에 나타날 이미지 파일의 URL 지정

<body bgproperties=lixed>

 배경화면 이미지는 고정시키고 내용들만 스크롤

<body bgcolor="색상값">

 브라우저의 배경화면 나타날 색상 지정

<body text="색상값">

 문자의 색상 지정(영어 색상이름이나 RGB 값)

<body link="색상값">

 링크의 색상 지정(영어 색상이름이나 RGB 값)

<body vlink="색상값">

 방문한 링크의 색상 지정(영어 색상이름이나 RGB 값)

<body alink="색상값">

 선택한 링크의 색상 지정(영어 색상이름이나 RGB 값)



<body bgcolor=yellow text=black link=blue vlink=red alink=green>


► 홈페이지의 배경화면은 노란색, 문자는 검은색, 링크는 파란색, 방문한 링크는 붉은색, 선택한 링크는 녹색으로 지정된다.


<body background="image.png" bgproperties="fixed">


► 홈페이지의 배경화면은 지정한 이미지 파일로 설정하고 내용이 많아 스크롤 할 때, 이미지는 고정된 상태에서 내용들만 움직이게 한다.


※ bgcolor와 background 속성을 동시에 쓰게 되면 나타난 순서에 관계없이 background 속성을 우선 적용한다.

※ BODY 태그의 TEXT 속성값은 본문 내에서 색상 변경이 없으면 본문 글자 전체에 영향을 미친다.






| HTML에서 한글이 깨진다?


  웹 개발의 기본이 되는 HTML을 처음 공부하시는 많은 분들이 제일 처음 마주하는 문제가 아닐까 싶은데요. 초보 웹개발 학생분들이 html 파일을 작성 중 한글을 사용할때마다 다음과 같이 한글깨짐 현상을 마주하시곤 하죠.


▲ 머리를 지끈지끈하게 하는 HTML에서의 한글 깨짐!




HTML에서 한글이 깨질 때 다음 코드를 HTML 코드 맨 위에다가 쓰시면 해결이 됩니다.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ko"  xml:lang="ko">
<meta http-equiv="Content-Type" Content="text/html; charset=utf-8" />



+ Recent posts