K氏のheboOSをまねてみる

57:Re: K氏のheboOSをまねてみる
I.Tak. 10/07 12:19
独り言Wikiの NASK/文法 につっこみ! 誰もつっこまないのか……?

>MOV AX, AL
サイズの違う代入はできません。符号あり/なしの問題があるので,
MOVZX AX, AL ; 符号無し拡張
MOVSX DX, CL ; 符号付き拡張
を使います。

>MOV [0x100],[0x200]
MOVではメモリ間コピーはできません。

>MOV [0x100], 0x1F
メモリの大きさを指定してください。byteで書くべきところにwordで書いたら大変ですよ!

>ADD AL, AX
>SUB AL, AX
サイズの違う演算は(略

>JMP [0x400] ;「セグメント値+400」番地にジャンプし、実行を始める
こいつは "オフセット0x400からオフセット値(リアルモードではwordサイズ)を読み込んでそこへジャンプ" します。
ブラケット[]で囲ってあるのは LEA 以外全てメモリアクセスをするのです。
オフセット0x400 へのジャンプは単に JMP 0x400 とします。

>LOOP ; CXレジスタがゼロになっていない限り、指定したアドレスにジャンプする。
CXから1を引いて, 0にならない限り, 指定のオフセットへジャンプします。……が, ジャンプできる距離が -128〜127 と狭いので注意。

>LOOP [0x200]
LOOPはメモリからジャンプ先を読み込むことができません。必ずラベルを指定します。

>CALL
サブルーチン処理にジャンプする前に, 戻る場所のオフセット値をスタックに積みます。
RETで戻れるのはそういうカラクリなのです。


アドレスは必ずセグメントとオフセットの組で指定するものですが, セグメントから出る気がなければ, アドレス=オフセットで話は通じます
気合と余裕がありあまっていれば, Intelのマニュアルの中巻 (インストラクションマニュアル) を眺めてみると面白いかもしれませんよ。


1-

BluesBB ©Sting_Band