현 직장에서 SH1106을 사용하게 되었는데.
 보드가 설정되었던게 Arduino 라이브러리에서 핀 번호로 할당되지 않는 핀이 적용된 상태이다.(Atmel 2560)
 하지만, Adafruit_SH1106의 라이브러리에선 생성자에서 수정이 되는 제품이 없는 것이다.
 
1
2
3
4
5
6
class Adafruit_SH1106 : public Adafruit_GFX {
 public:
  Adafruit_SH1106(int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS);
  Adafruit_SH1106(int8_t DC, int8_t RST, int8_t CS);
  Adafruit_SH1106(int8_t RST);
}
cs

 생성자를 보면, SID(슬레이브 ID)와 SCLK(시리얼 통신 클럭 핀), DC(데이터/컨트롤 핀), RST(리셋 핀), CS(칩 셀렉트 핀)을 설정하도록 되어 있다.
 그리고, 이 설정된 핀의 번호를 보고 해당 레지스터의 위치를 찾아서 수정하도록 되어 있는 상태인데.
 이것이 불만족스러웠다.(특히, 지금 Atmel 2560의 데이터를 전부 다 사용하도록 만든 보드를 사용하는 회사 보드 입장에선 라이브러리가 불만인 상황...)

1
2
3
4
    csport      = (PortReg*)portOutputRegister(digitalPinToPort(cs));
    cspinmask   = digitalPinToBitMask(cs);
    dcport      = (PortReg*)portOutputRegister(digitalPinToPort(dc));
    dcpinmask   = digitalPinToBitMask(dc);
cs

 그래서, 해당 라이브러리에서 레지스터를 다이렉트로 연결해서 사용하도록 만들어 봤다.(굳이 이렇게 하지 않고, 해당 핀 번호 혹은 레지스트 연결하는 하위 함수를 아시는 분들은 매크로를 사용해서 수정하면 된다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  /*
   @function : setCsPort
   @arg : PortReg* port(레지스트의 동작을 설정하는 변수)
   @arg : PortReg* portOpen(레지스트 초기화 하기 위한 변수)
   @arg : csPin(값 설정)
  */
  void setCsPort(PortReg* port, PortReg* portOpen, uint8_t csPin);
 
  
 
  /*
   @function : setDcPort
   @arg : PortReg* port(레지스트의 동작을 설정하는 변수)
   @arg : PortReg* portOpen(레지스트 초기화 하기 위한 변수)
   @arg : csPin(값 설정)
  */
  void setDcPort(PortReg* port, PortReg* portOpen, uint8_t dcPin);
 
  
 
  /*
   @function : setRestPort
   @arg : PortReg* port(레지스트의 동작을 설정하는 변수)
   @arg : PortReg* portOpen(레지스트 초기화 하기 위한 변수)
   @arg : csPin(값 설정)
  */
  void setRestPort(PortReg* port, PortReg* portOpen, uint8_t restPin, bool rest = true);
 
  
 
  /*
   @function : init
   @설명 : 
   begin()의 함수를 다시 재설정하기 위해서 동작 시키는 함수.
  */
  void init(uint8_t switchvcc = SH1106_SWITCHCAPVCC, uint8_t i2caddr = SH1106_I2C_ADDRESS);
cs

이렇게 header파일를 수정했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
void Adafruit_SH1106::setCsPort(PortReg* port, PortReg* portOpen, uint8_t mask)
{
    csport = port;
    *portOpen |= mask;
    cspinmask = mask;
}
 
void Adafruit_SH1106::setDcPort(PortReg* port, PortReg* portOpen, uint8_t mask)
{
    dcport = port;
    *portOpen |= mask;
    dcpinmask = mask;
}
 
void Adafruit_SH1106::setRestPort(PortReg* port, PortReg* portOpen, uint8_t mask, bool rest)
{
    restport = port;
    *portOpen |= mask;
    restpinmask = mask;
    
    if(rest)
    {
        *restport |= restpinmask;
        delay(1);
        *restport &= ~restpinmask;
        delay(10);
        *restport |= restpinmask;
    }
}
 
void Adafruit_SH1106::init(uint8_t vccstate, uint8_t i2caddr)
{
    sid = 0;
    hwSPI = true;
    
    if (hwSPI){
        SPI.begin ();
        #ifdef __SAM3X8E__
            SPI.setClockDivider (9); // 9.3 MHz
        #else
            SPI.setClockDivider (SPI_CLOCK_DIV2); // 8 MHz
        #endif
    }
    #if defined SH1106_128_32
    // Init sequence for 128x32 OLED module
    SH1106_command(SH1106_DISPLAYOFF);                    // 0xAE
    SH1106_command(SH1106_SETDISPLAYCLOCKDIV);            // 0xD5
    SH1106_command(0x80);                                  // the suggested ratio 0x80
    SH1106_command(SH1106_SETMULTIPLEX);                  // 0xA8
    SH1106_command(0x1F);
    SH1106_command(SH1106_SETDISPLAYOFFSET);              // 0xD3
    SH1106_command(0x0);                                   // no offset
    SH1106_command(SH1106_SETSTARTLINE | 0x0);            // line #0
    SH1106_command(SH1106_CHARGEPUMP);                    // 0x8D
    if (vccstate == SH1106_EXTERNALVCC)
    { SH1106_command(0x10); }
    else
    { SH1106_command(0x14); }
    SH1106_command(SH1106_MEMORYMODE);                    // 0x20
    SH1106_command(0x00);                                  // 0x0 act like ks0108
    SH1106_command(SH1106_SEGREMAP | 0x1);
    SH1106_command(SH1106_COMSCANDEC);
    SH1106_command(SH1106_SETCOMPINS);                    // 0xDA
    SH1106_command(0x02);
    SH1106_command(SH1106_SETCONTRAST);                   // 0x81
    SH1106_command(0x8F);
    SH1106_command(SH1106_SETPRECHARGE);                  // 0xd9
    if (vccstate == SH1106_EXTERNALVCC)
    { SH1106_command(0x22); }
    else
    { SH1106_command(0xF1); }
    SH1106_command(SH1106_SETVCOMDETECT);                 // 0xDB
    SH1106_command(0x40);
    SH1106_command(SH1106_DISPLAYALLON_RESUME);           // 0xA4
    SH1106_command(SH1106_NORMALDISPLAY);                 // 0xA6
    #endif
 
    #if defined SH1106_128_64
    // Init sequence for 128x64 OLED module
    SH1106_command(SH1106_DISPLAYOFF);                    // 0xAE
    SH1106_command(SH1106_SETDISPLAYCLOCKDIV);            // 0xD5
    SH1106_command(0x80);                                  // the suggested ratio 0x80
    SH1106_command(SH1106_SETMULTIPLEX);                  // 0xA8
    SH1106_command(0x3F);
    SH1106_command(SH1106_SETDISPLAYOFFSET);              // 0xD3
    SH1106_command(0x00);                                   // no offset
    
    SH1106_command(SH1106_SETSTARTLINE | 0x0);            // line #0 0x40
    SH1106_command(SH1106_CHARGEPUMP);                    // 0x8D
    if (vccstate == SH1106_EXTERNALVCC)
    { SH1106_command(0x10); }
    else
    { SH1106_command(0x14); }
    SH1106_command(SH1106_MEMORYMODE);                    // 0x20
    SH1106_command(0x00);                                  // 0x0 act like ks0108
    SH1106_command(SH1106_SEGREMAP | 0x1);
    SH1106_command(SH1106_COMSCANDEC);
    SH1106_command(SH1106_SETCOMPINS);                    // 0xDA
    SH1106_command(0x12);
    SH1106_command(SH1106_SETCONTRAST);                   // 0x81
    if (vccstate == SH1106_EXTERNALVCC)
    { SH1106_command(0x9F); }
    else
    { SH1106_command(0xCF); }
    SH1106_command(SH1106_SETPRECHARGE);                  // 0xd9
    if (vccstate == SH1106_EXTERNALVCC)
    { SH1106_command(0x22); }
    else
    { SH1106_command(0xF1); }
    SH1106_command(SH1106_SETVCOMDETECT);                 // 0xDB
    SH1106_command(0x40);
    SH1106_command(SH1106_DISPLAYALLON_RESUME);           // 0xA4
    SH1106_command(SH1106_NORMALDISPLAY);                 // 0xA6
    #endif
    
    #if defined SH1106_96_16
    // Init sequence for 96x16 OLED module
    SH1106_command(SH1106_DISPLAYOFF);                    // 0xAE
    SH1106_command(SH1106_SETDISPLAYCLOCKDIV);            // 0xD5
    SH1106_command(0x80);                                  // the suggested ratio 0x80
    SH1106_command(SH1106_SETMULTIPLEX);                  // 0xA8
    SH1106_command(0x0F);
    SH1106_command(SH1106_SETDISPLAYOFFSET);              // 0xD3
    SH1106_command(0x00);                                   // no offset
    SH1106_command(SH1106_SETSTARTLINE | 0x0);            // line #0
    SH1106_command(SH1106_CHARGEPUMP);                    // 0x8D
    if (vccstate == SH1106_EXTERNALVCC)
    { SH1106_command(0x10); }
    else
    { SH1106_command(0x14); }
    SH1106_command(SH1106_MEMORYMODE);                    // 0x20
    SH1106_command(0x00);                                  // 0x0 act like ks0108
    SH1106_command(SH1106_SEGREMAP | 0x1);
    SH1106_command(SH1106_COMSCANDEC);
    SH1106_command(SH1106_SETCOMPINS);                    // 0xDA
    SH1106_command(0x2);    //ada x12
    SH1106_command(SH1106_SETCONTRAST);                   // 0x81
    if (vccstate == SH1106_EXTERNALVCC)
    { SH1106_command(0x10); }
    else
    { SH1106_command(0xAF); }
    SH1106_command(SH1106_SETPRECHARGE);                  // 0xd9
    if (vccstate == SH1106_EXTERNALVCC)
    { SH1106_command(0x22); }
    else
    { SH1106_command(0xF1); }
    SH1106_command(SH1106_SETVCOMDETECT);                 // 0xDB
    SH1106_command(0x40);
    SH1106_command(SH1106_DISPLAYALLON_RESUME);           // 0xA4
    SH1106_command(SH1106_NORMALDISPLAY);                 // 0xA6
    #endif
 
    SH1106_command(SH1106_DISPLAYON);//--turn on oled panel
}
 
cs

추가한 함수를 정의한 내용.
이렇게 사용하여, 다음과 같은 방식으로 추가하면, 제대로 동작을 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <Adafruit_GFX.h>
 
#include <Adafruit_SH1106_changes.h>
 
#define OLED_RESET -1
 
//Adafruit_SH1106 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
 
Adafruit_SH1106 display(OLED_RESET);
 
void setup()   {
 
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
 
  display.begin(SH1106_SWITCHCAPVCC);
 
  
 
  // init done
 
  display.setCsPort(&PORTH, &DDRH, B00100000);
 
  display.setDcPort(&PORTG, &DDRG, B00001000);
 
  display.setRestPort(&PORTG, &DDRG, B00010000);
 
  display.init(SH1106_SWITCHCAPVCC);
 
}
 
cs
 
이렇게 Arduino 파일에 적용해서 사용할 수 있게 된다.
 
SPI에서 MOSI와 MISO는 자체적으로 고정된 핀을 사용하므로, CS핀과 Reset핀, DC핀 중에 숫자핀이 없다면, 사용하는 것이 좋다.
 
여담으로 오랜만에 티스토리에 포스팅하는데 에디터가 참, 안좋게 바뀐 것 같다.
특히, ColorScript의 클립보드 붙여넣기가 제대로 동작이 안되서 불편함이 이만저만이 아니다.

 

Posted by JunkMam
,

 MinGW을 사용하면,서 libgcc_sdw2-1.dll 오류가 나는 경우가 있다.


 특히, C버전이 조금 낮은 경우에는 일어날 수 있는 오류이다.


 


이렇게 뜨게 된다.


이것을 처리하는 방법을 구글링하다가 알게된 것으로.


사이트


여기서 설명한 해결법은 static gcc을 설정하고, static lib std c++을 컴파일할때 추가하는 것이다.




이렇게 하면 이상없이 해결된다.


Posted by JunkMam
,

wxWidgets 설치하기

연습 2018. 4. 3. 23:30
wxWidgets이란, Cross-Platform에서 GUI을 지원해주는 Library이다.

그래서 GUI을 작업할때, 동일한 소스를 이용해서 컴파일을 해도 문제 없이 동작할 수 있는 소스를 만들 수 있다.

설치하는 방법 설명.

먼저, 컴파일 할 수 있는 환경이 완성되어 있다고 보고, Source 파일로 설치하는 방법을 작성할려고 한다.(필자는 MinGW을 사용하는 상태이다.)

다운로드 여기에서 다운을 받아둔다.

설치한 는 방법을 자세하게 설명 되어 있는 사이트는
사이트1사이트2 가 있다.

설명을 모르겠으면, 사이트를 참고할것.

Source 파일을 다운 받아 압축을 풀면, wxWidgets라는 소스 폴더가 있을것이다.
거기서 {wxWidgets Source 파일 압축 푼 경로}\build\msw 에 들어가면, makefile.gcc와 makefile.bcc가 있다.(vs를 사용하면, vs8부터 vs11까지 빌드 파일이 있다.)

거기서 다음과 같은 명령어를 입력한다.

mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug clean
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release clean
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release

여기서, clean을 하는 이유는 혹시 Build가 되어 있는지 모르는 상황에서 제대로 설치하기 위해서 사용한다.
특히, clean을 사용하면, build된 필요 파일들이 다 날아가니 주의가 필요하다.

이 작업이 거의 1시간정도 여유를 가지고 작업을 하면 결과물은

{wxWidgets Source 파일 압축 푼 경로}\lib\gcc_dll에 저장되어 있을 것이다.

명령어 설명, -f 은 파일을 넣기 위한 명령어.
MONOLITHIC : 모든 라이브러리들을 하나로 묶는것으로, 공유할때 사람들에게 줘야될 DLL의 파일이 하나로 고정되게 된다.(정적 라이브러리도 하나가 된다.)
SHARED : 동적 라이브러리로 만들어내는 것을 설정한다. 0일 경우에는 정적 라이브러리를 빌드한다.
UNICODE : ASCII랑 UNICODE에서 UNICODE를 지원해주는것을 뜻한다.
BUILD : 어느 형태의 빌드 지원 라이브러리를 만들 것인지를 뜻한다. debug일 경우에는 디버그 지원이 있는 라이브러리를, release는 디버그 지원이 없는 라이브러리를 빌드한다.

이렇게해서 컴파일을 하면, wxWidgets 라이브러리 설치가 완료된다.


Posted by JunkMam
,
 *추신, 그냥 필자가 멋대로 테스트해본것으로 정말 이런지는 연습을 하면서 익혀보는 중이다.

 C언어와 C++는 비슷하다.

 필자는 클래스(Class)는 구조체(Struct)의 변형체로써 특정 기능(정확하게는 함수를 간단하게 구조체에 넣는 기능)이 붙어 있는 것이 클래스라고 본다.

 클래스의 변수를 맴버변수라고 하는데. 구조체의 변수 또한 맴버변수라고 한다.
 물론, 클래스에는 메소드가 있고, 구조체는 메소드랑 함수가 들어갈 수 없다.[C++에선 구조체에서도 함수가 들어간다고 하지만, 그것은 그냥 함수의 주소값을 넣는 것이다.]

 그래서 간단하게 C와 C++을 테스트해보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
 
class Person
{
    public:
        int nums;
    public:
        Person()
        {
            nums = 10;
        }
};
 
class BaseballPlayer: public Person
{
    public:
        int score;
    public:
        BaseballPlayer():Person()
        {
            score = 50;
        }
};
 
class Employee: public Person
{
    public:
        int hits;
    public:
        Employee():Person()
        {
            nums = 600;
            hits = 100;
        }
};
 
int main(void)
{
    Person *person = new Person();
    BaseballPlayer *player = new BaseballPlayer();
    Employee *employee = new Employee();
 
    printf("%d\n", person->nums);
    printf("%d\n", player->score);
    printf("%d\n", player->nums);
    printf("%d\n", employee->hits);
    printf("%d\n", employee->nums);
 
    return 0;
}
cs

test1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
 
class Person
{
    public:
        int nums;
    public:
        Person()
        {
            nums = 10;
        }
};
 
class BaseballPlayer: public Person
{
    public:
        int score;
    public:
        BaseballPlayer():Person()
        {
            score = 50;
        }
};
 
class Employee: public Person
{
    public:
        int hits;
    public:
        Employee():Person()
        {
            nums = 600;
            hits = 100;
        }
};
 
int main(void)
{
    Person *person = new Person();
    BaseballPlayer *player = new BaseballPlayer();
    Employee *employee = new Employee();
 
    printf("%d\n", person->nums);
    printf("%d\n", player->score);
    printf("%d\n", player->nums);
    printf("%d\n", employee->hits);
    printf("%d\n", employee->nums);
 
    return 0;
}
cs

test.c


이렇게 해보았다.

여기서, gcc --save-temp과, g++ --save-temp를 이용해서 처리하는 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
    .file    "test.c"
    .text
    .globl    _mkPerson
    .def    _mkPerson;    .scl    2;    .type    32;    .endef
_mkPerson:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $4, (%esp)
    call    _malloc
    movl    %eax, %edx
    movl    8(%ebp), %eax
    movl    %edx, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    $10, (%eax)
    leave
    ret
    .globl    _mkBaseballPlayer
    .def    _mkBaseballPlayer;    .scl    2;    .type    32;    .endef
_mkBaseballPlayer:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $8, (%esp)
    call    _malloc
    movl    %eax, %edx
    movl    8(%ebp), %eax
    movl    %edx, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    %eax, (%esp)
    call    _mkPerson
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    $50, 4(%eax)
    leave
    ret
    .globl    _mkEmployee
    .def    _mkEmployee;    .scl    2;    .type    32;    .endef
_mkEmployee:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $8, (%esp)
    call    _malloc
    movl    %eax, %edx
    movl    8(%ebp), %eax
    movl    %edx, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    %eax, (%esp)
    call    _mkPerson
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    movl    $600, (%eax)
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    movb    $100, 4(%eax)
    leave
    ret
    .def    ___main;    .scl    2;    .type    32;    .endef
    .section .rdata,"dr"
LC0:
    .ascii "%d\12\0"
    .text
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
    pushl    %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $32, %esp
    call    ___main
    leal    28(%esp), %eax
    movl    %eax, (%esp)
    call    _mkPerson
    leal    24(%esp), %eax
    movl    %eax, (%esp)
    call    _mkBaseballPlayer
    leal    20(%esp), %eax
    movl    %eax, (%esp)
    call    _mkEmployee
    movl    28(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    4(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movzbl    4(%eax), %eax
    movsbl    %al, %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    $0, %eax
    leave
    ret
    .ident    "GCC: (tdm-1) 4.9.2"
    .def    _malloc;    .scl    2;    .type    32;    .endef
    .def    _printf;    .scl    2;    .type    32;    .endef
 
cs


test.s


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
    .file    "test1.cpp"
    .section    .text$_ZN6PersonC2Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN6PersonC2Ev
    .def    __ZN6PersonC2Ev;    .scl    2;    .type    32;    .endef
__ZN6PersonC2Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    $10, (%eax)
    leave
    ret
    .section    .text$_ZN6PersonC1Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN6PersonC1Ev
    .def    __ZN6PersonC1Ev;    .scl    2;    .type    32;    .endef
__ZN6PersonC1Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    $10, (%eax)
    leave
    ret
    .section    .text$_ZN14BaseballPlayerC1Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN14BaseballPlayerC1Ev
    .def    __ZN14BaseballPlayerC1Ev;    .scl    2;    .type    32;    .endef
__ZN14BaseballPlayerC1Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, %ecx
    call    __ZN6PersonC2Ev
    movl    -4(%ebp), %eax
    movl    $50, 4(%eax)
    leave
    ret
    .section    .text$_ZN8EmployeeC1Ev,"x"
    .linkonce discard
    .align 2
    .globl    __ZN8EmployeeC1Ev
    .def    __ZN8EmployeeC1Ev;    .scl    2;    .type    32;    .endef
__ZN8EmployeeC1Ev:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    %ecx, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, %ecx
    call    __ZN6PersonC2Ev
    movl    -4(%ebp), %eax
    movl    $600, (%eax)
    movl    -4(%ebp), %eax
    movl    $100, 4(%eax)
    leave
    ret
    .def    ___main;    .scl    2;    .type    32;    .endef
    .section .rdata,"dr"
LC0:
    .ascii "%d\12\0"
    .text
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %ebx
    andl    $-16, %esp
    subl    $32, %esp
    call    ___main
    movl    $4, (%esp)
    call    __Znwj
    movl    %eax, %ebx
    movl    %ebx, %ecx
    call    __ZN6PersonC1Ev
    movl    %ebx, 28(%esp)
    movl    $8, (%esp)
    call    __Znwj
    movl    %eax, %ebx
    movl    %ebx, %ecx
    call    __ZN14BaseballPlayerC1Ev
    movl    %ebx, 24(%esp)
    movl    $8, (%esp)
    call    __Znwj
    movl    %eax, %ebx
    movl    %ebx, %ecx
    call    __ZN8EmployeeC1Ev
    movl    %ebx, 20(%esp)
    movl    28(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    4(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    24(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movl    4(%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    20(%esp), %eax
    movl    (%eax), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    movl    $0, %eax
    movl    -4(%ebp), %ebx
    leave
    ret
    .ident    "GCC: (tdm-1) 4.9.2"
    .def    __Znwj;    .scl    2;    .type    32;    .endef
    .def    _printf;    .scl    2;    .type    32;    .endef
 
cs


test1.s


이렇게 되어 있다.


여기서, test.s와 test1.s을 비교해봤다.


여기서 소스상에서 많이 차이가 없어 보인다.

여기서 차이가 있다면, cpp에서 생성자가 기본적으로 존재하고 [__ZN6PersonC1Ev], 이 후에 생성되는 생성자는 [__ZN6PersonC2Ev]가 되면서 추가되어서 생성자가 생성된다.


하지만, test1.cpp에서 Person 클래스에 생성자를 추가하지 않으면, 해당 소스에서 [__ZN6PersonC1Ev ] 같은 함수가 사라지고, 그냥 메모리 할당이 되는 것으로 된다.


하지만, 이것은 c에서는 생성자라는 함수가 있는 것이고 구조체가 그대로 사용되는 방식은 클래스랑 구조체랑 다른게 없다는걸 알게 되었다.


그래서 C++에서는 각각 구조체 변수를 사용할 수 있게 되어 있고 그것을 프로그래머가 알고 있다. 라는 가정으로 작업하게 만들기 때문에 super랑 base를 지원하지 않고, 다중 상속을 지원하는 것같다.

Posted by JunkMam
,

 암호에서 비밀번호를 사용할때, 해시함수를 사용한다.


 해시 함수는 단방향(일방적)인 암호방식을 사용할때, 혹은 암호문과 메세지의 변동이 있는지의 유무를 확인할 수 있다.


 보통은 비밀번호에 사용한다.(그리고 해시함수를 이용하면, 파일이 깨졌는지의 유무도 확인 할 수 있다.)


 해시란, 특정 덩어리를 특정 크기만큼으로 줄이는 방식을 뜻하는데. 압축이랑은 별개로 해당 값(해시 값)이 특정 덩어리를 뜻하긴 하지만, 해시 값으론 특정 덩어리를 알 수 없게 되어 있어서 압축과는 다르다.(압축은 압축한 대상이 특정 덩어리로 변환 될 수 있는 양방향성을 띈다.)


 여기서 유명한 SHA256을 사용할려고 한다.(필자는 SHA256을 이용해서 파일의 깨짐 유무를 확인할때 사용하기도 한다.)


 KISA에서 소스를 제공해주기도 한다.


 링크  : https://seed.kisa.or.kr/iwt/ko/bbs/EgovReferenceDetail.do?bbsId=BBSMSTR_000000000002&nttId=79


 외국에서는 C++로 객체화 해서 만들어져 있다.


 링크 : http://www.zedwood.com/article/cpp-sha256-function



소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "KISA_SHA256.h"
 
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
 
int main(int argc, char** argv)
{
 
    //변수 초기화.
    FILE *fp = NULL;
    unsigned char buffer[2048= { 0, };
    unsigned char result[32= { 0, };
    int read = 0;
    int loop_number = 0;
 
    //SHA256 변수 초기화.
    SHA256_INFO sha256_info;
 
    SHA256_Init(&sha256_info);
 
    //파일 읽기.
    //fp = fopen("Test.txt", "rb"); Visual Studio 옛버전을 사용할 경우. 이것을 사용할 것. Visual Studio에서 안전성 문제로 인한 함수 개선을 하였음.
    fopen_s(&fp, "Text.txt""rb");
 
    if (fp == NULL)
    {
        printf("Error : File not find.\n");
        system("pause");
        return -1;
    }
 
    while ((read = fread(buffer, 20481, fp)) != 0)
    {
        SHA256_Process(&sha256_info, buffer, read);
    }
 
    SHA256_Close(&sha256_info, result);
 
    for (loop_number = 0; loop_number < 32; loop_number++)
    {
        printf("%02x", result[loop_number]);
    }
 
    system("pause");
    return 0;
 
}
 
cs


Posted by JunkMam
,