최근에 인공지능이 유명이 타면서, 인공지능을 이용해서 다양하게 표현하는 것이 있다.


 과거에 알려준 Hutter Prize[각주:1]라는 상으로 최대의 압축을 하면, 상을 주는 상이 있다.


 여기서 MCM등의 압축 프로그램을 추천한 적이 있다.


 MCM이 아직 미완성 품이라서 발전 상황을 보고 있는데, 최근에 7월 1일날 업데이트가 되어있길래(MCM은 아직 업데이트가 되지 않았다.), 포스팅 하고자 한다.


 6월 중순에 최고의 압축률(시간과 메모리가 비효율적이다.)을 가지고 있는, CMix라는게 있다.


 여기서 메모리의 증가에 따라서 압축률이 증가 하였다.(본 사이트에서 참조 할것.)


 해당 사이트에서는 압축률이 높은 프로그램을 얻을 수 있고, 소스를 참조 할 수 있을 것이다.


 

 필자는 mcm 파일을 사용하고 있다.


 최대 효율이 높은 작품은 drt | lpaq9m을 이용하는 것으로, 메모리가 약 1.5GB에 압축 및 풀기 시간이 약 900ns/byte의 속도가 나온다.


 mcm은 약 6GB가 들지만, 그 만큼 속도가 빠르고, drt|lpaq9m과 거진 비슷하다.(그래도, 차이는 많이 난다.)


 mcm은 압축 및 풀기가 메모리를 많이 들어간다. 단, drt|lpaq9m는 windows에는 작동이 안된다는 단점을(바이러스로 인식한다.[2016-07-04]) 가지고 있다.

 그래서 drt|lpaq9m을 제대로 사용하기 어렵다.


 최근에는 cmix라는 프로그램이 개선이 되었지만, 그래도 메모리의 크기가 보면, 알 수 있듯이 약 30GB라는 엄청난 내용물이 필요하다.


 현재, 이 기술은 무손실 압축으로 표현이 된다.

  1. http://mattmahoney.net/dc/text.html(2016-07-06) [본문으로]
Posted by JunkMam
,

 2일차에 대한 것으로 개발 재개를 위해서 helloos.nas을 조금 개량되어 있다. (동작은 동일하다.)


 제대로된 어셈블리 명령어를 이용해서 제작하는 것을 목표로 하고 있는 것이다.


 그 전에 방식은 어셈블리어의 데이터만을 이용해서 만드는 것이라고 한다면, 이번 방식은 어셈블리어의 명령어를 제대로 처리하는 것이다.


 차이점은 이전 글은 기계어를 전부다 알고 있어야 된다면, 이번은 어셈블리어를 알고 있으면 제작이 가능하다는 점이다.


 중간 중간 오류가 나는 소스이다. 일단, 올려 놓고 어떤 문제점이 있는지 기록하면, 조금 더 차이점을 이해 할 수 있을 거라고 생각한다. 그래서 소스를 일단, 올린다.


 

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
/*
    Hello-os
    TAB=4
*/
 
//.org    0x7c00;
 
/*
    표준적인 FAT12 포맷 플로피 디스크를 위한 서술
*/
/*
jmp    entry;
.byte    0x90;
*/
.byte    0xeb0x4e0x90;
.ascii    "HELLOIPL";
.word    512;
.byte    1;
.word    1;
.byte    2;
.word    224;
.word    2880;
.byte    0xf0;
.word    9;
.word    18;
.word    2;
.int    0;
.int    2880;
.byte    000x29;
.int    0xffffffff;
.ascii    "HELLO-OS   ";
.ascii    "FAT12   ";
.fill    18;
 
/*
    프로그램 본체
*/
 
entry:
    movw    $0, %ax;
    movw    %ax, %ss;
    movw    $0x7c00, %sp;
    movw    %ax, %ds;
    movw    %ax, %es;
    
    movw    msg, %si;
 
putloop:
    movb    (%si), %al;
    add        $1, %si;
    cmp        $0, %al;
    je        fin;
    movb    $0x0e, %ah;
    movw    $15, %bx;
    int        $0x10;
    jmp        putloop;
    
fin:
    hlt;
    jmp        fin;
    
msg:
    .byte    0x0a0x0a;
    .ascii    "Hello, World!";
    .byte    0x0a;
    .byte    0x00;
 
.org    510-(.-..);
 
.byte    0x550xaa;
 
/*
    부트로더 이외의 부분에 기술
*/
.byte    0xf00xff0xff0x000x000x000x000x00;
.fill    4600;
.byte    0xf00xff0xff0x000x000x000x000x00;
.fill    1469432;
 
cs


 이걸 알아 보는 방향으로 이글을 마친다.

Posted by JunkMam
,

 "[OS 구조와 원리] - 저. 카와이 히데미" 라는 책이 있다. 이 책에서는 OS 구조와 원리라는 책에서는 NASM이라는 어셈블러를 사용하여 제작하고 있다.


 하지만, NASM을 무조건 사용해야된다는 점이 있다.


 NASM와 GAS가 서로 약간씩 다른 것이 있다.

 먼저, Syntax 차이가 있다. 가장 큰 차이라서 조사를 많이 해야 되는 경우도 있다.


 참조 : https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm/+/master/modules/parsers/gas


 여기서 설명할 수 있는게 있다.


 원본에 존재하는 NASM은 책을 구매해서 비교하면, 될것 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.byte 0xeb0x4e0x900x480x450x4c0x4c0x4f;
.byte 0x490x500x4c0x000x020x010x010x00;
.byte 0x020xe00x000x400x0b0xf00x090x00;
.byte 0x120x000x020x000x000x000x000x00;
.byte 0x400x0b0x000x000x000x000x290xff;
.byte 0xff0xff0xff0x480x450x4c0x4c0x4f;
.byte 0x2d0x4f0x530x200x200x200x460x41;
.byte 0x540x310x320x200x200x200x000x00;
.fill 16;
.byte 0xb80x000x000x8e0xd00xbc0x000x7c;
.byte 0x8e0xd80x8e0xc00xbe0x740x7c0x8a;
.byte 0x040x830xc60x010x3c0x000x740x09;
.byte 0xb40x0e0xbb0x0f0x000xcd0x100xeb;
.byte 0xee0xf40xeb0xfd0x0a0x0a0x680x65;
.byte 0x6c0x6c0x6f0x2c0x200x770x6f0x72;
.byte 0x6c0x640x0a0x000x000x000x000x00;
.fill 368;
.byte 0x000x000x000x000x000x000x550xaa;
.byte 0xf00xff0xff0x000x000x000x000x00;
.fill 4600;
.byte 0xf00xff0xff0x000x000x000x000x00;
.fill 1469432;
cs


 이렇게 하고 난 후에 GAS을 사용하면, 얻어 진다.


 여기서 .fill이랑 책에 있는 내용이랑 다르다.


 .byte라는 것은 Data Byte를 뜻한다.


 NASM은 DB라는 걸로 Data Byte을 처리한다면, AT&T 문법은 .byte라는 걸로 Data Byte을 표현한다.


 NASM은 RESB로 Byte을 채울 수 있다면, GAS는 .fill을 이용해서 채우는 작업을 한다.(이렇게한다면, 책에 어떤 내용을 가지는지 알 수 있을 것이다.)


 GAS에서 컴파일을 하기 위해서는 다음과 같은 명령어들을 입력해줘야 한다.


 as -o boot.o boot.s

 objcopy -O binary boot.o boot.bin


 GCC에서는 -O는 최적화 소스라고 -O는 Output 종류를 뜻한다.


 이렇게 해서 NASM을 설치 하지 않고, boot을 만들어 낼 수 있다.


 GAS을 사용하는 이유는 MinGW나 CygWin만 설치하고 제작을 할 수 있기 때문이다.


 그리고 여러개를 사용할 수 있을 경우. 다양한 환경에서 조절이 가능하니, 미리 해두는 것도 나쁘지는 않는 것 같다.


 완성품

boot.img

boot.o

boot.s


 여기서 Virtual Box에서 테스트 할려면, 플로피 디스크를 생성해서 불러오는 것을 만들어야한다.

Posted by JunkMam
,

 GAS란, GNU ASsembler 라는 약자로 GNU 측에서 만든 어셈블러이다.


 OS을 만들어 보자. 라는 책들이나 인터넷 강의들을 보면, 보통 설명해주는 곳에서는 대부분 NASM을 이용하는 방법을 설명이 되어있다.


 필자는 GAS로도 가능한 것으로 기억하고 있기 때문에(NASM 만들어지기 전에도 대부분 만들어 냈으니.) 이걸 알아보기 위해서 구글링을 하니. 답을 찾아서 기록을 위해서 글을 작성한다.


 찾아낸 사이트는 외국에서 질문을 답변해준 사이트에서 적혀 있다.

 http://stackoverflow.com/questions/12650291/how-to-locate-a-variable-correctly-in-att-assembly[각주:1]


 찾아낸 사이트에는 GAS만 사용할 수 있는게 아니다.

 해당 사이트에서 설명되어있는 소스 사이트를 보면, 다음과 같이 설명이 되어 있다.


 GAS로 object 파일을 만든다.

 objcopy로 object 파일을 binaray 파일로 출력하도록 만든다.


 이렇게 사용하면, NASM을 사용하지 않아도 된다.


 GAS로만으로 만들 수 없는 이유는 다음과 같다.


 GAS는 Object 파일을 만드는 것이다. 여기서 binary 형태로 설정하는디 PE 파일로 설정하는지 ELF 형태로 하고자하는지 설정하는게 따로 있지 않다.

 그러므로 Object 파일을 Copy하는 도중에 binary 파일 형태로 변환시켜서 올리게 만드는 형태를 취한다.


 

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
.text
.global     _start
.code16
 
_start:
movw    %cs, %ax
movw    %ax, %ds
movw    %ax, %es
call    hello
jmp     .
 
.org    0x10
 
hello:
movw    $message, %ax
movw    %ax, %bp
movw    $13, %cx
movw    $0x1301, %ax
movw    $0x000c, %bx
movb    $0, %dl
int     $0x10
ret
 
message:    
.ascii  "Hello, World!"
 
.org    0x01fe
.byte   0x55
.byte   0xaa
cs



 이렇게 해서 나오는 값이 이상이 없는데, .fill이라는 방법과 .org라는 방법 2가지가 있는걸 확인 되었다.

 .fill을 사용해서 만들었었는데, fill은 유동적인 값을 사용해선 안된다. 라는 오류가 뜨면서, 제대로 작동이 안된다.

 그렇기 때문에, 유사한 명령어를 찾고 있었다. 구글링을 하다가. 드디어 .org라는 명령어를 찾게되었다.

 다음부터는 .org을 사용하는 것을 해야겠다.


boot.img

boot.o

boot.s


  1. 검색 일자 : (2016-06-04) [본문으로]
Posted by JunkMam
,