'꽤 그럴듯한 소스 프로그램' 파트를 작성하면서 꽤 고생했다.
먼저, 어셈블리어에 익숙 하지 않은 부분을 들수 있다. 그 외도 정보가 부족하다.
영어 메뉴얼을 전부 다 번역하고 작업을 해야 될 것 같다.
일단, '꽤 그럴듯한 소스 프로그램' 에서 제대로 작동이 안되는 부분이 있다.
고쳐야 되는 것으로 구글링을 해보니.
'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 0xeb, 0x4e, 0x90; .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 0, 0, 0x29; .int 0xffffffff; .ascii "HELLO-OS "; .ascii "FAT12 "; .fill 18; /* 프로그램 본체 */ .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; /* 메세지 부분 */ .byte 0x0a, 0x0a; .ascii "hello, world"; .byte 0x0a; .byte 0; .org 510-(.-..); .byte 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 |
이렇게 되어있는데, data double-word라는 것을 처리하는지 찾아보니.
data double-word라는 것은 32bit을 뜻한다.
32bit인 int을 사용하면, 된다는 것이다.
이것 이용해서 메세지 부분을 출력하도록 만들어 봤다.
여기서 중요한것은 .org이다.
0x00을 채우는 명령어이기 때문이다.
.이란, Intel Syntax에서 본다면, $와 동일한 것이고, ..은 Intel Syntax에 본다면, $$와 같다.
..($$)과 .($)는 각각 처음 프로그램 위치. 와 현재 프로그램 위치를 뜻한다.
그래서 현재 위치 - 초기 위치는 음수가 되지 않는 한. 그 둘의 거리가 되는 것이다.
그래서 0x00을 채워 나가는 소스가 되는 것이다.
이걸 알기 위해서 근 10시간 이상을 검색했다.
GNU AS을 사용할려면, 적어도 메뉴얼을 사용해 봐야 될 것 같다.
'연습' 카테고리의 다른 글
Windows API 프로그래밍 -16. 마우스 입력. - (0) | 2016.07.05 |
---|---|
GAS로 OS 구조와 원리 짜기. -3. 2일차 어셈블러 처리.- (0) | 2016.07.04 |
GCC 릴리즈와 디버그 컴파일 방법. (0) | 2016.07.02 |
Windows API 프로그래밍 -15. 비프음 출력. - (0) | 2016.07.02 |
GAS로 OS 구조와 원리 짜기. -1. 제대로 된 길이의 소스 프로그램- (0) | 2016.07.02 |