雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
================================================== [BITS 16] [OPTIMIZE 1] [OPTION 1] [INSTRSET "8086"] [FORMAT "BIN"] ORG 0x100 ;---------------------------------------------- ;-----------初期値。AXに開始セクタ値、DXに終了セクタ値 MOV AX,1440 MOV DX,161 ;--繰り返す回数を求めておく。 SUB DX,AX ;DXの値は破壊されるが、回数が得られれば ;いらないはず。 PUSH DX ;値(回数)をスタック位置1にバックアップ ;--セクタ値を求める ;-----------s = R mod A + 1 ;--セクタ値がもっとも簡単に求められるので。 PUSH AX ;レジスタのバックアップ MOV DL,18 ;シリンダ内セクタ数(A)をDLにセット DIV dl ;R ÷ Aを実行。AHに余りがセットされる。 ADD AH,1 ;+1を実行。これでAHにはセクタ数が入った。 ;スタックに積むため16ビットに整形 MOV AL,AH MOV AH,0 MOV DX,AX ;次、AXに書き戻しがあるのでDXに複製 POP AX ;AXの値も戻す。 PUSH DX ;値(セクタ数)がスタック位置2にバックアップ ;ーーこの時点で、AXに開始値、スタックに回数とセクタ数がセットされている ;--ヘッドとシリンダの値を求める--- PUSH AX ;AXには論理セクタ値が入っている。一旦バックアップ。 MOV AX,2880 ;AXに総セクタ数をセット MOV DL,18 ;DLにシリンダ内セクタ数をセット DIV DL ;割り算。これで総シリンダ数がわかる ;商はALレジスタに入っている。 MOV AH,0 ;割り算用に、ALを強制的に16ビット化 MOV DL,2 ;DLにヘッド数をセット DIV DL ;総シリンダ数 ÷ ヘッド数。これで1つの面に ;あるシリンダ数がわかる。商はALに入っている。 MOV DL,AL ;一面シリンダ値をDLにセット(退避) POP AX ;論理セクタ値を戻す MOV DH,18 ;空いているDHにシリンダ内セクタ数をセット DIV DH ;これで論理シリンダ数?がALに入る。 MOV AH,0 ;強制的に論理シリンダ数?を16ビット化 DIV DL ;論理シリンダ数?を片面シリンダ数で割る。ALに入った ;商がヘッド値となり、AHに入った余りがシリンダ数になる。 ;BIOS呼び出し用の定位置にするため、入れ替え POP DX ;DXにセクタ数が戻る。しかし下位8ビットしか意味がない。 MOV DH,AH ;これでDXの値は呼び出し時のCXと同じになった。 ; MOV AH,AL MOV AL,0 ;これでAXはBIOS呼び出し時のDXと同じになった。 ;--end--- ;---------------------------------------------- MOV AX,0x4c00 INT 0x21 ===============================================
最終更新: 2024-01-06 (土) 22:39:10 (JST) (104d) by