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
,