Message Log 30 Return to Parent Menu 
Last Updated by 07/01/05(Fri)  

 
Tips
 

 やっぱり 2001 年もアセンブラッ!!だねっ


 
Message log list
 

 アセンブラ掲示板に書き込まれた過去のログです。


Message log 44 (05/01/0506/30/05)
Message log 43 (01/01/0504/30/05)
Message log 42 (01/01/0412/31/04)
Message log 41 (11/01/0312/31/03)
Message log 40 (10/01/0310/31/03)
Message log 39 (04/01/0309/30/03)
Message log 38 (12/01/0203/31/03)
Message log 37 (08/01/0211/30/02)
Message log 36 (05/01/0207/31/02)
Message log 35 (03/01/0204/30/02)
Message log 34 (01/01/0202/28/02)
Message log 33 (09/15/0112/31/01)
Message log 32 (08/01/0109/14/01)
Message log 31 (05/26/0107/31/01)
Message log 30 (05/15/0105/25/01)
Message log 29 (05/01/0105/14/01)
Message log 28 (02/01/0104/30/01)
Message log 27 (01/01/0101/31/01)
Message log 26 (10/01/0012/31/00)
Message log 25 (07/21/0009/30/00)
Message log 24 (06/16/0007/20/00)
Message log 23 (05/20/0006/15/00)
Message log 22 (05/01/0005/19/00)
Message log 21 (04/01/0004/30/00)
Message log 20 (02/01/0003/31/00)
Message log 19 (01/01/0001/31/00)
Message log 18 (11/01/9912/31/99)
Message log 17 (09/05/9910/31/99)
Message log 16 (08/21/9909/04/99)
Message log 15 (07/01/9908/20/99)
Message log 14 (04/01/9906/30/99)
Message log 13 (02/01/9903/31/99)
Message log 12 (11/01/9801/31/99)
Message log 11 (09/21/9810/31/98)
Message log 10 (08/01/9809/20/98)
Message log 09 (07/01/9807/31/98)
Message log 08 (05/04/9806/30/98)
Message log 07 (04/08/9805/03/98)
Message log 06 (02/23/9804/07/98)
Message log 05 (01/01/9802/22/98)
Message log 04 (11/09/9712/31/97)
Message log 03 (10/17/9711/08/97)
Message log 02 (08/22/9710/16/97)
Message log 01 (06/20/9708/21/97)


 
Message log 05/15/0105/25/01
 




京都アセンブラ会  [2001/05/25 Fri 16:01:20]  [210.163.44.76]
おわび

下記の書き込みで、記事及び本人とまったく無関係なURLが混じってしまってしまいました。
京都アセンブラ会  [2001/05/25 Fri 15:41:26]  [210.163.44.76]
http://homepage1.nifty.com/marimono/

■akatesさん

ちょっと昔へのコメントですが、

>ハードウェア機能です。具体的には、port 461h/43Fhなどを使います(って98
この機能は、PCI搭載マシンでは完全に廃止になりました。
9821Xeをお使いとのことなので、大丈夫ですが。

京都アセンブラ会  [2001/05/25 Fri 15:31:26]  [210.163.44.76]

■シカ野郎さん

>void sub(double hiko[10][2]);

のような、仮引数に2次元配列を書くことができるというのは便利
ですね。「普通のC」ではこんな書き方はできないので、2次元
配列を渡すとなると、大変なのですが。

lea では値がおかしいが movでは正しいというのは、
VC++の作成するアセンブルソースを見ると判ります。
このように仮引数受けすると、2次元配列の値のコピーが渡される
のではなく、配列先頭のアドレス値が渡されるのですね。
(付記数に積むときに、 lea eax, hikoが行なわれています)
したがて、sub 側で受け取るときに、subで書いたhikoは、
値になっていますから、 movで受けないといけないことに
なります。

 なお、8086では、 tiny modelでないと、 DS != SSである
かもしれないので、lea命令を使うこと自体意味が無くなる場合が
あります。

なべちゃん  [2001/05/24 Thu 14:14:09]  [202.236.152.84]

>詳細な仕様が記述されているページを教えていただけないでしょうか。

某有名古本屋でたまにみかける「応用MS-DOS / ASCII」に仕様が載ってます。
インタラプトリストなどになければ、ソースを探すのがいいように思います。

なべちゃん  [2001/05/24 Thu 14:11:13]  [202.236.152.84]

あんまり書き込みが多くて忙しかったので、読めませんでした。

>VIF

私は 486 までしか知らないのでよくわからないのですが、
少なくともその時代までハードウェアにはその機能はなかったはずです。
それから、Win95 は i386 以降対応だった気がします。
また、WinNT系(4.0以降)はDOSプロンプトが完全なエミュレーションです
ので、cli で飛ばないのは自然かもしれません。

>DOS-Extender
使って見たいなら、手前味噌ですが http://www.abk.nu/dosext/dosext.htm を。
他には go32 や dos4g といったところでしょうが、詳しくは知りません。
Windows も一種の DOS-Extender でして、DOS上で "プロテクトモードプログラミング"
をすることを可能にしています。

32bit の命令コードのプログラムを DOS上 で"うまく"実行するしくみと捕らえるのが
一番いいのかもしれません。

H8/300  [2001/05/23 Wed 15:48:36]  [210.154.69.211]

組み込みでFAT12/16を読み書きすることになったのですが、
肝心の仕様がわかりません。

詳細な仕様が記述されているページを教えていただけないでしょうか。
Ichi  [2001/05/22 Tue 14:27:04]  [211.13.1.224]

すいません、ひたすら嘘書きまくってました。ごめんなさい。_(_ _)_

仮想86モードにおいて、「CR4.VME=1かつIOPL!=3」(*)
のときは、VIF, VIPが有効になり、cli/stiは特別な処理をする。(Pentium以降)
そうでなく、IOPL=3の時は、cli/stiはIFを変更する。

つまり、仮想86モードでIOPL=3ならば、(Win9xのように)
cliすると割り込みが禁止されてしまいます。
(これを書いていれば一発で解決したのに……すみません)

cliで割り込みが禁止されるのがまずいならば、
(*)の状態にして処理するのがよいようです。

でも、とするとNTの動作が謎ですね。
VIFが変更されるのは
・仮想86モードで(*)のとき
・保護モードでCR4.PVI=1かつIOPL!=3のとき
だけなのになぜVIFが変更されるのでしょう。

NTのコマンドプロンプトはpure DOSの環境をエミュレートしていない、
ということをきいたことがありますが、そのあたりはどうなんでしょうか。

>(仮想86モニタがどういう処理をすべきかについては、上巻の16.3.2を)
下巻です。

> pushf(d)って保護モード時はフラグを直接コピーしない
仮想86モードかつ(*)の時です。


■シカ野郎さん
・leaとmovの違い
mov eax, [ebp+4]
とすると、eaxには、ebp+4が指す先の値が入り、
lea eax, [ebp+4]
とすると、eaxには、ebp+4の値が入ります。

int型のポインタpがあったとして、
eax = *pがmov eax, [p]に、
eax = (int)pがlea eax, [p]に
それぞれあたると思ってください。

で、foo[16][16]という配列があったとき、
fooの先頭アドレスをaddrとすると、
mov eax, offset fooは、mov eax, addr、
mov eax, fooは、mov eax, [addr]、
lea eax, fooは、lea eax, [addr]、
と同じです。

で、addrが実際どんな値になるかを考えれば
なぜoffset fooで駄目な場合があるのかが分かると思います。
シカ野郎  [2001/05/22 Tue 02:37:59]  [211.0.172.70]

Ichiさん、はじめまして。
早速レスどうもありがとうございました!m(_ _)m

いや〜、leaですか。なるほど〜。
早速やってみました。leaにするとうまくいきました。
本当にどうもありがとうございました。

ところで、まだいまいち理解していないのですが、いろいろと試していまして、例えば下のような場合は、leaではダメでmovだとOKになります。

どういうときに、leaを使い、どういうときにmovで配列の先頭アドレスを取得すればよいかいまいち良く分かっていないのですが・・・。
どういう違いによってこうなるのでしょうか?

もしよろしかったら教えてください。
よろしくお願いします。

// test.cpp : コンソール アプリケーション用のエントリ ポイントの定義
//

#include "stdafx.h"

void sub(double hiko[10][2]);

int main(int argc, char* argv[])
{
double hiko[10][2];

hiko[0][0] = 5.;
hiko[0][1] = 7.;

sub(hiko);

printf("mona= %f\n", hiko[0][2]);

return 0;
}
void sub(double hiko[10][2])
{
__asm {
mov esi, hiko ;<---mov だと大丈夫
;
xor eax, eax

fld qword ptr [esi]
add eax, 8h
fmul qword ptr [esi][eax]
add eax, 8h
fstp qword ptr [esi][eax]
}
}
Ichi  [2001/05/22 Tue 01:30:16]  [211.13.1.220]

■シカ野郎さん
(略)
>Cの配列の先頭アドレスをインラインアセンブラで受け取り、
>上記のような処理をするにはどうすればよいのでしょうか?
hiko[10][2]がスタック上にあるのがまずいんですね。
hikoのアドレスはebp+xxと表されますから、
mov eax, offset hiko
は、
mov eax, ebp+xx
となります。これは不可です。

lea eax, hiko
(すなわちlea eax, [ebp+xx])
とすれば、eaxにhikoのアドレスであるebp+xxが代入されます。

>コンソールアプリケーションは、
プロテクトモードで動いています。
Ichi  [2001/05/22 Tue 00:36:31]  [211.13.1.220]

■カトさん
pushf(d)って保護モード時はフラグを直接コピー
してくれるわけではないんですよ。困ったことに。
# 正確にどう言う動作をするかまではまだ理解してませんが

■akatesさん
>「割り込みを許可していて実際に割り込みが入った場合、
>それに対してWindowsはどのような処理をすると思われますか?」

>>Win9xでは、
>>>「割り込みを許可していて実際に割り込みが入った場合、
>>のような状況(IF=1 and VIF=0)にはならないと考えます。
>えーと、これは背理法的手法、というやつでして...
>「Aである」という結論を導くために、わざと「Aでないとしたら」と考える、という方法です...
はあ。でも、背理法だったとしたら、
結局どんなAを示したかったんですか?
# 背理法って、「仮定する」、「矛盾する」、結論、の
# 少なくとも一つを明示しないと非常に分かりにくい
シカ野郎  [2001/05/22 Tue 00:08:12]  [61.119.132.187]


はじめまして。

最近、Visual C++のインラインアセンブラでプログラムを組み始めているので
すが、Cの配列をインラインアセンブラで受け取る方法がわかりません。

例えば、下のようなプログラム

#include <stdio.h>
int main()
{
double hiko[10][2];

hiko[0][0] = 5.;
hiko[0][1] = 7.;

__asm {
mov esi, hiko
;
xor eax, eax

fld [esi]
add eax, 8h
fmul [esi][eax]
add eax, 8h
fstp [esi][eax]
}

printf("mona= %f\n", hiko[0][2]);

return 0;
}

これは、hiko[][]という2次元配列を作って、5と7を掛け算して、その結果
をhiko[0][2]にいれようというものですが、コンパイルは問題なく通るのです
が、実行すると、範囲外のメモリ参照エラーが出てしまいます。

また、これはhiko[][]と2次元配列ですが、1次元配列hiko[]にしてやってみ
ると、

mov esi, hiko

がダメだと言ってコンパイルできません。

VC++のマニュアルを見ると、

mov esi, offset hiko

のようにすれば良いのかとも思われるのですが、実際に offset というのを付
けると、コンパイルエラーとなり、コンパイルできません。

Cの配列の先頭アドレスをインラインアセンブラで受け取り、上記のような処
理をするにはどうすればよいのでしょうか?

もしご存知の方、いらっしゃいましたら、教えていただけたら幸いです。


また、Visual C++で作るコンソールアプリケーションは、DOS窓で動きます
が、これって仮想86モードで動いているのでしょうか?それともプロテクト
モードで動いているのでしょうか?

よろしくお願いしますm(_ _)m

力卜  [2001/05/21 Mon 21:22:31]  [202.248.126.150]

お久しぶり?です。なかなか時間が取れないのです。

akatesさん:

力卜> 仮想86モードで cliをした状態って、...
> Windows9xのDOSプロンプトの話ですよね?

いや、Windows NT/2000のコマンドプロンプトなど(あとはOS2とか?)も対象に考えていました。
Win9x/MeもWinNT/2000も、DOSアプリでのcli/sti命令について同じ挙動をすると *思ってました* ので。

質問が何を意図していたかというと、『WinNT/2000のような、安定してマルチタスクで
ちゃんと動作しなければいけないようなOSでは (ってことは、そもそも Win9xは対象外?)、
「DOSアプリのcli命令など特権命令によってOSの安定性やマルチタスク動作が阻害されてはならない」
から、「cli/sti命令やそれにより制御されるDOS上の割り込みはエミュレートで再現されているだけで、
裏ではOS自身がちゃんと制御を握っている(当然、本当には割り込みは禁止されていない)」んだよね?』
ということを、確認した(特に誰に対してってワケじゃないです)つもりだったのですが、
Win9xでは本当に単純に割り込みが禁止されているらしい、ってことなんですね。
# これは初耳で、当然知りませんでした。棚からぼた餅ですね。

私も "cli, jmp $" を、PC/AT版 Win95BとFM-TOWNS版 Win95の MS-DOSプロンプトと、
Win2000Pro(none SP)のコマンドプロンプトで実行してみましたが、Win95ではマウス
カーソルの移動どころか、CTRL+ALT+DEL さえ効かなくなりましたが、Win2000では
ちゃんとコマンドプロンプトのプロセスを強制終了することができました。
# WinMeでも、Win95と同じなんでしょうかね?

EFLAGSの値をpushし、EBXなどにpopして、その値を表示するDOSプログラムを作って実験してみました。

(a) PC/AT版 Win95Cの MS-DOSモード(pure DOS/Command prompt only)
(b) PC/AT版 Win95Cの MS-DOSプロンプト(DOS窓)
(c) PC/AT版 Win2000Pro(none SP)/NT4.0SP5の コマンドプロンプト(CMD.EXE)
(d) PC/AT版 Win2000Pro(none SP)/NT4.0SP5の COMMAND.COM

(a) COMファイル実行時のEFLAGSの初期値 = 00007202h, cli後 = 00007002h, sti後 = 00007202h.
(b) COMファイル実行時のEFLAGSの初期値 = 00003202h, cli後 = 00003002h, sti後 = 00003202h.
(c) COMファイル実行時のEFLAGSの初期値 = 000B7002h, cli後 = 00037002h, sti後 = 000B7002h. (※)
(d) COMファイル実行時のEFLAGSの初期値 = 000B7202h, cli後 = 00037202h, sti後 = 000B7202h. (※)
※ NT4.0では、000B7xxxh / 00037xxxh ではなく、000B3xxxh / 00033xxxh でした。

結果は以上で、WinNT/2000での挙動は、Ichiさんが書かれたとおり(VIFが操作される)でした。
ちゃんとDOSアプリで割り込み禁止をエミュレートしてるのかなぁ?(してないと困る) > WinNT/2000
# これも実験してみればわかるので、いつか確認する…かも知れませんが(弱気)。

ではでは。

akates  [2001/05/21 Mon 05:17:30]  [211.10.154.229]

>Win9xでは、
>>「割り込みを許可していて実際に割り込みが入った場合、
>のような状況(IF=1 and VIF=0)にはならないと考えます。

えーと、これは背理法的手法、というやつでして...
「Aである」という結論を導くために、わざと「Aでないとしたら」と考える、という方法です...

>すぐ上の理由(〜ということから、)を読んで下さいよぉ。(T_T)

ああ、すいません。そういうことではなくて、「カトさんの質問」という前提があるのになぜ? ということでして... ちょっと言い方がおかしかったです。

>(http://www.intel.co.jp/jp/developer/vtune/v4/cbts/refman.htm
>をご存じなかったのですね

まるっきり見たことありませんでした...申し訳ありません...
どうも発言する資格なかったようですね...ものを知らなすぎました...
もちろん私の問題なのですが、電話代何百円も使うと怒られちゃうので...
アクセスしてみたいページはたくさんあるのですけれど...
Ichi  [2001/05/20 Sun 17:19:42]  [211.13.2.114]

■akatesさん
>エミュレートには「問題となる場合がある」ということが
>いいたかったので... 実際に暴走が止められないのに、
>なぜ、問題のある処理をあえてするのか
そこです。エミュレートするとうまくいくから
エミュレートするのではなく、

「エミュレートしないとうまくいかない」

から仕方なくエミュレートするのです。
DOS上でWindows用のプログラムをそのまま動かせないのと同様に、
Windows上でDOS用のプログラムをそのまま動かすことはできません。

エミュレートしない場合を考えてみてください。
すべてのハードウェア割り込み(&I/O)を
DOSプログラムに直接処理させることになります。
(WindowsがDOSに変身したようなもの)
すると、システムを維持することなどとてもできません。

―エミュレートして問題が起こるなんて当たり前!
―エミュレートしない場合の問題のほうがはるかに重大!
―「まともな」OSにするためにはエミュレートすることが必要不可欠!


----ここから重要----

>実際に暴走が止められないのに、
>なぜ、問題のある処理をあえてするのか、と。割り込み
>禁止にしてしまっても同じでことではないか、と。
ここです。
「cliした後『割り込み禁止(IF=0)にしてしまう』」(A)
ようだということは容易に推測できます。
また、「cli後『暴走が止められない』のは
『割り込み禁止にしてしまう』からだ」(B)と考えられます。

さらに、「Win9xが『問題のある処理(割り込みハンドラを呼んで、
I/O等をエミュレート)』をするのは、
割り込みを禁止していない状態(IF=1)のとき」(C)です。

(A)(C)を考えると、
Win9xはcli後、「問題のある処理」をしていません。

よって、(B)も考えると、
>実際に暴走が止められないのに、
>なぜ、問題のある処理をあえてするのか
という疑問は意味をなさないのです。(なので、答えられない)

----ここまで----


そして、私は、
>実際に暴走が止められない
のは、Win9xのバグと言ってもよいと思っています。
# ちゃんと処理してくれればcliしようが
# Windowsは止まらないはずだ

インテル・アーキテクチャ・ソフトウェア・ディベロッパーズ・マニュアル
に書いてあるような処理をすれば、DOSプログラムがcliをしたって
暴走しないと思います。でもWin9xはそうしていないようなんですよね。
# そりゃあ、めちゃくちゃ大変だけど、
# そのへんちゃんとやってくれないと
# OSとして失格だよなぁ。

akates  [2001/05/20 Sun 15:10:57]  [211.10.154.150]

>Win9xはハードウェア割り込みを
>エミュレートしているであろうことも付け加えておきます。

...Windowsが通常の割り込み処理時、プロテクトモードのドライバですべてを処理した後、リアルモードINTに接続し、I/Oをエミュレートしているのではないか、と思われる場合があります。
それは、DOSプロンプトがアクティブの場合のAlt+' 'やTABなどの処理がその可能性があると思われます。
こうしたキーが入力された場合、AltはリアルモードINTに接続しているが、その次の(Altと同時に押される)キーが' 'やTABなどの場合には接続せず、普通の文字キーとかの場合には接続がされているようです。これは接続より前にキーコードが読まれていることを示しており、そこでリアルモードINTに接続する場合には、I/Oをエミュレートするか何かの処理によって、キーコードが引き取られていないようにみせかける必要があるものと思われます。
(PC-98だったらキーボードコントローラを操作してペンディングが効いたり、再送要求できましたが、私はPC/ATの場合はよくわかりません。ただPS/2タイプでは任意のキーコード発生コマンドがあるらしいですが)
もちろんI/Oをエミュレートしている可能性はあります。が、私は、エミュレートには「問題となる場合がある」ということがいいたかったので... 実際に暴走が止められないのに、なぜ、問題のある処理をあえてするのか、と。割り込み禁止にしてしまっても同じでことではないか、と。
おかしな表現になっていることは謝ります。
Tsuyoshi  [2001/05/20 Sun 12:42:41]  [211.8.108.163]

Tsuyoshiです。

>...なにいっ!?
>特に理由がないだとうっ?
>みんなくろうして自分でしらべてるのにい!
>けしからんっ!!

ぐはっ、言われてしまった・・・。しかたないか。


>本当にピーターノートンはおすすめですよ。ハイレベルな読み物としても面白いですし。

出来れば買いたいです。(ゆくゆく書庫は必ず手に入れるつもりです。)


>それとどんなCの本を読まれましたか。

えーと、まず初めに買ったのが、
「明解C言語 第1巻 入門編 -BY SOFT BANK Publishing-」で、
その後
「プログラミング言語C -By K&R-」
を買いました。両方とも、宮脇書店で・・・。

後で買った本は、何やら、僕にとっては、かなりハイレベルなことが書かれていて、
最後のほうの話は、理解度が浅いままで終わっています。でも、
その本で、OSは偉い!まさに縁の下の力持ちである、と実感できました。


>DOSエクステンダは...一言でいうと、プロテクトモードで本当は
>呼び出せないはずのリアルモードのサブルーチンを呼び出せるように
>するサポートシステムプログラムです。(だと思う)

>DOSを拡張して、
>「プロテクトモードのプログラムが簡単に
>書けちゃう」ようにするもの、ではないですか?

・・・要するに、DOS-Extenderですから、'DOSを拡張して'
プロテクトモードをサポートするシステムプログラム、ってことですね。
はい、理解できました。


>うっ。インテル・アーキテクチャ・ソフトウェア・ディベロッパーズ・マニュアル
>(http://www.intel.co.jp/jp/developer/vtune/v4/cbts/refman.htm
>をご存じなかったのですね。読んでみてください。

僕も読んだことなかったです。それで、さっそくちらりと覗いてみたら、
独りで「やっほぅ!」なんて叫んでしまいました(^^;)。
いやね、あんなサイトを見たことなかったので、嬉しくてつい・・・。

では。
Ichi  [2001/05/20 Sun 00:58:31]  [211.13.3.6]

えーと、要するに、

Win9xのDOSプロンプトでcliを実行すると、
システムが停止してしまうので、
Win9xは、IF=0にしてしまっていると思われる。(*)
よって、cliをした後にハードウェア割り込みが
起こることはない。(カトさんの疑問への答)
よって、Win9xで、
>「割り込みを許可していて実際に割り込みが入った場合
を考える事ができない。

ということです。
# 本当に(*)が正しいかどうかが不明なのが痛い
Ichi  [2001/05/20 Sun 00:35:05]  [211.13.3.6]

>DOSエクステンダは...一言でいうと、プロテクトモードで本当は呼び出せないはずの
>リアルモードのサブルーチンを呼び出せるようにするサポートシステムプログラムです。(だと思う)
DOSを拡張して、
「プロテクトモードのプログラムが簡単に
書けちゃう」ようにするもの、ではないですか?
# 4GBのアドレス空間は広いや♪ 1MBとは大違い
Ichi  [2001/05/20 Sun 00:21:43]  [211.13.3.6]

>IOPL=3ということは、
>sti, cliは#GPを引き起こしません
の部分ですが、嘘です。訂正させてください。
VIP(仮想割り込み保留フラグ)がセットされている場合は、
IOPL=3でも、stiによって#GPが引き起こされます。

>まず、なぜ質問には答えてくださらないのかちょっと理解に苦しみます。
解答は、
>Win9xでは、
>>「割り込みを許可していて実際に割り込みが入った場合、
>のような状況(IF=1 and VIF=0)にはならないと考えます。
です。

>>Win9xでないOSの話を
>>しようとしていると考えたのですが、
>なぜそう思われたのかわかりませんが
すぐ上の理由(〜ということから、)を読んで下さいよぉ。(T_T)
理由としてはちょっとアレ(あいだが抜けてる)でしたけど。
ので、直接的な理由を言えば、
>>「割り込みを許可していて実際に割り込みが入った場合、
>のような状況(IF=1 and VIF=0)にはならないと考え
たので、Win95だと解釈すると質問自体が成り立たなくなる
と考えたから、です。

>一度実験されてみることをお勧めします。
しました。なりますね。
ついでにWin3.1でも実験してみたところ、ちゃんと(?)停止しました。
# Win95ってi486サポートしてたっけ。
# そうだとしたら、Pentiumで新しく追加された
# 便利な機能を使えないせいなのかも。(全く根拠無し)

>jmp $
を無限ループではなくして、その後にstiを
実行すると、復帰しました。
# 止まったり動いたりが面白い(^^)

>>ひどい手抜き&ダメ&糞OSということに
>>なってしまいます。
>なぜか私に向けて言われているような気がします。
全くの誤解です。当然ですが、M$に対してです。

>>>「止められないのに許可になっているの?
>>>止められないのに許可にするメリットがあるの?」
>>この部分ですが、何を「止められない」のですか?
>>また、何を「許可にする」のですか?
>「暴走」を止められない & 「割り込み」を許可にする、
ということでしたら、
「暴走を止められないということから、
割り込みが禁止されているといえる」と思います。
# DOSプロンプトでcliをしたとき、IFがどうなるのか
# 調べたいが、システムが停止してしまってはどうにもならん。ちっ

>何かVIFに関して詳しく書かれているものを2,3紹介ねがえませんでしょうか。
うっ。インテル・アーキテクチャ・ソフトウェア・ディベロッパーズ・マニュアル
("http://www.intel.co.jp/jp/developer/vtune/v4/cbts/refman.htm)
をご存じなかったのですね。読んでみてください。
(仮想86モニタがどういう処理をすべきかについては、上巻の16.3.2を)

akates  [2001/05/20 Sun 00:10:50]  [211.10.154.210]

Tsuyoshiさん、

...なにいっ!?
特に理由がないだとうっ?
みんなくろうして自分でしらべてるのにい!
けしからんっ!!

以上冗談入ってるのであまり本気にしないでください。(私も教えて君やってますし^^;)

でも、本当にピーターノートンはおすすめですよ。ハイレベルな読み物としても面白いですし。ちょっと記述が古いところがありますが、それもご愛敬で...^^;

それとどんなCの本を読まれましたか。昔のPC-98+DOS用Cのものが面白いかもしれません(あればですが^^;)。(なおDOS用Turbo C(PC/AT版)はただで手に入ります)

なお、DOSエクステンダはなべちゃんさんがすべてを知っております。なべちゃんさん、どうぞっ! (ってうそですよ、なべちゃんさん^^;)
DOSエクステンダは...一言でいうと、プロテクトモードで本当は呼び出せないはずのリアルモードのサブルーチンを呼び出せるようにするサポートシステムプログラムです。(だと思う)

そうそう、それとなにか実験するならDOSプロンプトはやめてDOSモードでやった方がいいです。DOSプロンプトは裏で逐一Windowsのチェックが入ってますから。例えばディスク直接書き込みなんかは完全にブロックされちゃってます。
Tsuyoshi  [2001/05/19 Sat 22:51:12]  [211.8.108.163]

Tsuyoshiです。

今のところ、OSは

[ Microsoft Windows95 Version 4.00.950 B ]

です。

to akatesさん

>>ひどい手抜き&ダメ&糞OSということに
>>なってしまいます。
>
>なぜか私に向けて言われているような気がします。

・・・あまり神経質になりすぎるのはよくないです。

なんせ掲示板ですので、言葉の上での取り違いや、意志の疎通が不十分で、
意図する答えが返ってこなかったりすることは多々あります。

落ち着いてください。
akates  [2001/05/19 Sat 21:03:53]  [211.10.154.219]

まず、なぜ質問には答えてくださらないのかちょっと理解に苦しみます。

>Win9xでないOSの話を
>しようとしていると考えたのですが、

なぜそう思われたのかわかりませんが、カトさんの最初の質問は、御自身のサンプルプログラムに「CLI」命令を付加するにあたって、このプログラムをTsuyoshiさんの使用されているシステム(おそらくWindows9xか2000)で実行するときに、せっかく「CLI」をしているのにそれが効かない、あるいは何か予想外のことが起こるのではないか、ということを聞かれているのだと思います。
そこで私は「Windows9xですよね?」と断った上で自分の意見を述べさせていただきましたが。

>(*)が正しく

一度実験されてみることをお勧めします。
実質的なコードは
cli
jmp $
ですから。ただし、他にも何かのプログラム(システムで十分かも)を並列動作させてみなければなりませんが。

>Win9xはハードウェア割り込みを
>エミュレートしているであろうことも付け加えておきます。

おっしゃりたいことはわかるつもりです。ですから、Windowsの割り込み処理の動作についてIchiさんのお考えをきかせてほしいのです。

>何を「止められない」のですか?
>また、何を「許可にする」のですか?

「暴走」を止められない & 「割り込み」を許可にする、
です。

>ひどい手抜き&ダメ&糞OSということに
>なってしまいます。

なぜか私に向けて言われているような気がします。

それと、これはまたお願いなのですが、私の持っている資料「80486の使い方」(オーム社、W.B.スルヤント)、「はじめて読む486」(アスキー、蒲地輝尚)にはVIFに関する記述がありませんでした。何かVIFに関して詳しく書かれているものを2,3紹介ねがえませんでしょうか。
あと、できればVIFは具体的にどこにあるのかをお教えねがえれば幸いです。

Ichi  [2001/05/19 Sat 00:02:12]  [211.13.2.151]

>私は「Windows9xの場合」に、
(略)
>一般的なOSの場合は言っていません。
??

>実際、Windows95のDOSプロンプトでCLIを実行すると
>他の並列実行されているプログラムはすべて
>停止してしま
う(*)のですから、ハードウェア割り込みを実際に
禁止してしまっている(IF=0)のではないのでしょうか。
割り込みを許可している(IF=1)のにもかかわらず
他の並列実行されているプログラムが
すべて停止してしまうのなら、Win9xは
ひどい手抜き&ダメ&糞OSということに
なってしまいます。
ということから、Win9xでないOSの話を
しようとしていると考えたのですが、
そういう意図ではなかったようですね。

また、以上のような理由から、Win9xでは、
>「割り込みを許可していて実際に割り込みが入った場合、
のような状況(IF=1 and VIF=0)にはならないと考えます。
((*)が正しく、かつWin9xが手抜きOSでないという前提で)

VIFに関わらず、Win9xはハードウェア割り込みを
エミュレートしているであろうことも付け加えておきます。
(そう言える理由は前述した通り)

>「止められないのに許可になっているの?
> 止められないのに許可にするメリットがあるの?」
この部分ですが、何を「止められない」のですか?
また、何を「許可にする」のですか?

Tsuyoshi  [2001/05/18 Fri 20:43:01]  [211.8.109.149]
書庫を使わない理由

Tsuyoshiです。

ハイレベルな会話になっていますが、
下のほうの質問の返答をまだ書いていないので・・・。

akatesさんから
>日本語の書籍を利用されないようですが、何か理由があるのでしょうか...
>「Ralf Brown」はあくまでデータリストですのでテキストには向かないと思うのですが...

・・・ノーコメントとしたいところなんですが。

・・・たいした理由はないです。ただ、過去ログなどに書庫の紹介が
書いてあるのを見ると、買いたいな、と思います。

それに、今の僕の身柄では、まだその必要性もないような気がします。

過去に、C言語の書庫を買いましたが、今それが部屋のオブジェに
なっているので、気が進まないということもあります。

ということで、このハイレベルな長文読解のため、1つ質問させてください。

DOS-Extenderって、なんですか?

まだまだ質問するかもしれませんので・・・。よろしくお願いします。
akates  [2001/05/18 Fri 06:14:52]  [211.10.154.189]

>メリットがないと言うことはできませんよね?

私は「Windows9xの場合」に、V86下のプログラムがCLIを実行した場合に、そのプログラムの暴走などを停止させることができなくなる、というよく知られた事実をもとに、「止められないのに許可になっているの? 止められないのに許可にするメリットがあるの?」と言ったつもりです。一般的なOSの場合は言っていません。

後、もう一度質問しますが、「割り込みを許可していて実際に割り込みが入った場合、それに対してWindowsはどのような処理をすると思われますか?」
ぜひぜひこの事への解答をお願いします。
akates  [2001/05/18 Fri 05:12:01]  [211.10.154.202]

☆なべちゃんさん、
実はわたしのおうちにもTowns(一体型)があります!
でもjunkで、中にハードディスクが見当たりません。
FM-Rもあるんですが(DOS、ハードディスクあり)、確かFM-RのDOSはTownsでは動かなかったですよね?

あと実は私も98用Windows9xを持っていません。(もちろんNTなんかもないです) ちょっとお金がなかったものですから(今も)...
ちなみにメインの98(9821Xe(486SX))はjunkです(^^;)

>DOS-Extender が標準なんです(DOS を起動させれば DOS マシン)。

?? えーと、まず、DOSが起動して...? DOSエクステンダがロードされる...?

>go32 はご存知だと思いますが、

うう名前とDOSエクステンダであるということしか知りません。
というかDOSエクステンダでプログラム開発をしたことがありません...
組み込み型のDOSエクステンダ(Phar Lap)が組み込まれたプログラムの動作をおっかけたことはあるのですが...
組み込みでないDOSエクステンダってどういうものなんでしょうか?(^^;)
いくつかのDOS用DPMIホストみたいにTSRなんでしょうか...

>...RUN386 互換で、
>かつ PC-98 でも PC/AT でも動くというものです。

うう機種の壁なしですか...私もそれは目標にしてるんですが...すごいです...
でっでもっ 286じゃ動かないでしょう?(意味不明)

>あとの方になればなるほど遅いです。恐らくリストかなにかでメモリを管理してる
>せいだと予想しているのですが...

PC-9821Xe(486SX-33MHz、メモリ14M) + DOS 6.20付属EMM386.EXE なんですが...
全部(13M弱)のVCPIページをガーっと連続取得し、取得に成功するたび物理アドレスを表示するくだらないテスタを書いてみましたが、表示が止まるようには見えませんでした...13Mじゃ少ないですか?
(一応Webページにおいたので、ひまだったら... あっでもEMM存在チェックしてない...)

>>>●0Ch:EMBメモリブロックのロック

ううたしかに「物理アドレス」が返ってくるって書いてあります^^;;
しかしっ! 私は「ロック」の意味がわかりません!(バカ)

>回転とかはサポートされているとは限りません。

...関係ないかもしれませんが、チップに機能があってもボードに回路がなくって結局利用できないとかありますよね...

>vem486

?(無知) 名前からすると仮想EMM? インターネット界(?)の事情に無知なので...(というか95年以降及びPC/ATのことをよく知らないので...)
Ichi  [2001/05/18 Fri 01:32:00]  [211.13.2.80]

まず最初に。困難だからといって、やらなくてよい、
ということにはなりませんよね?
困難でも、必要ならやらなくてはなりません。

>...下にも書きましたが、実際にWindows95のDOSプロンプトでは
>「勝手なこと」ができますが...
できるみたいですが、それは単にWindows95が手を
抜いている(もしくはそれで十分だと判断された)
だけであって、それをもって
「割り込みがあったことを覚えるだけで何の処理もせず、
STIが来た時点で該当INT(複数の場合あり)のエミュレートを行う。」(*)
ことにメリットがないと言うことはできませんよね?
# 実際「特権レベルの低いコードが勝手なことをするのを防げ」
# ないと困る

DOSプロンプト(IOPL=3)の場合。IOPL=3ということは、
sti, cliは#GPを引き起こしませんが、その辺は置いておきます。
まず、すべてのハードウェア割り込みはまずWindowsが処理します
(でないとマルチタスキングが破綻する)。
ということは、割り込み禁止を云々しなくても、
ハードウェア割り込みをエミュレートしなければ
ならないことに変わりはありません。

逆に、ハードウェア割り込みをエミュレートしなくてもよい
(例えばDOS+EMM386.exe, IOPL=0)時は、sti/cliに合わせて、
単に割り込みを禁止・許可すればよいでしょう。

akates  [2001/05/17 Thu 14:13:19]  [211.10.154.154]

とりあえず...

>「特権レベルの低いコードが勝手なことをするのを防げる」
>というところでしょうか

...下にも書きましたが、実際にWindows95のDOSプロンプトでは「勝手なこと」ができますが...
...また、これも下に書きましたが、割り込みを許可していて実際に割り込みが入った場合、V86モニタはどのような処理をすると「正しい」と思われますか?
リアルモード用のINTに即座に接続すべきですか? もし接続するとこれはたいへんにまずいですよね? V86下のプログラムは何らかの理由があって割り込みを禁止しているわけですから。
それならプロテクトモードのドライバを実行すべきですか? これもまずいと思います。V86下のプログラムが期待しているはずの割り込みがいつまでたってもこない、という事態になりかねません。「STI」の時点でそっくりな状態をつくり出しますか? これはちょっと困難な作業だと思います。I/Oのやりとりを完全再現したりするわけですから。その内容はプロテクトモードドライバがやったものとはまったく違うかもしれませんよ。
どのみち割り込みが処理できないということになれば当然許可する理由もない、ということになりませんか?

カトさん、
言い忘れてましたが、メイン処理を改訂したものはやはりキーをとりこぼしますよ。
Ichi  [2001/05/17 Thu 00:22:29]  [211.13.2.169]

>単に割り込みを禁止してうまくいくような状況で、
>仮想86モードにする必要がある状況は
>あまりないようにも思えます。
すいません。大嘘です。撤回させてください。
例えばDOS+EMSがそういう状況ですね。

Ichi  [2001/05/17 Thu 00:13:50]  [211.13.2.169]

>単に割り込みを禁止するより複雑で、互換性も低下しますが、
>そのような処理にするメリットはどこに?
「特権レベルの低いコードが勝手なことをするのを防げる」
というところでしょうか。
# 勝手にcliされるのに対処できないのじゃたまらないし、
# ハードウェア割り込みをエミュレートしているなら
# すでに複雑になっているだろうから問題ない……かな

単に割り込みを禁止してうまくいくような状況で、
仮想86モードにする必要がある状況は
あまりないようにも思えます。
なべちゃん  [2001/05/16 Wed 14:17:47]  [202.236.152.84]

★akatesさん
完全に見落としてました(汗) 2個めのには気づいていたのですが(^^;;

>ハードウェア機能です。具体的には、port 461h/43Fhなどを使います
>(って98ユーザーでないとあまり意味ないですね^^;...)。

あそうなんだぁ。一応、おうちには Xa16(CPUはPentium200)がありますが。
とある CD を紛失して、DOS しか入ってないです(汗

>>towns って...プロテクトモードが標準...
>えっ!?(また無知) それって... DOSだと... DOSマシンですよね!?

DOS-Extender が標準なんです(DOS を起動させれば DOS マシン)。
PC-98な方なら go32 はご存知だと思いますが、TOWNSでは RUN386 ってものが標準でして
余談ですが、私の作ってる Free386 は RUN386 互換で、
かつ PC-98 でも PC/AT でも動くというものです。
#同じ 386なbinary が動くのが目標。一部はすでに同じものが動いてるのですが。

>>ハングアップしたと勘違いできるぐらい遅い...
>..えーと...私のマシン(PC-98:486SX-33MHz^^;)ではそこまで遅くはないような
>気がするのですが...大量に連続してメモリ取得をしたりは、していないですが

あとの方になればなるほど遅いです。恐らくリストかなにかでメモリを管理してる
せいだと予想しているのですが...。(AX=DE04です)

>VCPIファンクション(INT 67h) AX=DE04h (メモリ1ページ割り当て)では
>物理アドレスを返してくれるようですが...そのことではないですか?

あ、返してくれる。失礼しました。勘違いです。

>また、XMS(私の資料ではver.3.0)によるEMB割り当て(ファンクションAH=09h)では、
>ハンドル番号しかもらえないのですが... 上位バージョンでしょうか...?

>>●0Ch:EMBメモリブロックのロック

を参照下さい。なお、資料によってはこのファンクションで物理メモリが得られる
ことを記述してないものが存在します。

>>x86プロテクトモードプログラミングとか(詳細忘れ)のことですか?
>ええ、確かそんなような題名で(詳細忘れ)...^^;

家に転がってます(^^;; K某氏からの借り物ですが...。

>下位の割り込みがぜんぜん起動できないというのを防ぎたいとか、そういうことですかね...

そういうことだと思いますけど。最近は 8259A互換 なだけですから、
回転とかはサポートされているとは限りません。

>V86モニタのリアルモード例外エミュレート部分もかなりリアルモードと
>違ってしまっているようなんでが...

おそらく違ってしまってると思います(^^;; この際、vem486で(ぉ
#これのソース公開されないかなぁ...

>あと、最新のMASMには16ビット版のLINK.EXEはついてないのですね...
>知りませんでした(またです)...

これが困りものです。alink とかが使えないことはないのですが...。

akates  [2001/05/16 Wed 12:09:03]  [211.10.154.161]

>確かに暴走は起きませんが...

一定の条件下では暴走は起きると思われます。「cmp byte [cs:KEYCOUNT],20」の時点でいつもKEYCOUNTが20以外の値になっている、ということが考えられます。
また、「jne」を「jb」に変えても暴走は起きると思われます。確率的には低いですが、「cmp byte [cs:KEYCOUNT],20」の時点でいつもKEYCOUNTが0〜19の値になっている、ということがありえます。
なお、メイン処理を改訂されたものについても同じです。

>仮想86モードで cliをした状態って、...

Windows9xのDOSプロンプトの話ですよね?
割り込みは(V86モニタによって)禁止されていると思います。
もし割り込みを許可していて実際に割り込みがあった場合、V86モニタはどうしたらいいと思われますか?
「割り込みがあったことを覚えるだけで何の処理もせず、STIが来た時点で該当INT(複数の場合あり)のエミュレートを行う。」
となるのでしょうか?
単に割り込みを禁止するより複雑で、互換性も低下しますが、そのような処理にするメリットはどこに?
実際、Windows95のDOSプロンプトでCLIを実行すると他の並列実行されているプログラムはすべて停止してしまいますが...


☆Tsuyoshiさん、
ちょっと質問があるのですが...
日本語の書籍を利用されないようですが、何か理由があるのでしょうか...
「Ralf Brown」はあくまでデータリストですのでテキストには向かないと思うのですが...
私はピーターノートン(有名)の書いた「THE NEW PETER NORTON IBM PC & PS/2 プログラマーズガイド」(翔泳社)がよい本だと思いますが...

(あと、私の書いた「1)」に訂正があります。調べたところ、EGA以降のビデオアダプタ(もちろんVGAも含む)ではテキストモードの英語フォントも自由に書き換えられるようです(INT 10h-AH=11h)。PC-98と同じかなと思ったもので^^;)


☆なべちゃんさん、
私の書き込み、だいぶ下になってしまいましたが([2001/05/10])、見てくださいましたか...
何か書いていただけるとうれしいです...
Ichi  [2001/05/16 Wed 00:16:29]  [211.13.3.6]

>もしかしたら、IOPL=3 では実行できるかもしれませんが
フラグが変化するだけで実際には割り込みは
禁止されない、だったような記憶があります。

(ごそごそと資料を探り)
えーと……
IOPL!=3のとき、cli,sti,pushf,popf,int n,iretは
一般保護例外を引き起こす。(IOPL=3の時は起こさない)
IOPL=3のとき、cli,sti,pushf,popfは
割り込みフラグ(IF)を変化させるかわりに
仮想割り込みフラグ(VIF)を変化させる。
仮想86モニタはVIFを参照して適切に処理せよ。

みたいなことが書いてありました。
なべちゃん  [2001/05/15 Tue 15:44:59]  [202.236.152.84]

なにやら盛り上がっているようですが...

>仮想86モードで cliをした状態って、
>実際には裏でカーネルレベル(?)でハードウェア割り込みが働いたりしてしまうんですよね?

i386 な CPU のプロテクトモードではリング保護という複雑そうな保護が働いてまして、
よく覚えてないのですが、V86 mode では cli は特権命令で常に実行不可だった気がします。
(もしかしたら、IOPL=3 では実行できるかもしれませんが)

"みかけ実行できる"のは OS (やメモリドライバ)がエミュレートしてるからで、
エミュレートの方法は、それぞれによりますが、OS らしい OS なら
まず禁止にはならないでしょう。

#ついでに、V86 mode では int の Real側テーブルは実際意味をなしません。
エミュレートして接続してる(呼び出してる)でしょうが保証はありません。

力卜  [2001/05/14 Mon 22:33:27]  [202.248.54.96]

akatesさん:

> また、そうなったら「cmp byte PTR cs:KEYCOUNT,20」の判定も
> 正しく行われないのでは?

ここは大問題でしたね。私、勘違いしていました。

自分:

> いませんでした。仮に、サンプルで問題の状況になっても困らない(暴走やシステム
> の破壊などは起こらない)ですから…。

確かに暴走は起きませんが、cmp / jc(jb) じゃなくて、

> cmp byte [cs:KEYCOUNT],20
> jne LOOPTOP

なんて書いちゃったから、運が悪いと256 * n回のループになっちゃいますね。
失礼しました。ではでは。

Tsuyoshi  [2001/05/14 Mon 19:42:49]  [211.8.110.110]
キーボード

Tsuyoshiです。 返事が遅れてしまいました。

いろいろと書き込みしてくれてありがとうございます。

カトさんや、akatesさんの言うとうりで、

チルダが書けないというのは、実は実験的にキーボードドライバを
Config.sysから除いていたためです。あ、書いてませんでした?

カトさんのサンプルソースは、無知なために、解読に少々時間が
かかってしまいました(^^;)。
make/breakの意味が初めて分かりました。
そのおかげで、悩みが2つ3つ解消されました。

このようなサンプルソースは、僕にとってはとぉぉっても役に立つものです。
ありがたいです。

ところで、日本語モードは、すべてグラフィックスである、ということは、
僕も、1人で文字が書ける・・・。・・・今のところは首を突っ込まないほうがよさそうですね。
力卜  [2001/05/14 Mon 12:42:13]  [164.71.1.149]

ハードウェア割り込み利用時の排他制御について

akatesさん:

> ...ちょっとこのソース、「?」と思うところがあるのですが...
(略)

そうですね。サンプルだから手抜きしてあって、割り込み対策の排他制御をして
いませんでした。仮に、サンプルで問題の状況になっても困らない(暴走やシステム
の破壊などは起こらない)ですから…。

しかし、サンプルだからといっても何かに流用される可能性を考えると手抜きは
よくなかったですね。
例のサンプルのループのメイン処理は以下のものに差し替えればいいですね。

(前略)
; 適当なループ処理。20件のキーコードが発生するまでループ。
LOOPTOP:
int 28h ; DOS idle 割り込み(OSに適当な処理をしてもらう)
cli ; stiを発行するまでハードウェア割り込みを禁止。
mov al,[cs:KEYEXIST]
mov dl,[cs:KEYCHAR]
mov dh,[cs:KEYCOUNT]
mov byte [cs:KEYEXIST],00h
sti ; ここからはハードウェア割り込みを許可する。
or al,al
je LOOPTOP
mov ah,02h
int 21h
cmp dh,20
jc LOOPTOP
; 旧 int 15h ベクタを復旧
(後略)

ところで、仮想86モードで cliをした状態って、実際には裏でカーネルレベル(?)でハード
ウェア割り込みが働いたりしてしまうんですよね? (DOSアプリには大して影響ないでしょうが)
それでは。

力卜  [2001/05/14 Mon 12:41:40]  [164.71.1.149]

DOS/Vの日本語モードについて

Tsuyoshiさん:

> DOSを、フォント情報の読み込みを省いて起動させても、英語ぐらいは書ける・・・。しかし、チルダ"~"は、書けない・・。なぜ?

チルダですが、普通に入力 or 表示できませんか?
日本語表示と 106キー配列のドライバを組み込んである状態で、us (もしくは chcp 437) とやって、
[Shift] + [^] で出せたり、チルダを含むテキストファイルの表示(type a.txt)が可能と思います。
# us または chcp 473 は英語モードに移行。日本語モードに戻るには jp または chcp 932を実行。

チルダが書けないというのは、日本語キー入力のドライバを config.sysから除いたためにkeyの配列が
101キーボード扱いになってしまい、[Shift] + [^] で入力できなくなっただけではないでしょうか。

> 日本語環境では、常にグラフィックスモードで文字表示されているのかな? テキストモードというのもあるけど・・・。

プログラミングでは日本語のテキストモードを扱ったことがないので、憶測ですが…、
日本語モードでのテキストモード(03h)ですが、実体は 640x480ドットx16色 のグラフィック
モード(72h相当かな?)ですね。us や chcp 473を実行したときに表示される本当のテキスト
モード(03h)は、0〜255の文字コード(256種類の文字)しか表示できません。

日本語モードのときは、日本語表示のドライバが int 10hをフックして、
テキストモードへの変更ファンクション(int 10h, AH=00h, AL=03h)を
受けたときに、実際は 640x480x16 のモードに変更しているのでしょう。
また、文字列表示のファンクションを受けたときには、テキストVRAMに1バイト
の文字コードを書くのではなく、ビットパターンをピクセルに展開してグラフィック
として書いて表示しているのでしょう。それでは。




e-mail: mist@e-net.or.jp
Structured Anchor Tree Return to Menu Return to Parent Menu 
Powered by Unit Missing Link.