K氏のheboOSをまねてみる

31:Re: K氏のheboOSをまねてみる
hideyosi 09/26 17:31
くっそぉ〜!!! LIDTがわからん。(もしかしてNASKでは使えない?)
あかん。仕事の時間じゃ!

feelさん、アドヴァイスどうもありがとうです〜






32:INT 0x09 の乗っ取り
-- K 09/26 17:48
 もちろんLIDTはnaskでも使えます。使えますが、それではおそらくhideyosiさんのやりたいことを達成できないと思うので、簡単に説明します。

 とりあえずIDTのことは忘れていいです。

 もしINT 0x09を(BIOSから)乗っ取りたいのなら、INT 0x09が来たときに実行してほしいプログラムをどこかに書いて、

(例)

int09:
  ごにょ

そんでもって、

  MOV WORD [0x09*4+0],int09
  MOV WORD [0x09*4+2],0

とすればいいです。他の割り込み番号であれば、0x09の部分を変えればOKです。最小値は0x00で最大値は0xffになります。
 最小値のとき、アドレスを電卓で計算すると、0x0000と0x0002になります。最大のとき、アドレスを電卓で計算すると、0x03fcと0x03feになります。・・・ということで、割り込み関係の設定は全部で0x0000から0x03ffというわけですが、これは、

  http://community.osdev.info/index.php?(AT)memorymap

の「ソフトウェア的用途区分」にも書いてあるわけです。

 ちなみに、[0x09*4+0]や[0x09*4+2]に書いてある値を調べれば、いつでも割り込みが起きたときにどういう処理をしているのかが調べられます(もちろんそのアドレスにかかれているプログラムを解析すれば、という意味です)。

めでたしめでたし。

33:Re: INT 0x09 の乗っ取り
feel 09/26 18:49
なるほど
自分もあまり割り込みについて・・・なところが多かったので
少しずつですがわかってきました
有難うございます

で、記述ミスっててんやわんやしてる自分がいる・・・

34:Re: INT 0x09 の乗っ取り
hideyosi 09/27 14:46
うわー! 
Kタンありがとう!!! 助かります!!!。
(つか、まーたKタンに助け船を出されてしまいました。嗚呼、情けなや・・・ (T∀T)  もっと昇進しなくては・・・)
↑ これは、「要石」ですので。Kタン感謝してます


ってなわけで、こんなのを書いてみる。
これでいけるぞぉぉぉ!


------------------------------------------------
[BITS 16]
[OPTIMIZE 1]
[OPTION 1]
[INSTRSET "8086"]
[FORMAT "BIN"]
ORG 0x100


;画面クリア
;カーソルを0,0に設置して
; MOV BH,0
; MOV DH,0
; MOV DL,0
; MOV AH,0x02
; INT 0x10

;全画面消去(80文字24行)
; MOV AL,0
; MOV BH,0
; MOV CH,0
; MOV CL,0
; MOV DH,24
; MOV DL,80
; MOV AH,0x06
; INT 0x10

MOV CX,5 ;ループのカウンタ
JMP PTCHA




PTCHA:
;文字を表示するループ

MOV AL,0x41
MOV AH,0x0e
INT 0x10

LOOP PTCHA

JMP ENDPG


ENDPG:
;ループからの脱出を確認するためにBを表示
MOV AL,0x42
MOV AH,0x0e
INT 0x10

;BIOSのキー入力を乗っ取る
MOV WORD[0x09*4+0],IINT09
MOV WORD[0x09*4+2],0


JMP GULGUL


;キー入力を待つループ
GULGUL:
JMP GULGUL





IINT09:
MOV CX,5
MOV AL,0x43
MOV AH,0x0e
INT 0x10

JMP ENDPG








EEND:
;MS-DOS終了
INT 0x20

--------------------------------------------------------

・・・・あっれぇ???
ウンともすんとも言わないなぁ。
間違っていないはずなんだが・・・・・

は!!!

割り込み許可・・・・ これか!!!!!!


35:Re: INT 0x09 の乗っ取り
hideyosi 09/27 15:07
うーん。なるほど。割り込みにはジャンルがあると。

●なにやってもどーしても、CPUの仕様として発生する割り込み
●CPUの仕様として決まっている。しかし許可したり禁止したりできる
●もともとはない。プログラマが好きに設定できる(しなくてもいい)割り込み

・・・・私の現在の想像。

たぶん、MS-DOSが走っている上体では、禁止できる割り込みは禁止されている。(今回のキーボードとか)
だってそうしないと、勝手にチンチンバラバラと割り込みを処理されてしまうから。
キーボードの割り込み(入力の発生と検知)はみんなMS-DOSが受け持つような仕様になっている。
いま、私はアセンブラで、割り込みが発生した場合にジャンプすべき場所を書いてあるところ(割り込みベクタテーブル)を書き換えて、私が書いたプログラムへジャンプするようにした。
しかし、そもそもキーボードの割り込みは発生しない。(もしくは、発生しても弾かれてしまっている)
キーボード割り込みが不許可(マスクされている)から

先に、とにもかくにも「キーボードの割り込み」だけでも許可をしておかないと、このプログラムは動かない

・・・・かな?
えーっと・・・割り込みの許可は・・・・フラグレジスタ?
どれじゃどれじゃ・・・・(がさごそ)







36:Re: INT 0x09 の乗っ取り
hideyosi 09/27 15:25
うーん。おっかしなぁ。どこ探してもそんなレジスタが見つからないなぁ。。。

・・・・ベースアドレス0x21と0xF7・・・・・

これか!??  これなのか???

37:Re: INT 0x09 の乗っ取り
hideyosi 09/27 15:39
んんん???
レジスタ!? 0x20と0xF7を、レジスタ「みたいに」使っているってこと???

え? じゃあ、0x20と0xF7に、00000000(0x0)を代入すれば、全ての割り込みが許可されるってこと???


38:Re: INT 0x09 の乗っ取り
-- K 09/27 16:25
ああそうか、DOSで動かしている場合もあるんだっけか。
それなら、

  MOV WORD [0x09*4+0],INT09
  MOV WORD [0x09*4+2],CS

にしてください。0ではなくてCSです。OSとして(?)起動した場合はいつもCSが0だったので、忘れていました。

なお、キーボード割り込みは既に許可されているはずです。
そうでないと、MS-DOSもキー入力ができません。

39:Re: INT 0x09 の乗っ取り
hideyosi 09/27 22:22
たーー!
くっそ!アカンぜよ・・・(T∀T)

おっかしいなぁ。これでAをずーっと書き続けて、キーボードを押すと、それがBになるはずなんだけどなぁ・・・


------------------------------------------------
[BITS 16]
[OPTIMIZE 1]
[OPTION 1]
[INSTRSET "8086"]
[FORMAT "BIN"]
ORG 0x100

;表示文字「A」をセット
MOV AL,0x41

;BIOSのキー入力を乗っ取る
MOV WORD[0x09*4+0],IINT09
MOV WORD[0x09*4+2],CS

;ループにジャンプ
JMP GULGUL



;キー入力を待つループ
GULGUL:

;ループが廻っているのがわかるようにALレジスタの文字を表示
MOV AH,0x0e
INT 0x10

JMP GULGUL


IINT09:
;ALレジスタの文字を「B」に切り替える
MOV AL,0x42

RET



EEND:
;一応保険
;MS-DOS終了
INT 0x20
------------------------------------------------------

・・・ところで、今回Kタンにもらったアドヴァイスなんだけど、ん??? 物理的な絶対アドレスって、書き込めるのか?
WORDってなんじゃらほい???

もーすこし研究してみないと。

40:Re: INT 0x09 の乗っ取り
-- K 09/27 23:48
ああそうか、DSだって0とは限らないわけか!
僕ってかなりそそっかしいな。

  MOV WORD [0x09*4+0],IINT09
  MOV WORD [0x09*4+2],CS

これは失敗で(すみません!)、

  MOV AX,0
  MOV ES,AX ; ESを0にする。
  MOV WORD [ES:0x09*4+0],IINT09
  MOV WORD [ES:0x09*4+2],CS
  MOV AX,DS
  MOV ES,AX ; ESをもとにもどす。

が正解でした。

ちなみに、RETはCALLに対するもので、INTに対するものはIRETです。

1-

BluesBB ©Sting_Band