-
Notifications
You must be signed in to change notification settings - Fork 3
3日目のアセンブラをダンプ(前編)
hangedman edited this page Oct 6, 2021
·
12 revisions
- wineでnaskを実行して想定バイナリを出している
以下のコマンド
$ wine ~/.wine/drive_c/MinGW/msys/1.0/bin/nask.exe ipl.nas ipl.img
$ od -t x1 ipl.img // リトルエンディアンでバイナリをテキストに出力
-
3日目のアセンブラで新出のオペコード
-
アセンブラ
- ここで生データとして書き込んでいるのは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
; 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
; 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 ;
; 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
harib00d
とharib00e
は同一ファイルなので完了!