抜けたぁ。。。。

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アセンブル事に、よく分からず変なオプションつけてた。。

 

Makefile内 アサンブル及びコンパイル部分より:

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) 

 

f:id:kanazo3:20200531170119j:plain

 

よく見慣れた画面だ。

さて、ここでバイナリコードを確認!

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) 

f:id:kanazo3:20200531172026j:plain

静止画では伝わりませんが、この画面がチラチラして、何度もブートが繰り返されている

ような動作に見える。。。(何かが変わったようだ。。)

 

ちなみにメモリ上のチェッカ部分はどうか?と確認

(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!!!

f:id:kanazo3:20200531174443j:plain

 

キタ〜 ♪───O(≧∇≦)O────♪!!!!

行ったじゃねぇか!!!!

 

イェ〜イ!(おっさん感半端ねぇか。。)

 

という事で、長い間全く進まず、本読んだり、Youtube観たり

寄り道ばかりしていたが、前進できた!!!

ただ、結論から言えば、ハマっていた理由は、全くのおバカさんな事のような気がするが、

まぁ、そういうものだろうと諦めずに、チョコチョコ続けていた自分を褒めよう。

 

という事で、これでC言語導入じゃ!!!

 

続く。