'전체보기'에 해당되는 글 126건

  1. 2009.05.06 [어셈블리어] data 세그먼트와 bss 세그먼트
  2. 2009.05.06 [C언어] 부호 확장(Sign extension)
  3. 2009.05.04 티스토리에 UNIQLOCK 설치하기 2
  4. 2009.05.01 아쉬운 종영 - 라이프 시즌2 21화(Life.S02E21)
  5. 2009.04.30 멘탈리스트 정주행 시작
  6. 2009.04.30 [C언어] 구조체의 메모리 저장방식과 #pragma pack
  7. 2009.04.30 PDF 복사 방지 해제 프로그램 PDFProtectMgr 1
  8. 2009.04.28 KMPlayer 2.9.3.1428 마지막 버전 2
  9. 2009.04.28 [ATmega128] RS232 시리얼 통신 관련 레지스터 정리
  10. 2009.04.24 [ATmega1128] ATmega128은 Little endian일까 Big endian일까 2
2009. 5. 6. 17:15

[어셈블리어] data 세그먼트와 bss 세그먼트

segment .data
msg    db    "Hello world", 0

segmen .bss
input    resd    1

위의 어셈블리어 코드를 보면, 두가지의 세그먼트를 선언하는 것을 볼 수 있다.

data segment에는 initialized data segment(초기화 된 데이터 세그먼트)와 uninitialized data segment(초기화 되지 않은 데이터 세그먼트)가 있는데 segment .data는 전자, segment .bss는 후자를 가르킨다.

즉, segment .data 에서는 초기값이 필요한 전역변수를 선언하고, segment .bss에서는 초기화가 필요없는 전역변수를 선언한다.

segment .bss에서는 RAM에 해당 영역만큼의 공간만을 잡아준다. 하지만 segment .data에서는 RAM을 할당할 뿐만 아니라 해당데이터의 초기 값을 지니고 있을 ROM또한 할당되어야 한다.

따라서, bss영역은 초기화 과정에서 컴파일러에서 지정한 초기화 방식에 의하여 초기화되며, data부분은 ROM에 있는 초기화된 데이터를 해당 data영역으로 복사함으로서 수행하게 된다.

즉, 위의 소스를 해석하면

msg라는 변수에 "Hello world\0"

2009. 5. 6. 15:53

[C언어] 부호 확장(Sign extension)



결과는 다음과 같다.



int형 b에 같은 -1을 대입했는데 왜 결과 값은 다르게 나올까.

그 이유는 부호 확장에 있다.

int b = a 에서 a는 char 형이기 때문에, 묵시적인 형변환이 발생하게 되는데 이때, char형 데이터인 a를 바로 int형 데이터 b에 넣는 것이 아니라 a를 4바이트 크기로 확장을 하게 된다.

1바이트에서 4바이트로 확장을 하면서 나머지 빈 공간에는 음수면 1로 채우고 양수면 0으로 채우게 된다.

따라서 (signed) char 인 a변수는 앞에 1을 채워서 FFFFFFFF가 되고, unsigned char 인 c변수는 앞에 0을 채워서 FF가 되는 것이다.
2009. 5. 4. 18:24

티스토리에 UNIQLOCK 설치하기

사람 멍때리게 만드는 걸로 유명한 UNICLOCK

티스토리 사이드 바에 설치하는 방법을 알아보자.

일단 UNIQLOCK 홈페이지에 접속한다. <http://www.uniqlo.jp/uniqlock/>


LOCAL TIME 에는 자신의 지역을 설정하자. 서울 이외에도 부산 대구 광주등이 있다.
SIZE에는 LARGE와 SMALL이 있는데 티스토리 사이드바에는 작은 크기가 더 어울리니 small로 하자.
MUSIC은 원하는데로...

다 설정했으면 하단의 SET을 클릭하면 오른쪽에 주소가 생성되는 것을 볼 수 있다. COPY를 누르면 클립보드에 복사되서 붙여넣기가 가능해진다.

이제 티스토리 관리에 들어가자.

플러그인 설정의 아래쪽에 보면 관리 및 통계    태그 입력기가 있다. 미사용이면 사용으로 바꿔주자.

이제 스킨 - 사이드바 설정에 가면, 사용 가능 모듈 - 플러그인 - 태그 입력기가 생성 된것을 알수 있다. 클릭하고 편집에 들어가서 아까 복사한 주소를 넣어주고, 원하는 위치에 드래그해서 설치해주면 끝.


이제 블로그에서 멍때릴 수 있게 되었다=ㅅ=
2009. 5. 1. 23:10

아쉬운 종영 - 라이프 시즌2 21화(Life.S02E21)


라이프가 종영되었다.
그것도 다음 시즌의 계약 없이 완전히 종영되었다.

사실 21화는 3주전에 한거지만 잊고 있다가(요즘 보는게 너무 많아서;) 우연히 생각나서 미루뒀던거 몰아서 보게되었는데, 아무런 정보도 없이 보고 있다가 "어? 이거 갑자기 스토리가 급진전되지?"라는 생각이 들더니 그대로 끝나버렸다-_-;

그렇게 인기가 많은 드라마가 아니란 것은 알고 있었지만, 그래도 나름 선전하고 있다고 들었는데 이렇게 끝나버려서 무척 아쉽다. 그것도 조기 종영 비슷하게 끝나버리고...


이제 더이상 망고맨을 볼 수 없는 것인가 ㅠㅠ

이 아래쪽은 많은 스포일러를 담고 있으니 21화를 본사람만..
그리고 무척 스압이 심함(..)

'미드' 카테고리의 다른 글

8월 25일판 가을시즌 각종 드라마 시작날짜  (1) 2009.09.04
멘탈리스트 정주행 시작  (0) 2009.04.30
2009. 4. 30. 20:55

멘탈리스트 정주행 시작


MENTALIST 명사. 정신적인 예리함, 최면 혹은 암시를 이용하는 사람

...이라고 설명이 되있어서 네이버 영어 사전을 찾아봤는데 mentalist라는 단어는 없었다-_-;

여튼 새롭게 정주행을 시작하게 된 미드

사실 원맨 중심의 드라마는 하우스외에는 그다지 좋아하지 않았는데, 요즘 볼게없어서 그랬는지 점점 재미를 붙여가는 중이다.


주인공 패트릭 제인. 전직 사이비심령술사 였으며, 현재는 CBI(캘리포니아 수사국)에서 고문을 맡고 있다. 이 친구는 한마디로 얘기하면 눈치 100만단쯤 되는 친구. 눈으로 보이는 모든 정보를 조합하여 보이지 않거나 숨겨진 사실들을 추론해내는 능력이 아주 뛰어난 친구이다.


어디서 많이 본 배우 같지 않은가. 바로 프리즌 브레이크에서 링컨씨 여친이자 변호사 베로니카였던 그분이다=ㅅ=;
(누군가 줄여서 배변이라고 부른다고 하던데ㄷㄷ)
멘탈리스트에서는 CBI의 팀장을 맡고 있다.


아직 시즌1 9화까지 밖에 보지 못해서 많은 평가를 내리기는 어렵지만, 일단 재미는 있는 것 같다. 다만, 조연들이 이야기 상에서 비중이 적은 것은 아니지만 사건해결에 있어서는 비중이 적다고 할 수 있는 것이 조금 아쉽다.

개인적으로 가장 좋아하는 수사물인 넘버스는 수학 천재가 나오기는 하지만 단지 천재가 모든 것을 해결하는 이야기가 아니라 천재주인공은 수사에 조언을 줄 뿐이고, 수사 진행은 FBI이 주도권을 잡고 진행한다.

물론, 제목부터 멘탈리스트이고, 멘탈리스트인 주인공 위주로 사건을 풀어나가는 것이 당연하고, 그게 매력인 드라마지만. 이런 점은 하우스랑 비슷한 것 같다.


여하튼, 자세한 감상평은 정주행을 마친 후에 포스팅하도록 하겠다.
2009. 4. 30. 17:25

[C언어] 구조체의 메모리 저장방식과 #pragma pack

구조체는 메모리에 어떤 식으로 저장될까
다음과 같은 소스를 보자.


TEST 구조체 변수인 TData는 char형 데이터(1byte), short형 데이터(2byte), int형 데이터(4byte)를 가지고 있으므로 1+2+4=7byte의 크기를 가질 것 처럼 보인다. 하지만 이 소스를 컴파일하고 실행을 해보면 다음과 같은 결과가  나온다.



분명히 cData(1) + sData(2) + iData(4) = 7임에도 불고하고 TData의 크기는 8바이트라고 하니 참 이상한 일이다.

이는 현재 우리가 쓰는 32비트 컴퓨터에서 32비트 컴파일러를 사용하였기 때문에 32비트 즉, 4바이트로 데이터를 처리하는 것에 가장 최적화되어 있기 때문에 데이터를 4바이트 공간으로 저장하기 때문이다.

이 TData란 구조체는 8바이트에 다음과 같이 저장되어 있다.

cData
??
sData
sData
iData
iData
iData
iData

cData를 저장하고, 4바이트중에 3바이트가 남아있기 때문에 sData를 3바이트 중에 2바이트의 공간에 저장하고,
iData를 저장하려 하니 1바이트밖에 남아있지 않기 때문에 4바이트의 공간을 따로 만들어 저장하게 되는 것이다.

그럼 이제 위의 소스에서 변수 선언의 순서를 한 번 바꿔 보자.



변수 선언의 순서를 바꿨을 뿐인데 신기하게도 같은 구조체의 크기가 8에서 12로 늘어나버렸다.
이 TData 구조체 변수는 다음과 같이 저장되어 있을 것이다.

cData(1byte)
empty(3byte)
sData(2byte)
empty(2byte)
iData(4byte)

이처럼 컴파일러는 4바이트에 맞춰서 데이터를 저장하는 것을 볼 수 있다. 이것을 막으려면 어떻게 해야할까.

이것을 해결하려면 #pragma pack() 이라는 전처리어를 사용하면 된다.
구조체 하나를 더 추가한 다음 소스를 보자.



#pragma pack(1)에서 1은 1바이트 단위로 저장하겠다는 것이다. 따라서 TData와 TData2의 내용물은 같으나 크기는 다른 것을 확인할 수 있다.

 그렇다면, 왜 모두 1바이트로 해서 메모리의 낭비가 없도록 하지 않는 것일까?
 그것은, 아까도 이야기하였듯이 32비트 CPU에서는 4바이트(32비트)의 단위로 데이터를 처리하는 것이 가장 빠르게 때문이다. 즉, #pragma pack(1) 이라고 선언해놓고 원래대로 돌려놓지 않는다면 속도저하의 문제가 생길 수 있다.
 따라서, 위의 소스에서 구조체 선언이 끝나는 부분에 #pragma pack(4)라고 선언해주어 할 것이다.

 하지만, 여기에도 문제가 있다.
 만약, 이 소스를 32비트의 PC가 아닌 다른 CPU가 장착된 장비에서 컴파일하게 된다면 어떻게 될 것인가. 예를 들면 임베디드 시스템 같은 8~16비트 CPU에서 말이다.
 소스를 일일히 찾아서 CPU에 맞게 고쳐주고 다시 컴파일해야 되는 불편함과 어려움이 생기게 된다.

 이럴때를 위해서 좀 더 우아하게 쓰는 코드가 있다.



 기존의 바이트를 스택에 push하고 1바이트 단위로 처리한다음 끝나는 부분에 원래의 바이트 단위를 pop해주는 코드이다. 보통은 이렇게 사용하면 되겠다.

 pragma에는 다른 용도(warning을 표시하지 않게 한다던가하는 기능들)도 있지만, 이는 다음에 알아보도록 하자.
2009. 4. 30. 15:54

PDF 복사 방지 해제 프로그램 PDFProtectMgr


 PDF 파일 중에 긁어서 복사하기가 금지 되어있는 파일을 해제해주는 프로그램이다.
설치가 필요없으면 바로 실행가능하다. 또한 반대로 락을 걸어 줄 수도 있다.


1에서 Browse를 클릭하고 pdf파일을 선택한 다음에 2에서 remove protection을 선택하고 아래쪽에 Start를 클릭하면 락을 해제해준다.
2009. 4. 28. 17:02

KMPlayer 2.9.3.1428 마지막 버전


 최고의 동영상 플레이어로 평가받는 KMPlayer가 판도라로 인수되기 전 마지막 업데이트 버전
 곰플레이어는 저사양 컴퓨터에서 고화질 동영상 재생시에 소리밀림등의 버벅거림이 생길 수 있지만,
 KMPlayer는 잘 재생한다.
 그 외에도 사용자 입맛에 맞게 여러가지 설정을 해줄수 있는 최고의 동영상 플레이어.
 판도라에 인수되어 만들어진 버전이 찝찝하다는 사람들은 이걸 사용하자.(본인도 찝찝해서 이걸씀)


2009. 4. 28. 11:50

[ATmega128] RS232 시리얼 통신 관련 레지스터 정리

USARTn I/O Data Register - UDRn

 RXBn[7:0]
 TXBn[7:0]

n은 ATmega128에는 두개의 레지스터가 있으므로, 0과 1로 두개를 구별한다.(ex. UDR0, UDR1)
데이터를 쓸 때는 TXBn에, 읽을 때는 RXBn에서 읽는다.


USART Control and Status Register A - UCSRnA

 RXCn TXCn
UDREn
FEn
DORn
UPEn
U2Xn
MPCMn

7bit - 2bit : Status      1bit - 0bit : Control
RXCn : USART Receive Complete
 - 이 레지스터는 수신버퍼(UDRn)에 읽지 않은 데이터가 있으면 1, 수신버퍼가 비어있으면 0이 된다.
TXCn : USART Transmit Complete
 - 송신 시프트 레지스터에 있는 송신 데이터가 모두 송신되고 UDRn의 송신 버퍼에 아직 새로운 데이터가 Write되지 않은 상태이면 1이 된다. 즉, 시프트 레지스터와 송신 버퍼 둘다 비었을 때. 송신 완료 인터럽트를 발생시킬 때 사용.
UDREn : USART Data Register Empty
 - 송신버퍼에 새로운 데이터를 받을 준비가 되어 있으면 1로 set. 즉. 송신 버퍼가 비었을 때.
FEn : Frame Error
 - 수신 버퍼에서 데이터를 수신하는 동안 프레임 에러가 발생하면 1로 set.
DORn : Data OverRun
 - 수신 동작에서 오버런 에러가 발생하였음을 나타내는 상태 플래그.
 오버런 에러 : 수신 버퍼에 현재 읽지 않은 수신 문자가 들어와있는 상태에서 수신 시프트 레지스터에 새로운 데이터 문자가 수신 완료되고 다시 그 다음 수신 데이터인 3번째 문자의 스타트 비트가 검출되면 발생.(즉, 시프트 레지스터에서 데이터가 완전히 전송되지 않았는데 새로운 데이터가 덮어버릴 때)
UPEn : Parity Error
 - 수신 버퍼로 부터 데이터를 수신하는 동안 패리티 에러가 발생하였음을 알리는 플래그.
U2Xn : Double the USART Transmission Speed
 - 비동기 모드에서만 사용 가능하며, 클럭의 n분주비를 16에서 8로 1/2만큼 낮추어 전송속도를 2배 높이는 기능을 한다.
MPCMn : Multi-Processor Communication Mode
 - USARTn을 멀티 프로세서 통신모드로 설정하고, 멀티 프로세서 통신 어드레스 정보를 포함하지 않는 모든 수신 데이터는 수신부에 의해 무시된다.


USARTn Control and Status Register B - UCSRnB

 RXCIEn TXCIE
UDRIEn
RXENn
TXENn
UCSZn2
RXB8n
TXB8n

RXCIEn : RX Complete Interrupt Enable
 - 수신 완료 인터럽트를 발생시키는 플래그
TXCIE : TX Complete Interrupt Enable
 - 송신 완료 인터럽트를 발생시키는 플래그
UDRIEn : USART Data Register Empty Interrupt Enable
 - USARTn 데이터 레지스터가 비어있다는 인터럽트를 발생시키는 플래그
RXENn : Receiver Enable
 - 수신기를 활성화한다.
TXENn : Transmitter Enable
 - 송신기를 활성화한다.
UCSZn2: Character Size
 - UCSZn1~0 비트와 함께 전송 문자의 데이터 비트수를 설정하는데 쓰인다.
RXB8n : Receive Data Bit 8
 - 수신할 때 9번째 비트를 받을지를 결정하는 플래그
TXB8n : Transmit Data Bit 8
 - 송신할 때 9번째 비트를 보낼지를 결정하는 플래그


USART Control and Status Register C - UCSRnC

-
 UMSELn UPMn1
UPMn0
USBSn
UCSZn1
UCSZn0
UCPOLn

UMSELn : USART Mode Select
 - 0: 비동기 모드
 - 1: 동기 모드
UPMn1, UPMn0 : Parity Mode
 - 00: 패리티모드를 사용하지 않음
 - 01: 사용하지 않는 플래그
 - 10 : 짝수 패리티
 - 11 : 홀수 패리티
USBSn : Stop Bit Select
 - 정지 비트 설정
 - 0 : 1bit,    1: 2bit
UCSZn1, UCSZn0 : Character Size
 - UCSZn2와 함께 전송 문자의 데이터 비트수를 설정
 UCSZn2 UCSZn1
UCSZn0
Chacter Size
0
0
0
5-bit
0 0
1
6-bit
0
1
0
7-bit
0
1
1
8-bit
1
0
0
사용안함
1
0
1
사용안함
1
1
0
사용안함
1
1
1
9-bit
UCPOLn : Clock Polarity
 - 동기모드에서만 사용하는 플래그로 0이면 송신 데이터는 XCKn 클럭의 상승 에지에 새로운 값이 출력되고, 하강 에지에 수신데이터가 검출된다. 1이면 반대로 출력과 검출이 된다.


USART Baud Rate Registers - UBRRnL and UBRRnH

UBRRnH
7 - 4 bit reserved(사용안함)
UBRRn[11:8]
UBRRnL
                                                                    UBRRn[7:0]

 - UBRRn11 - 0 : USART Baud Rate Register
12비트를 이용하여 USARTn의 보울(Baud rate)을 결정하는데, UBRRnH 3비트와 UBRRnL의 8비트가 조합을 하여 사용한다.
2009. 4. 24. 17:50

[ATmega1128] ATmega128은 Little endian일까 Big endian일까

이를 확인하기 위해 다음과 같은 프로그램을 작성하였다.



 소스 코드를 보면 2바이트 int형 데이터를 선언하고(atmega128에서 int형은 2바이트),
1바이트 포인터로 주소값을 저장하였다.

 만약, Big endian이라면 0x12가 먼저 출력되고 3초뒤에 0x34가 출력될테고,
Little endian이라면 0x34가 먼저 출력되고 3초뒤에 0x12가 출력될 것 이다.

 키트를 연결시킨후 hex파일을 전송 시켜보았다.





 여기서 켜지는 것이 0이고, 불이 들어오지 않은 것이 1이다.
위의 사진에서 00110100으로 출력되고 3초뒤의 모습인 아래 사진에서 00010010으로 출력되는 것을 알 수 있다.
즉, 0x34 -> 3초뒤 ->0x12로 출력되는 것이다.

 따라서, 0x1234가 34, 12 의 순으로 역순으로 저장되어있기 때문에 Little endian방식으로 메모리에 저장하는 것을 알 수 있다.