3日目のアセンブラをダンプ(前編) - HobbyOSs/opennask GitHub Wiki

  • wineでnaskを実行して想定バイナリを出している

以下のコマンド

$ wine ~/.wine/drive_c/MinGW/msys/1.0/bin/nask.exe ipl.nas ipl.img
$ od -t x1 ipl.img      // リトルエンディアンでバイナリをテキストに出力

harib00a

  • ここで生データとして書き込んでいるのはRPBです。詳しい解説はリンク先を見てください。
  • ここには実はosask側のミスがある。下記のアセンブリで「全セクター数(Large Sector)」に2880を設定しているが、上記のリンクに書いてあるように、「FAT12/16ボリュームで総セクタ数が0x10000未満のとき、このフィールドは無効値(0)でなければならなず、真の値はBPB_TotSec16に設定される。」総セクター数は2880なので、ほんとはここは0であるべきだ。
; haribote-ipl
; TAB=4

		ORG		0x7c00			; ORGはバイナリには現れない

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

		JMP		entry			; eb4e
		DB		0x90			; 90
		DB		"HARIBOTE"		; 48415249424f5445
		DW		512			; 0002             ; 1クラスター(アロケーションユニット)あたりのセクター数
		DB		1			; 01               ; 不明(多分何でもいい)
		DW		1			; 0100             ; 予約セクター数
		DB		2			; 02               ; FATの数(デフォルトで2個)
		DW		224			; e000             ; ルートディレクトリエントリの最大数
		DW		2880			; 400b             ; 全セクター数(Small Sector)
		DB		0xf0			; f0               ; メディアディスクリプター
		DW		9			; 0900             ; FATのセクター数
		DW		18			; 1200             ; トラックあたりのセクター数
		DW		2			; 0200             ; ドライブのヘッド数
		DD		0			; 00000000         ; 不可視セクター数 
		DD		2880			; 400b0000                 ; 全セクター数(Large Sector)
		DB		0,0,0x29		; 000029                   ; 物理ドライブ番号/予約領域/ブートシグネチャ
		DD		0xffffffff		; ffffffff                 ; ボリューム シリアル番号
		DB		"HARIBOTEOS "		; 48415249424f54454f5320   ; ボリューム ラベル
		DB		"FAT12   "		; 4641543132202020         ; ファイルシステムタイプ(FAT12)
		RESB	18				; 000000000000000000000000000000000000

ブートセクタおわり

プログラム始まり

; プログラム本体

entry:
		MOV		AX,0			; b80000
		MOV		SS,AX			; 8ed0
		MOV		SP,0x7c00		; bc007c
		MOV		DS,AX			; 8ed8   // ここまでは同じ

; ディスクを読む

		MOV		AX,0x0820		; b82008
		MOV		ES,AX			; 8ec0
		MOV		CH,0			; b500
		MOV		DH,0			; b600
		MOV		CL,2			; b102

		MOV		AH,0x02			; b402
		MOV		AL,1			; b001
		MOV		BX,0			; bb0000
		MOV		DL,0x00			; b200
		INT		0x13			; cd13
		JC		error			; 7203

; 読み終わったけどとりあえずやることないので寝る

fin:
		HLT						; f4
		JMP		fin				; ebfd

error:
		MOV		SI,msg			; be8a7c
putloop:
		MOV		AL,[SI]			; 8a04
		ADD		SI,1			; 83c601
		CMP		AL,0			; 3c00
		JE		fin				; 74f1
		MOV		AH,0x0e			; b40e
		MOV		BX,15			; bb0f00
		INT		0x10			; cd10
		JMP		putloop			; ebee
msg:
		DB		0x0a, 0x0a		; 0a0a
		DB		"load error"	; 6c6f6164206572726f72
		DB		0x0a			; 0a
		DB		0				; 00

		RESB	0x7dfe-$		; 0x7dfeまで0x00

		DB		0x55, 0xaa		; 55aa

harib00b

; haribote-ipl
; TAB=4

		ORG		0x7c00			; ORGはバイナリには現れない

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

		JMP		entry			; eb4e
		DB		0x90			; 90
		DB		"HARIBOTE"		; 48415249424f5445
		DW		512				; 0002
		DB		1				; 01
		DW		1				; 0100
		DB		2				; 02
		DW		224				; e000
		DW		2880			; 400b
		DB		0xf0			; f0
		DW		9				; 0900
		DW		18				; 1200
		DW		2				; 0200
		DD		0				; 00000000
		DD		2880			; 400b0000
		DB		0,0,0x29		; 000029
		DD		0xffffffff		; ffffffff
		DB		"HARIBOTEOS "	; 48415249424f54454f5320
		DB		"FAT12   "		; 4641543132202020
		RESB	18				; 000000000000000000000000000000000000

; プログラム本体

entry:
		MOV		AX,0			; b80000
		MOV		SS,AX			; 8ed0
		MOV		SP,0x7c00		; bc007c
		MOV		DS,AX			; 8ed8

; ディスクを読む

		MOV		AX,0x0820		; b82008
		MOV		ES,AX			; 8ec0
		MOV		CH,0			; b500
		MOV		DH,0			; b600
		MOV		CL,2			; b102

		MOV		SI,0			; be0000
retry:
		MOV		AH,0x02			; b402
		MOV		AL,1			; b001
		MOV		BX,0			; bb0000
		MOV		DL,0x00			; b200
		INT		0x13			; cd13
		JNC		fin				; 7310
		ADD		SI,1			; 83c601
		CMP		SI,5			; 83fe05
		JAE		error			; 730b
		MOV		AH,0x00			; b400
		MOV		DL,0x00			; b200
		INT		0x13			; cd13
		JMP		retry			; ebe3

; 読み終わったけどとりあえずやることないので寝る

fin:
		HLT						; f4
		JMP		fin				; ebfd

error:
		MOV		SI,msg			; be9d7c
putloop:
		MOV		AL,[SI]			; 8a04
		ADD		SI,1			; 83c601
		CMP		AL,0			; 3c00
		JE		fin				; 74f1
		MOV		AH,0x0e			; b40e
		MOV		BX,15			; bb0f00
		INT		0x10			; cd10
		JMP		putloop			; ebee
msg:
		DB		0x0a, 0x0a		; 0a0a
		DB		"load error"	; 6c6f6164206572726f72
		DB		0x0a			; 0a
		DB		0				; 00

		RESB	0x7dfe-$		; 0x7dfeまで0x00

		DB		0x55, 0xaa		; 55aa

harib00c

; haribote-ipl
; TAB=4

		ORG		0x7c00			; ORGはバイナリには現れない

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

		JMP		entry			; eb4e
		DB		0x90			; 90
		DB		"HARIBOTE"		; 48415249424f5445
		DW		512				; 0002
		DB		1				; 01
		DW		1				; 0100
		DB		2				; 02
		DW		224				; e000
		DW		2880			; 400b
		DB		0xf0			; f0
		DW		9				; 0900
		DW		18				; 1200
		DW		2				; 0200
		DD		0				; 00000000
		DD		2880			; 400b0000
		DB		0,0,0x29		; 000029
		DD		0xffffffff		; ffffffff
		DB		"HARIBOTEOS "	; 48415249424f54454f5320
		DB		"FAT12   "		; 4641543132202020
		RESB	18				; 000000000000000000000000000000000000

; プログラム本体

entry:
		MOV		AX,0			; b80000
		MOV		SS,AX			; 8ed0
		MOV		SP,0x7c00		; bc007c
		MOV		DS,AX			; 8ed8

; ディスクを読む

		MOV		AX,0x0820		; b82008
		MOV		ES,AX			; 8ec0
		MOV		CH,0			; b500
		MOV		DH,0			; b600
		MOV		CL,2			; b102
readloop:
		MOV		SI,0			; be0000
retry:
		MOV		AH,0x02			; b402
		MOV		AL,1			; b001
		MOV		BX,0			; bb0000
		MOV		DL,0x00			; b200
		INT		0x13			; cd13
		JNC		next			; 7310
		ADD		SI,1			; 83c601
		CMP		SI,5			; 83fe05
		JAE		error			; 731a
		MOV		AH,0x00			; b400
		MOV		DL,0x00			; b200
		INT		0x13			; cd13
		JMP		retry			; ebe3
next:
		MOV		AX,ES			; 8cc0
		ADD		AX,0x0020		; 052000
		MOV		ES,AX			; 8ec0
		ADD		CL,1			; 80c101
		CMP		CL,18			; 80f912
		JBE		readloop		; 76d1

; 読み終わったけどとりあえずやることないので寝る

fin:
		HLT					; f4
		JMP		fin			; ebfd

error:
		MOV		SI,msg			; beac7c
putloop:
		MOV		AL,[SI]			; 8a04
		ADD		SI,1			; 83c601
		CMP		AL,0			; 3c00
		JE		fin			; 74f1
		MOV		AH,0x0e			; b40e
		MOV		BX,15			; bb0f00
		INT		0x10			; cd10
		JMP		putloop			; ebee
msg:
		DB		0x0a, 0x0a		; 0a0a
		DB		"load error"		; 
		DB		0x0a			; 
		DB		0			; 

		RESB	0x7dfe-$			; 

		DB		0x55, 0xaa		; 

harib00d

; haribote-ipl
; TAB=4

CYLS	EQU		10				; EQUはバイナリには現れない
		ORG		0x7c00			; ORGはバイナリには現れない

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

		JMP		entry			; eb4e
		DB		0x90			; 90
		DB		"HARIBOTE"		; 48415249424f5445
		DW		512				; 0002
		DB		1				; 01
		DW		1				; 0100
		DB		2				; 02
		DW		224				; e000
		DW		2880			; 400b
		DB		0xf0			; f0
		DW		9				; 0900
		DW		18				; 1200
		DW		2				; 0200
		DD		0				; 00000000
		DD		2880			; 400b0000
		DB		0,0,0x29		; 000029
		DD		0xffffffff		; ffffffff
		DB		"HARIBOTEOS "	; 48415249424f54454f5320
		DB		"FAT12   "		; 4641543132202020
		RESB	18				; 000000000000000000000000000000000000

; プログラム本体

entry:
		MOV		AX,0			; b80000
		MOV		SS,AX			; 8ed0
		MOV		SP,0x7c00		; bc007c
		MOV		DS,AX			; 8ed8

; ディスクを読む

		MOV		AX,0x0820		; b82008
		MOV		ES,AX			; 8ec0
		MOV		CH,0			; b500
		MOV		DH,0			; b600
		MOV		CL,2			; b102
readloop:
		MOV		SI,0			; be0000
retry:
		MOV		AH,0x02			; b402	
		MOV		AL,1			; b001	
		MOV		BX,0			; bb0000
		MOV		DL,0x00			; b200	
		INT		0x13			; cd13	
		JNC		next			; 7310
		ADD		SI,1			; 83c601
		CMP		SI,5			; 83fe05
		JAE		error			; 732e
		MOV		AH,0x00			; b400
		MOV		DL,0x00			; b200
		INT		0x13			; cd13
		JMP		retry			; ebe3
next:
		MOV		AX,ES			; 8cc0	
		ADD		AX,0x0020		; 052000
		MOV		ES,AX			; 8ec0	
		ADD		CL,1			; 80c101
		CMP		CL,18			; 80f912
		JBE		readloop		; 76d1
		MOV		CL,1			; b101
		ADD		DH,1			; 80c601
		CMP		DH,2			; 80fe02
		JB		readloop		; 72c7
		MOV		DH,0			; b600
		ADD		CH,1			; 80c501
		CMP		CH,CYLS			; 80fd0a
		JB		readloop		; 72bd

; 読み終わったけどとりあえずやることないので寝る

fin:
		HLT					; f4
		JMP		fin			; ebfd

error:
		MOV		SI,msg			; bec0
putloop:
		MOV		AL,[SI]			; 7c8a04
		ADD		SI,1			; 83c601
		CMP		AL,0			; 3c00 
		JE		fin			; 74f1
		MOV		AH,0x0e			; b40e
		MOV		BX,15			; bb0f00
		INT		0x10			; cd10	
		JMP		putloop			; ebee	
msg:
		DB		0x0a, 0x0a		; 0a0a
		DB		"load error"		; 6c6f6164206572726f72
		DB		0x0a			; 0a
		DB		0

		RESB	0x7dfe-$			; 

		DB		0x55, 0xaa		; 55aa

harib00e

harib00dharib00eは同一ファイルなので完了!