'꽤 그럴듯한 소스 프로그램' 파트를 작성하면서 꽤 고생했다.


 먼저, 어셈블리어에 익숙 하지 않은 부분을 들수 있다. 그 외도 정보가 부족하다.

 영어 메뉴얼을 전부 다 번역하고 작업을 해야 될 것 같다.


 일단, '꽤 그럴듯한 소스 프로그램' 에서 제대로 작동이 안되는 부분이 있다.


 고쳐야 되는 것으로 구글링을 해보니.


 'RESB    0x01fe-$'라는 부분의 줄을 'times    510-($-$$) db 0x00' 이렇게 되어야된다. 라고 되어있다.


 그래서 이 부분을 times을 검색해야되는지 고민하다가 AT&T에서 .org을 테스트해보았다.


 소스

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
/*
    Hello-os
    TAB=4
*/
 
/*
    표준적인 FAT12 포맷 플로피 ㄷ스크를 위한 서술
*/
 
.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;
 
/*
    프로그램 본체
*/
.byte    0xb80x000x000x8e0xd00xbc0x000x7c;
.byte    0x8e0xd80x8e0xc00xbe0x740x7c0x8a;
.byte    0x040x830xc60x010x3c0x000x740x09;
.byte    0xb40x0e0xbb0x0f0x000xcd0x100xeb;
.byte    0xee0xf40xeb0xfd;
 
/*
    메세지 부분
*/
.byte    0x0a0x0a;
.ascii    "hello, world";
.byte    0x0a;
.byte    0;
 
.org    510-(.-..);
 
.byte    0x550xaa;
 
/*
    부트로더 이외의 부분에 기술
*/
.byte    0xf00xff0xff0x000x000x000x000x00;
.fill    4600;
.byte    0xf00xff0xff0x000x000x000x000x00;
.fill    1469432;
cs


 이렇게 되어있는데, data double-word라는 것을 처리하는지 찾아보니.

 data double-word라는 것은 32bit을 뜻한다.

 32bit인 int을 사용하면, 된다는 것이다.


 이것 이용해서 메세지 부분을 출력하도록 만들어 봤다.


 여기서 중요한것은 .org이다.


 0x00을 채우는 명령어이기 때문이다.


 .이란, Intel Syntax에서 본다면, $와 동일한 것이고, ..은 Intel Syntax에 본다면, $$와 같다.


  ..($$)과 .($)는 각각 처음 프로그램 위치. 와 현재 프로그램 위치를 뜻한다.


 그래서 현재 위치 - 초기 위치는 음수가 되지 않는 한. 그 둘의 거리가 되는 것이다.


 그래서 0x00을 채워 나가는 소스가 되는 것이다.


 이걸 알기 위해서 근 10시간 이상을 검색했다.


 GNU AS을 사용할려면, 적어도 메뉴얼을 사용해 봐야 될 것 같다.

Posted by JunkMam
,