抜けたぁ。。。。
72.4 kg...
完全にコメ断ちできていないとはいえ、また増えた。
まぁまぁコメもオヤツも食べて無いと思うんだけど。。。(Orz..)
という事で、ipl10.nasからJumpした後のコードが全く実行されていない
って状態のようだが、何故か。。
う〜ん。。。。
こうなったら、実行されているはずのバイナリを直に観測してみながら
何かヒントを得るしか無いか。。
ipl10.lstよりJumpしてasmheadへ移る直前を抜粋:
81 000000A8 882EF00F MOV [0x0ff0],BYTE CH ; IPLがどこまで読んだのかをメモ
82 ; JMP 0xc200
83
84 000000AC C606F10F0B MOV BYTE [0x0ff1],0x0b ; 進捗チェック用フラグ
85
86 000000B1 E9(30C3) JMP 0xc330
asmhead.lstより、最初の部分を抜粋:
18 ; 画面モードを設定
19
20 00000000 C706F20F0C00 MOV WORD [0x0ff2], 0x000c ; 進み具合テスト1
asmhead.lstの20行目が実行されていない。
バイナリは狙ったアドレスへ読み込まれているのか?はQEMUにて確認
$ make run
make -r img
make -r haribote.img
nasm ipl10.nas -o ipl10.bin -l ipl10.lst
nasm -f elf32 asmhead.nas -o asmhead.bin -l asmhead.lst
nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst
x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c -o bootpack.o
x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o
cat asmhead.bin bootpack.hrb > haribote.sys
mformat -f 1440 -C -B ipl10.bin -i haribote.img ::
mcopy -i haribote.img haribote.sys ::
qemu-system-i386 -L . -m 32 -monitor stdio -s -drive file=haribote.img,format=raw,if=floppy -boot a
QEMU 5.0.0 monitor - type 'help' for more information
(qemu) xp/200xh 0xc200
000000000000c200: 0x457f 0x464c 0x0101 0x0001 0x0000 0x0000 0x0000 0x0000
000000000000c210: 0x0001 0x0003 0x0001 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c220: 0x0040 0x0000 0x0000 0x0000 0x0034 0x0000 0x0000 0x0028
000000000000c230: 0x0006 0x0002 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c240: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c250: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c260: 0x0000 0x0000 0x0000 0x0000 0x0001 0x0000 0x0001 0x0000
000000000000c270: 0x0006 0x0000 0x0000 0x0000 0x0130 0x0000 0x0140 0x0000
000000000000c280: 0x0000 0x0000 0x0000 0x0000 0x0010 0x0000 0x0000 0x0000
000000000000c290: 0x0007 0x0000 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c2a0: 0x0270 0x0000 0x002b 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c2b0: 0x0001 0x0000 0x0000 0x0000 0x0011 0x0000 0x0002 0x0000
000000000000c2c0: 0x0000 0x0000 0x0000 0x0000 0x02a0 0x0000 0x0130 0x0000
000000000000c2d0: 0x0004 0x0000 0x0013 0x0000 0x0004 0x0000 0x0010 0x0000
000000000000c2e0: 0x0019 0x0000 0x0003 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c2f0: 0x03d0 0x0000 0x007d 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c300: 0x0001 0x0000 0x0000 0x0000 0x0021 0x0000 0x0009 0x0000
000000000000c310: 0x0000 0x0000 0x0000 0x0000 0x0450 0x0000 0x0018 0x0000
000000000000c320: 0x0003 0x0000 0x0001 0x0000 0x0004 0x0000 0x0008 0x0000
000000000000c330: 0xc766 0xf205 0x000f 0x0c00 0xb000 0xb413 0xcd00 0x6610
000000000000c340: 0x05c7 0x0ff2 0x0000 0x0008 0xc766 0xf405 0x000f 0x4000
000000000000c350: 0x6601 0x05c7 0x0ff6 0x0000 0x00c8 0x05c7 0x0ff8 0x0000
000000000000c360: 0x0000 0x000a 0x02b4 0x16cd 0xf1a2 0x000f 0xb000 0xe6ff
000000000000c370: 0x9021 0xa1e6 0x66fa 0x05c7 0x0ff4 0x0000 0x000d 0xace8
000000000000c380: 0x0000 0xb000 0xe6d1 0xe864 0x00a3 0x0000 0xdfb0 0x60e6
ふむ。
確かに予定アドレスへコードは読み込まれているようだし、動いても良いだろうと
思うのだが。。。
う〜ん。。。。(おっ!!)
そもそも、この前からよく分かっていない0xc200から入っているelfなんちゃって部分が
関係あるのかな。。。
Tips ELFフォーマットその1 ELFフォーマットについて
ここに詳しく書いてあるが、現状からするとこれがあっても、その先のバイナリへ
直接飛ばしてれば、そんなに問題があるようには思えない。
じゃ、なんで実行されないんだろう。。。
という事で、そうなら同じ事させた場合のバイナリコードの違いを見てみよう。
ipl10.lstよりJumpしてasmheadへ移る直前(上と同じ):
81 000000A8 882EF00F MOV [0x0ff0],BYTE CH ; IPLがどこまで読んだのかをメモ
82 ; JMP 0xc200
83
84 000000AC C606F10F0B MOV BYTE [0x0ff1],0x0b ; 進捗チェック用フラグ
85
86 000000B1 E9(30C3) JMP 0xc330
asmhead.lstより、最初の部分を抜粋(バイトアクセスへ修正):
18 ; 画面モードを設定
19
20 00000000 C605F20F00000B MOV BYTE [0x0ff2], 0x0b ; 進み具合テスト1
ん??
なんか、違ってねぇか??これか??
。。。。
よく考えたら、asmhead.nasのアセンブル事に、よく分からず変なオプションつけてた。。
asmhead.bin : asmhead.nas Makefile
# nasm asmhead.nas -o asmhead.bin -l asmhead.lst
nasm -f elf32 asmhead.nas -o asmhead.bin -l asmhead.lst
naskfunc.o : naskfunc.nas Makefile # naskfunc.nasのバイナリファイル作成
# nasm -g -f elf naskfunc.nas -o naskfunc.o -l naskfunc.lst
nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst
bootpack.hrb : bootpack.c hrb.ld naskfunc.o Makefile # リンク,コンパイル
# i386-elf-gcc -march=i486 -m32 -nostdlib -T hrb.ld -g bootpack.c naskfunc.o -o bootpack.hrb
x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c -o bootpack.o
x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o
この辺り、naskfunc.c側の処理とごっちゃになってて、
同じようなオプションにしたような。。
でも、結局、catでつなげているだけなんで、関係無いんじゃないか???
Makefile 内イメージファイル作る辺りより:
haribote.sys : asmhead.bin bootpack.hrb Makefile
cat asmhead.bin bootpack.hrb > haribote.sys
haribote.img : ipl10.bin haribote.sys Makefile
mformat -f 1440 -C -B ipl10.bin -i haribote.img ::
mcopy -i haribote.img haribote.sys ::
もしかして、asmheadは -f elf32なんてオプション外せば良いのでは。。。
Go!!!
$ make run
make -r img
make -r haribote.img
nasm ipl10.nas -o ipl10.bin -l ipl10.lst
nasm asmhead.nas -o asmhead.bin -l asmhead.lst
nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst
x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c -o bootpack.o
x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o
cat asmhead.bin bootpack.hrb > haribote.sys
mformat -f 1440 -C -B ipl10.bin -i haribote.img ::
mcopy -i haribote.img haribote.sys ::
qemu-system-i386 -L . -m 32 -monitor stdio -s -drive file=haribote.img,format=raw,if=floppy -boot a
QEMU 5.0.0 monitor - type 'help' for more information
(qemu)
よく見慣れた画面だ。
さて、ここでバイナリコードを確認!
ipl10.lst:
84 000000AC C606F10F0B MOV BYTE [0x0ff1],0x0b ; 進捗チェック用フラグ
85
86 000000B1 E9(30C3) JMP 0xc330
asmhead.lst:
18 ; 画面モードを設定
19
20 00000000 C606F20F0B MOV BYTE [0x0ff2], 0x0b ; 進み具合テスト1
21
22 00000005 B013 MOV AL,0x13 ; VGAグラフィックス、320x200x8bitカラー
良し!意図通り同じ命令!だったら、ここに飛んでれば絶対同じ動きするでしょ!!
(qemu) xp/100xh 0xff0
0000000000000ff0: 0x0b0a 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
0000000000001000: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
0000000000001010: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
0000000000001020: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
0000000000001030: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
う〜ん。。。やっぱり動いてない。。(涙)
コードはちゃんとロードされているのか?確認
(qemu) xp/200xh 0xc200
000000000000c200: 0x06c6 0x0ff2 0xb00b 0xb413 0xcd00 0xc710 0xf206 0x080f
000000000000c210: 0xc700 0xf406 0x400f 0xc701 0xf606 0xc80f 0x6600 0x06c7
000000000000c220: 0x0ff8 0x0000 0x000a 0x02b4 0x16cd 0xf1a2 0xb00f 0xe6ff
000000000000c230: 0x9021 0xa1e6 0xc7fa 0xf406 0x0d0f 0xe800 0x00b5 0xd1b0
000000000000c240: 0x64e6 0xaee8 0xb000 0xe6df 0xe860 0x00a7 0x010f 0x3a16
000000000000c250: 0x0f01 0xc020 0x2566 0xffff 0x7fff 0x8366 0x01c8 0x220f
000000000000c260: 0xebc0 0xb800 0x0008 0xd88e 0xc08e 0xe08e 0xe88e 0xd08e
000000000000c270: 0xbe66 0x0140 0x0000 0xbf66 0x0000 0x0028 0xb966 0x0000
000000000000c280: 0x0002 0x75e8 0x6600 0x00be 0x007c 0x6600 0x00bf 0x1000
000000000000c290: 0x6600 0x80b9 0x0000 0xe800 0x0060 0xbe66 0x8200 0x0000
000000000000c2a0: 0xbf66 0x0200 0x0010 0xb966 0x0000 0x0000 0x0e8a 0x0ff0
000000000000c2b0: 0x6966 0x00c9 0x0012 0x6600 0xe981 0x0080 0x0000 0x39e8
000000000000c2c0: 0x6600 0x00bb 0x2800 0x6600 0x8b67 0x104b 0x8366 0x03c1
000000000000c2d0: 0xc166 0x02e9 0x1074 0x6766 0x738b 0x6614 0xde01 0x6766
000000000000c2e0: 0x7b8b 0xe80c 0x0014 0x6766 0x638b 0x660c 0x1bea 0x0000
000000000000c2f0: 0x1000 0xe400 0x2464 0x7502 0xc3fa 0x6766 0x068b 0x8366
000000000000c300: 0x04c6 0x6766 0x0789 0x8366 0x04c7 0x8366 0x01e9 0xea75
000000000000c310: 0x00c3 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c320: 0x0000 0x0000 0x0000 0x0000 0xffff 0x0000 0x9200 0x00cf
000000000000c330: 0xffff 0x0000 0x9a28 0x0047 0x0000 0x0017 0x0120 0x0000
000000000000c340: 0x0000 0x0001 0x6148 0x6972 0x0000 0x0000 0x0000 0x0031
000000000000c350: 0x0000 0x0000 0x007d 0x0000 0x0000 0xe900 0x0010 0x0000
???
違わね?確かに当たり前かもしれないが、ヘッダ部分変わってる。。。
しかも、この命令は、見覚えが。。。。(asmheadの最初の命令!!)
000000000000c200: 0x06c6 0x0ff2 0xb0
って事は!!! ipl10.nasのJump先を直せば、もしかして!!!!
ipl10.lst:
86 000000B1 E9(30C3) JMP 0xc330 → 0xc200へ!
$ make run
make -r img
make -r haribote.img
nasm ipl10.nas -o ipl10.bin -l ipl10.lst
nasm asmhead.nas -o asmhead.bin -l asmhead.lst
nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst
x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c -o bootpack.o
x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o
cat asmhead.bin bootpack.hrb > haribote.sys
mformat -f 1440 -C -B ipl10.bin -i haribote.img ::
mcopy -i haribote.img haribote.sys ::
qemu-system-i386 -L . -m 32 -monitor stdio -s -drive file=haribote.img,format=raw,if=floppy -boot a
QEMU 5.0.0 monitor - type 'help' for more information
(qemu)
静止画では伝わりませんが、この画面がチラチラして、何度もブートが繰り返されている
ような動作に見える。。。(何かが変わったようだ。。)
ちなみにメモリ上のチェッカ部分はどうか?と確認
(qemu) xp/100xh 0x0ff0
0000000000000ff0: 0x000a 0x0008 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
0000000000001000: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
0000000000001010: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
ここは、予期せぬ動きで書き変わってしまっている。
コードはどうなったんだろう。。
(qemu) xp/200xh 0xc200
000000000000c200: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c210: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c220: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c230: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c240: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c250: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c260: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c270: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c280: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c290: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c2a0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c2b0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c2c0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c2d0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c2e0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c2f0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c300: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c310: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c320: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c330: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
000000000000c340: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
なぁにぃ〜!!!!!
空じゃねぇか!!!
もしかして、これか!!
asmhead.nasの先頭部分抜粋:
; ORG 0xc200 ; このプログラムがどこに読み込まれるのか
; 画面モードを設定
MOV BYTE [0x0ff2], 0x0b ; 進み具合テスト1
asmhead.nasの先頭は、確か -f elf32オプション付けた際にエラーになるので外してた。
(それでもちゃんと0xc200にロードはされたのに。。ちゃんと分かってない。。)
じゃ、これ戻して、実行じゃ!!
ORG 0xc200 ; このプログラムがどこに読み込まれるのか
コメントアウト用の ”;” の削除だけ!!
Go!!!
キタ〜 ♪───O(≧∇≦)O────♪!!!!
行ったじゃねぇか!!!!
イェ〜イ!(おっさん感半端ねぇか。。)
という事で、長い間全く進まず、本読んだり、Youtube観たり
寄り道ばかりしていたが、前進できた!!!
ただ、結論から言えば、ハマっていた理由は、全くのおバカさんな事のような気がするが、
まぁ、そういうものだろうと諦めずに、チョコチョコ続けていた自分を褒めよう。
という事で、これでC言語導入じゃ!!!
続く。