"[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 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f; .byte 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00; .byte 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00; .byte 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00; .byte 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff; .byte 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f; .byte 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41; .byte 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00; .fill 16; .byte 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c; .byte 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a; .byte 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09; .byte 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb; .byte 0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65; .byte 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72; .byte 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00; .fill 368; .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa; .byte 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00; .fill 4600; .byte 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00; .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만 설치하고 제작을 할 수 있기 때문이다.
그리고 여러개를 사용할 수 있을 경우. 다양한 환경에서 조절이 가능하니, 미리 해두는 것도 나쁘지는 않는 것 같다.
완성품
여기서 Virtual Box에서 테스트 할려면, 플로피 디스크를 생성해서 불러오는 것을 만들어야한다.
'연습' 카테고리의 다른 글
GCC 릴리즈와 디버그 컴파일 방법. (0) | 2016.07.02 |
---|---|
Windows API 프로그래밍 -15. 비프음 출력. - (0) | 2016.07.02 |
Windows API 프로그래밍 -14. 메시지 박스 출력. - (0) | 2016.07.01 |
Windows API 프로그래밍 -13. 다각형 출력. - (0) | 2016.06.30 |
콘솔 어플리케이션에서 Windows 창 띄우기. (0) | 2016.06.29 |