관리 메뉴

밤색모자이크의 개발이야기

1일차. 어셈블리 입문과 Helloworld 띄우기 본문

Embedded/OS제작 with OS구조와원리

1일차. 어셈블리 입문과 Helloworld 띄우기

밤색모자이크 2017. 6. 20. 04:27

이 책은 어셈블리언어를 활용해서 Hello world를 띄우는걸 처음으로 합니다.

문제는 이걸 이진수 편집기로 작성을하고 난 뒤에 어셈블리언어로 재작성합니다.


이진수 편집기는 건너뛰도록 하겠습니다.




개발환경


운영체제 : Windows10

텍스트 편집기 : Atom

PC 에뮬레이터 : QEMU




여기서 알고 있어야하는 것은 어셈블리어로 작성하긴 했지만, 일반적인 어셈블리어가 아닌 책의 저자가 만든 NASK라는 어셈블러입니다.

NASM을 많이 따라했다고 하네요.


텍스트 편집기는 따로 설치하는게 좋습니다. 메모장으로는 한계가 많습니다. Atom이 무겁긴한데 편리해서 추천드려요.


소스코드


 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
; hello-os
; TAB=4

; 이하는 표준적인 FAT12 포맷 플로피디스크를 위한 서술

  DB    0xeb, 0x4e, 0x90
  DB    "HELLOIPL"        ; 부트섹터의 이름을 자유롭게 써도 좋음
  DW    512               ; 1섹터의 크기 (바이트 단위 512로 해야함)
  DB    1                 ; 클러스터의 크기 (1섹터로 해야함)
  DW    1                 ; 예약된 섹터의 수
  DB    2                 ; 디스크의 FAT 테이블의 수
  DW    224               ; 루트 디렉토리 엔트리의 수 (보통은 224엔트리)
  DW    2880              ; 디스커의 총 섹터 수(2880섹터로 해야함)
  DB    0xf0              ; 미디어 타입(0xf0으로 해야함)
  DW    9                 ; 하나의 FAT 테이블의 섹터 수 (9섹터로 해야함)
  DW    18                ; 1트랙에 몇 섹터가 있는가 (18로 해야함)
  DW    2                 ; 헤드의 수 (2로 해야함)
  DD    0                 ; 파티션을 사용하지 않으므로 이곳은 반드시 0
  DD    2880              ; 이 드라이브의 크기를 한 번 더 씀
  DB    0,0,0x29          ; 잘 모르곘지만 이 값을 넣어두면 좋다고 함
  DD    0xffffffff        ; 볼륨 시리얼 번호
  DB    "HELLO-OS   "     ; 디스크의 이름
  DB    "FAT12   "        ; 포맷의 이름 (8바이트)
  RESB  18                ; 18바이트 남겨둠

; 프로그램 본체

  DB    0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
  DB    0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
  DB    0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
  DB    0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
  DB    0xee, 0xf4, 0xeb, 0xfd

; 메시지 부분

  DB    0x0a, 0x0a  ; 줄 바꿈 2개
  DB    "hello, world"
  DB    0x0a
  DB    0

  RESB  0x1fe-$
  DB    0x55, 0xaa

; 이하는 부트섹터 이외의 부분에 기술

  DB    0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
  RESB  4600
  DB    0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
  RESB  1469432


위 소스코드를 작성하고 나서 helloos.nas 이름으로 저장하시면됩니다.


37번째 라인의 "hello, world" 부분을 바꾸시면 원하는 대로 출력 가능합니다.


위 소스코드를 이미지 파일로 만들어서 실행시키는 것입니다.

소스코드를 보면 이상한 점이 있는데 플로피디스크를 기준으로 작성되어 있습니다.

이는 가상환경에서 플로피디스크를 넣는다는 가정하에 작성되었고, 원래는 플로피디스크로 실행해야하는데 요즘 시대에 그런 건 없습니다.

따라서, 가상환경에서 실행하시면 되요.






실행


책 예제 소스코드 링크

http://www.hanbit.co.kr/store/books/look.php?p_code=B9833754652


처음부터 작성하겠다 하시는 분들도 다운하셔서 가상 에뮬레이터 받으시는게 좋습니다.

버추얼 머신으로 실행하신 분이 있는데 저는 아직 방법을 못찾아서 추후에 포스팅하도록 하겠습니다.

다운로드를 받고 폴더를 열면 아래와 같은 파일들이 존재합니다.



여기서 필요한 파일은 tolset입니다. 따로 에뮬레이터를 설치할 필요는 없습니다. 그냥 압축 푸시고 원하는 장소에 옮기면됩니다.

저는 OS라는 폴더에 옮겼습니다.

이제부터 tolset폴더 안에서 폴더를 만들고 프로그램을 작성하시면됩니다.

projects 폴더에는 날짜별로 모든 소스코드가 들어있습니다.

그냥 실행만 시켜보고 싶으신 분들은 projects폴더에서 01day->helloos2를 tolset 폴더 안으로 복사 붙여넣기 하면 됩니다.

helloos0은 이진편집기로 직접 작성한 것이고, hellos1은 어셈블리어로 작성되었습니다.

helloos2는 이를 좀 더 이쁘게 작성한 것입니다.



이런 식으로 복사하시면 됩니다.

helloos2 폴더 안에 실행을 위해 3가지 파일을 더 만들어야합니다.


run.bat : 디스크 이미지 파일을 실행

install.bat : 디스크 이미지 파일을 가상 에뮬레이터에 설치

asm.bat : 디스크 이미지 파일 생성


bat이 배치파일인데 따로 텍스트 편집기를 작성하지 않으셨으면 그냥 메모장에다가 해도됩니다. 저장을 한 뒤에 파일명을 run.bat으로 바꾸면 경고문이 뜨는데 바꾼다고하고 확인 누르시면 됩니다.


1) run.bat


copy helloos.img ..\z_tools\qemu\fdimage0.bin

..\z_tools\make.exe -C ../z_tools/qemu


2) install.bat


..\z_tools\imgtol.com w a: helloos.img


3) asm.bat


..\z_tools\nask.exe helloos.nas helloos.img


위 파일들을 작성하고 저장하시면 됩니다.



!cons_nt.bat을 실행시키면 명령프롬프트가 실행됩니다. !cons_9x.bat은 윈도우 운영체제 버전이 98이하라면 사용하세요.

!cons_nt.bat 파일은 복사해서 가져오시면 됩니다. 그냥 명령프트를 실행해도 되는데 그렇게 하게되면 저 경로까지 매번 찾아가야합니다.

귀찮으니 그냥 파일 복사해서 사용하시는게 편해요.


asm.bat 파일을 굳이 사용 안하셔도 됩니다. 이미지파일을 생성하는 것이기 때문에 따로 명령어 입력해도됩니다.



..\z_tools\nask.exe hellos.nas helloos.img


이렇게 입력하면 이미지 파일이 생성된 것을 확인 가능합니다.

만약 asm.bat 까지 작성하셨다면 아래와 같이 생성해도됩니다.

asm.bat 파일은 위 명령어를 파일로 저장한 것입니다.


명령프트를 실행하고 asm을 입력하고 run을 입력하면 실행이 됩니다.



asm을 입력하면 이미지 파일이 생성되고

run을 입력하면 이미지 파일이 실행됩니다.




결과 화면



이렇게 1일차를 완료합니다!



참고 자료

OS 구조와 원리, 카와이 히데미 저, 한빛미디어 출판

링크 : http://www.hanbit.co.kr/store/books/look.php?p_code=B9833754652

Comments