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

 
Tips
 

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


 
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 01/01/0202/28/02
 




かちゅや  [2002/02/28 Thu 10:56:18]  [131.206.4.132]

書き込んでみたら意外と長かったです。ごめんなさい。

あと、PC98の参考書ではないのですが、
「8086マシン語秘伝の書」日高徹・青山学著 啓学出版
もいい本です。
かちゅや  [2002/02/28 Thu 10:40:12]  [131.206.4.132]

> 1B62h
> システムタイマの使い方...
;for DOS, tasm
.model tiny
.code
org 100h
start:
cli
;割り込みベクタテーブルの退避
xor ax,ax
mov es,ax
mov bx,20h
mov ax,es:[bx]
mov vec_off,ax
mov ax,es:[bx+2]
mov vec_seg,ax
;割り込みベクタテーブルの設定
mov es:[bx],offset timerproc
mov es:[bx+2],cs
;タイマLSIの設定
mov al,34h ; 割り込みモードの設定
out 77h,al
mov al,00h ; 割り込み周期の設定
out 71h,al
mov al,0a0h
out 71h,al
;PICの設定(割り込み許可)
in al,2
and al,0feh
out 2,al
jmp $+2
sti
;待つ
lp:
cmp counter,100
jne lp
;メッセージの出力
mov dx,offset message
mov ah,9
int 21h
;PICの設定(割り込み不許可)
cli
in al,2
or al,1
out 2,al
jmp $+2
;割り込みベクタテーブルの復帰
mov ax,vec_off
mov es:[bx],ax
mov ax,vec_seg
mov es:[bx+2],ax
sti
ret
;割り込み処理ルーチン
timerproc:
sti
push ax
inc cs:counter
;PICにEOIを送出
mov al,20h
out 0,al
pop ax
iret
message db 'Timer',13,10,'$'
counter dw 0
vec_off dw ?
vec_seg dw ?
end start
こんな感じ。(これで初心者向けと言えるのか)
PICの設定についてはこのページのリンク集の中にある
「PC98 DOSプログラミング ハードウェアバリバリ編」
を参考にしてください。
> int10hでDOS/V機は...
DOS/V機とPC98は違うコンピュータなので注意してください。
98の参考書ですが、
「PC-9801プログラマーズBible」東京理科大学EIC
はなかなかいい本です。
kattyo  [2002/02/27 Wed 20:32:56]  [202.18.170.10]
http://www.abk.nu/~kattyo/

どちらかというとゲーム向けですが
http://www2.muroran-it.ac.jp/circle/mpc/pc98dos/title.html

kattyo  [2002/02/27 Wed 20:12:05]  [202.18.170.10]
http://www.abk.nu/~kattyo/

98 の資料は最近は少ないと思いますが探せば結構あります。
本で有名なのは

・PC-9800シリーズ テクニカルデータブック
・PC-9800シリーズ スーパーテクニック

以下に、定番だった本がほとんど紹介されてます。
http://www2t.biglobe.ne.jp/~take52/tech/books.htm

次のところからリンクをたどると良いかもしれません。

http://guriponn.tripod.co.jp/links/index.htm
http://guriponn.tripod.co.jp/links/pdp.htm

vector に公開されている物には結構貴重な資料が含まれていたりします。
以下の中に、「マクロ集」「ライブラリ」などがありますが、
それらに実は詳細にDosファンクションなどがコメントの中で解説されているものがあったりします。

http://www.vector.co.jp/vpack/filearea/dos/prog/asm/index.html
http://www.vector.co.jp/vpack/filearea/dos/prog/lib/index.html

ライブラリでしたら master.lib などが有名でして、
さらに master.lib は古いバージョンはソースが公開されていたはずなので
そのソースを見て見るというのも良いと思います。

自作の資料ですが、以下のディレクトリに少しあります。

ftp://ftp.abk.nu/pub/text/

1B62h  [2002/02/27 Wed 17:15:17]  [211.8.49.4]

またまたアセンブラとは直接関係ない、しかも初歩的な質問なので申し訳ないのですが、システムタイマの使い方を(初心者に毛が生えた程度の人間でもわかるように)教えてください。PC98です。
想像では、カウンタ#0に2Byteのデータを出力するとカウントダウンが始まり、0になるとint08hが発生するという風に考えています。
しかし、DOS/Vではどうも値の出力なしに定期的にint10h(or08h)がよばれているようだし、割り込みの許可・不許可を設定するものがありそうだとも考えています。
手元にあるor見ることができる(ハードウェアの)資料は、PC98のマニュアルと、「UNDOCUMENTED 9801・9821 vol.2」というwebページしかなく、専門用語がよくわからないので、適当にいじってポートの値を観察したりしていますが、さっぱりです。
web上を検索しても、古い資料なんて皆無ですし、古本屋・書店でも資料を見かけたこともありません。もうそんな資料はないのでしょうか。
>かちゅやさん
web上を検索していたら、int10hでDOS/V機はビデオモードの設定をするという風に書いてあったようなのでDOSは全部そうなのかと・・・
ところで、98は(98”も”?)VRAMが同一アドレスに2枚あるから、ポートのA6hとA4hを駆使するとダブルバッファのようなことができそうだと思って、定期的に強制フリップできるようにしたいと思っています。無論低速なマシン(286!)なので、たいしたことができるとは思っていませんが。もしPC98に関するよいサイトをご存知でしたら、教えていただけませんか?

かちゅや  [2002/02/27 Wed 02:15:55]  [131.206.4.132]

AFさん、お返事ありがとうございます。

> 80386 に Above, Below をサポートする機能(DRx)は無かった
> ように記憶しています。match は有る。

手元の資料を見た限りでは、それっぽいフラグは確かに無いみた
いです。(未確認,フラグ名しか読んでません。)

> Abobe, Below は ICE や自作 HW Break point ボード
> を作ってドライバを書くしかなかったと記憶しています。

そこまでやるのはチョット...(^^;。単なる興味本位ですので。
昔(高専の2年)、思い切ってTASMを購入したのですが、デバッガ
が下の書き込みのような状態でしたので、詐欺にあったかのような
印象をもっておりました。おかげで解決です。(笑

ありがとうございました。
AF  [2002/02/27 Wed 00:42:05]  [210.233.166.49]
http://www.ksky.ne.jp/~afuruta/

かちゅや さんこんにちは、

> 具体的には、Address match の AboveやBelowの設定をや
> ってみたいのです。

80386 に Above, Below をサポートする機能(DRx)は無かった
ように記憶しています。match は有る。一応 4 バイト(dword
アラインメント)の範囲では可能ですし、DRx を使っていけば
という話もありますが... 486 以降で拡張されたのかな...

Abobe, Below は ICE や自作 HW Break point ボード
を作ってドライバを書くしかなかったと記憶しています。京都
マイクロコンピュータ製のボードが比較的それに近いことが出来
たように記憶しています。あの当時では C-BUS ボードとか下駄
に FPGA 1 個貼り付けて出来上がりという訳にはいかなかった
からなぁ...

かちゅや  [2002/02/25 Mon 00:33:38]  [131.206.4.132]

すみません。下の書き込みを訂正します。

ハードウエアブレークポイントが設定できません。
       ↓
ハードウエアブレークポイントのほんの一部の機能だけしか
設定できません。

具体的には、Address match の AboveやBelowの設定をや
ってみたいのです。

失礼しました。
かちゅや  [2002/02/24 Sun 21:51:36]  [131.206.4.132]

>1B62hさん
描けましたか。お役に立てて良かったです。
> int10hあたりで許可を...
PC9801プログラマーズバイブルによるとint10hはNDPとなっていて
DOSは使っていないと思うのですが、ひょっとして勘違いしてませんか
> ブートセクタに直書きして実験...
それは茨の道のような気がします。(確かに面白いですが(^^))
今のうちは素直にDOSでやったほうがいいと思いますよ。
MS-DOSはデバイスドライバを組み込まなければディスク関係のIOぐ
らいしかアクセスしませんので。

ところで、TurboDebugger(win32とdos)でハードウエアブレーク
ポイントの設定があるのですが、あれが使える環境にはどういうも
のがあるのでしょうか。486以上のCPUにはデバッグレジスタが内蔵
されているはずなのですが、PC98+DOS6.2+TD(himem+emm386 or
vem486+vememm)とWindows2000+TD32とWindows95+TD32でやってみ
てもハードウエアブレークポイントが設定できません。
マニュアルには使えると書いてあるのですが。

ご存知の方がいらっしゃいましたら、教えていただけるとうれしい
です。昔から気になっておりましたので。
1B62h  [2002/02/24 Sun 08:53:27]  [211.8.49.4]

かちゅやさん、ありがとうございます。描けました。
てっきり、DOSがVRAMへの書き込みを禁止していてint10hあたりで許可を求めなければいけないのかとか考えていましたが、GDCstartが必要とは思っても見ませんでした。
OS非依存というのは真っ赤なウソで、正確にはMS−DOS非依存の環境という意味でして、MS−DOSでアセンブラをするよりまえにつくった、N88Basic(DiskBasic)のバイナリ打ち込みマシン語作成&実行プログラム上で走らせたということです。
多分、最初に起動するBasicプログラムがPsetなんかを使うためにGDCstartをさせていたんでしょう。だから本当はOSに依存しまくりだったんですね。DOSよりOSの干渉が少ないかと思ってN88Basic使ったんですけど、インタプリタ言語のOSですしね。ブートセクタに直書きして実験すればよかったと今になって思います。
とにかく本当にありがとうございました。

かちゅや  [2002/02/23 Sat 23:21:12]  [131.206.4.132]

はじめまして、googleでアセンブラのページを検索したところ、
このページを発見してしまいました。
しかも、僕の大好きなPC98についての質問なので、答えちゃいます。

OS非依存の環境というのが具体的にどのような環境なのかわから
ないのですが、MS−DOS上で同じプログラムを走らせても何も
起こらない原因はグラフィック画面の表示が行われていないからだ
と思います。
mov al,0dh
out 0a2h,al
をやってからそのプログラムを動かすようにしてみたらどうですか?
もしくはプログラムを実行する前に、debug(symdeb)コマンドで、
o a2 d
q
ってやってからプログラムを動かしてみてはどうですか。
1B62h  [2002/02/23 Sat 18:12:58]  [211.8.49.4]

アセンブラとは直接は関係ない話題なので申し訳ないのですが、PC9801でグラフィックVRAMに直書きで画面表示するにはどうすればいいのでしょうか?
movで[a800(etc.):????]にデータを描いてもOS非依存の環境ではピクセルがセットされるのですが、MS−DOS上で同じプログラムを走らせても、何も起こりません。
画面はVGAではなく400ライン(200ライン)です。テキストVRAMには直書きで文字が表示されるので、グラフィックVRAMのみ直書き操作できないようです。
INT  [2002/02/23 Sat 01:55:43]  [210.20.194.10]


澤口@一升金 様、丁寧な解説ありがとうございました。

再度質問させていただきます。

> どちらの場合でも、Windows ではこれを32bit 値に変換します。

WINDOWSの仮想アドレス空間は32bit値。
INTEL PROCESSORのリニアアドレス空間も32bit値。

大概のWINDOWS32bitアプリケーションは仮想アドレス400000hをベースとして、codeがマップされますが・・・

ある特定のプロセスでコミットされたWINDOWS仮想アドレスの範囲400000h-400FFFhは、そのままINTELリニアアドレス範囲400000h-400FFFhとして該当する物理アドレス上のPage Frameにアクセスされるのでしょうか。

別のプロセスでコミットされたWINDOWS仮想アドレスの範囲400000h-400FFFhと衝突を回避する仕組みの正体は何なのでしょうか。

INTELリニアアドレス空間は一つのシステム上、複数定義される性格なものなのでしょうか。(CR3の値をスイッチすることでPageDirectoryTableをプロセスごとに変更しているとか)

それともリニアアドレス空間は一つのシステム上、一つしか存在し得ないものなのでしょうか。(CR3の値はシステム作動中不変で、あらゆるプロセスのWINDOWS仮想アドレスが、INTELリニアアドレスに重複することなくマップされるように変換しているとか)

見当違いでしたらすみません。
KaoriMochida  [2002/02/23 Sat 01:00:20]  [61.122.184.182]

ご回答ありがとうございます。

> Vector に r86(とlld)のマニュアルが登録されているようですので、
> よろしければ入手して読んでみてください。
> http://www.vector.co.jp/soft/maker/lsi/se011449.html
> 書式の違いを気にしないのであれば、この掲示板でも何度か取り上げ
> られている nasm というフリーソフトのアセンブラもあります。
> http://www.t.ring.gr.jp/archives/linux/kernel.org/software/devel/nasm/
分かりました。
nasmですね。
Linuxとかでも使えるアセンブラですね。
取り敢えずmasmを使ってみて余裕が出来ればnasmも試してみたいと思います。


しろ  [2002/02/22 Fri 09:47:18]  [210.253.203.251]

r86.exe は、MASM とメモリアクセスのためのオペランドの書式が違
ったり、マクロがサポートされていなかったりしますので、アセンブ
ラの参考書等に掲載されているサンプルをそのまま入力してもアセン
ブルできないことが多いと思われます。
それでもかまわなければ、r86.exe を使ってもよいでしょう。

Vector に r86(とlld)のマニュアルが登録されているようですので、
よろしければ入手して読んでみてください。
http://www.vector.co.jp/soft/maker/lsi/se011449.html

書式の違いを気にしないのであれば、この掲示板でも何度か取り上げ
られている nasm というフリーソフトのアセンブラもあります。
http://www.t.ring.gr.jp/archives/linux/kernel.org/software/devel/nasm/

KaoriMochida  [2002/02/21 Thu 02:04:38]  [61.122.184.190]

> ライセンス的に差し障りがあるようでしたら、フリーソフトのリンカ
> を入手して、ml -c ... で .obj までを生成して、
これでアセンブラのみ出来ました。

> リンクはそちらの
> ほうにまかせる事もできるかもしれません。
> 入手の容易そうな DOS用リンカとしては、
> LSI-C 試食版に付属のリンカ
ftp://ftp.vector.co.jp/pack/maker/lsi/lsic330c.lzh
からダウンロード・解凍してlld.exeでリンクできました。

> たぶん、Borland の DOS用 Turbo C に tlink が付属しているはず
> public domain のリンカ "val"
> (http://www.freedos.org/freedos/software/lsm2html.cgi?file=lang/val.lsm あた
> り)
> があります。
こちらの方も出来ました。どうもありがとうございまた。

所で、LSI-Cにアセンブラr86.exeというのがあったのですがこれは使用できないのでしょうか?
m−shino  [2002/02/19 Tue 00:21:40]  [219.3.0.49]

澤口@一升金さん、ありがとうございます。
いろいろ探し回っています。
とーっても昔のソフトなので、いまさらいじれません。

澤口@一升金  [2002/02/18 Mon 16:31:48]  [211.2.146.25]

澤口@一升金です。

to m−shinoさん:

有償ですが、ASMFLOW というフローチャーターがあるらしいです。

http://www.quantasm.com/asmflow.html

でも、こんなものを使ってもプログラムが分かりやすくなるとはとう
てい思えない(^^;
自分でソースにコメントを入れたほうがいいんじゃないかと思いま
す。

澤口@一升金  [2002/02/18 Mon 16:21:23]  [211.2.146.25]

澤口@一升金です。

to INTさん:

用語が混乱しているみたいです。
物理アドレスと論理アドレスはシステムを外側からみたときの
区分けでして、「プロセスは論理アドレスにアクセスするが、C
PUはこの論理アドレスを物理アドレスに変換する」というのが
定性的な理解です。
で、この論理アドレスをコードの中で具体的にどう表現している
かですが、 Windows の通常のプロセスではこれがセレクタ:オ
フセットということになります。
DOS窓で動く16bit アプリは当然セグメント:オフセットの表現で
書かれていますね。
どちらの場合でも、Windows ではこれを32bit 値に変換します。
この32bit値がリニアアドレスと呼ばれるものですが、これの上
位20bit が Page Table へのインデックスとして使われ、下位
12bit が Page Table によってインデックスされた Page Frame
内でのオフセットとして扱われて物理アドレスが生成されるので
す。

しろ  [2002/02/15 Fri 12:38:21]  [210.253.203.174]

To KaoriMochida さん
同じような話がこの掲示板の Message Log 20 の 2000/03/16 ごろに
あがっていますので、そちらのほうをご覧ください。

ライセンス的に差し障りがあるようでしたら、フリーソフトのリンカ
を入手して、ml -c ... で .obj までを生成して、リンクはそちらの
ほうにまかせる事もできるかもしれません。

入手の容易そうな DOS用リンカとしては、

LSI-C 試食版に付属のリンカ
たぶん、Borland の DOS用 Turbo C に tlink が付属しているはず
public domain のリンカ "val" (http://www.freedos.org/freedos/software/lsm2html.cgi?file=lang/val.lsm あたり)

があります。

KaoriMochida  [2002/02/15 Fri 02:32:56]  [61.122.184.138]
エラーの意味が分かりません

初めましてアセンブラ初心者です。よろしくお願い致します。

Win2kに
http://www.microsoft.com/ddk/installW2k.asp
からComplete Windows DDKをダウンロード・インストールしました。
それでアセンブラの参考書をみながら

DOSSEG
.MODEL SMALL
.CODE
MOV DL,20H
L1: MOV AH,02H
INT 21H
INC DL
CMP DL,80H
JNE L1
MOV AH,4CH
INT 21H
.STACK 128
END

をアセンブルしてみましたら以下の様なfatal errorが出てしまいました。
一体何が不味かったのでしょうか?


C:\home\MASM>ml ex1.asm
Microsoft (R) Macro Assembler Version 6.13.8204
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

Assembling: ex1.asm
Microsoft (R) Incremental Linker Version 5.12.8181
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/z2
"ex1.obj"
"ex1.exe"
NUL
LINK : warning LNK4044: unrecognized option "z2"; ignored
ex1.obj : warning LNK4033: converting object format from OMF to COFF
LINK : fatal error LNK1181: cannot open input file "ex1.exe"
m−shino  [2002/02/15 Fri 00:19:22]  [219.3.0.49]

アセンブラソースコードからドキュメントを作成する
ツールで、いいのがありましたらご紹介下さい。
過去のソースのドキュメントがないもので...
INT  [2002/02/14 Thu 02:23:52]  [210.20.194.10]

はじめて投稿します。
突然の割込みで失礼します。
質問です。

WINDOWSのプロセス空間の仮想アドレスは、
インテル・アーキテクチャ・マニュアルの
論理アドレス
リニアアドレス
物理アドレス
どれに相当するのでしょうか?
リニアだとは思うんですけど、
どれも矛盾するようで自信がありません。




imakarakokokara  [2002/02/14 Thu 02:09:07]  [43.228.122.50]

To:K.Takata

すみません(^^;; わかりました。nearポインタだからAX,BX,CX,DX
から順に割り当てられるのですね。見落としていました。

i  [2002/02/14 Thu 02:07:13]  [43.228.122.50]


imakarakokokara  [2002/02/14 Thu 02:02:37]  [43.228.122.50]

To:K. Takata

関数名とセグメントは、最初から変更していましたが、
mov bx, [bp + 4] を mov bx, ax に変更するのは、どうして
なのでしょうか?
教えていただけますか?
K.Takata  [2002/02/14 Thu 01:01:40]  [202.219.117.134]

・セグメント名を _TEXT から、TEXT に変更。
・関数名の最初に付いている "_" を関数名の後ろに移動。(_lgdt => lgdt_ 等)
・P.154 lgdt() の mov bx,[bp+4] の行を mov bx,ax に変更。
imakarakokokara  [2002/02/14 Thu 00:42:27]  [43.228.122.50]

2/9 のK.Takataさんに質問です。

proto_a.asmの変更箇所というのは、具体的にどこを変更すれば
よいのでしょうか?
(この議論を最初に持ってきた本人より)


Tsuyoshi  [2002/02/11 Mon 23:38:28]  [61.123.218.157]

はい。
ではおっしゃる通り探してみます(^^)。

お返事くださって、有り難うございました。
なべ@abk  [2002/02/11 Mon 20:09:54]  [202.236.152.84]

CPUによりけり。
CISC RISC アセンブラ 最適化 クロック数 U V パイプ
とかそこら辺のキーワード入れて検索するがよろし。
Tsuyoshi  [2002/02/11 Mon 19:21:13]  [61.123.218.157]

Tsuyoshiです。

質問をしに参りました。

loop命令は、遅いと聞いたことがあります。

では、

cmp cx,0
jne LABEL1

と、

loop LABEL1

では、どちらが速いんでしょうか?

また、div命令も遅いと聞いたことがあるんですが、
どのくらい遅いんでしょうか?

どなたか教えてくださいませんか?
K.Takata  [2002/02/09 Sat 23:02:08]  [202.219.119.35]

どうしても気になったので実際に試してみました。
Win95 DOS モード、LSI C で無事動作しました。

> jmp flush_q1
> flush_q1:
これはあってもなくても動作している模様。
himem.sys は、組み込んでも問題なし。emm386.exe はダメ。
前述の通り proto_a.asm は LSI C に合わせて数カ所書き換える必要あり。
なべ@abk  [2002/02/09 Sat 22:54:33]  [202.236.152.84]

>CR0レジスタの第0ビットをオンにした時点から、
>CPUはプロテクトモードに移行していますから、

本当に移行してるか実験したとはないけど
パイプラインのクリアは必要だと思われる。

Tsuyoshi  [2002/02/09 Sat 22:23:00]  [61.123.218.157]

CR0レジスタの第0ビットをオンにした時点から、
CPUはプロテクトモードに移行していますから、
この場合の far jump の行き先が
セグメント:オフセット形式で解釈されることはないですよね。

僕も、この事はごく最近に学んだことなんです(ログ参照)。
K.Takata  [2002/02/09 Sat 20:45:03]  [202.219.120.57]

> 0008:flush_q1 へ飛んでいってしまいそうですが、

24319202_j.pdf を読んでみたところ、そんなことはなさそうですね。

K.Takata  [2002/02/09 Sat 19:34:21]  [202.219.119.180]

> しかし、この動作の直後に far jump をしていますから、

この far jump 命令をリアルモードで解釈すると 0008:flush_q1 へ飛んでいってしまいそうですが、
大丈夫なのでしょうか。
Tsuyoshi  [2002/02/09 Sat 18:12:29]  [61.123.218.157]

>> jmp flush_q1
>> flush_q1:
>パイプラインをクリアするために必要ではないのですか?

しかし、この動作の直後に far jump をしていますから、
そこでパイプラインはクリアされるんじゃないかと思うんですが、
どうなんでしょうか。
K.Takata  [2002/02/08 Fri 23:39:39]  [202.219.119.200]

> jmp flush_q1
> flush_q1:
パイプラインをクリアするために必要ではないのですか?


「はじめて読む 486」の正誤表が出ていますね。pmseg.exe に関連する部分にも訂正があります。
http://www.ascii.co.jp/books/support/apc/4-7561-0213-1.html
なべ@abk  [2002/02/07 Thu 22:23:38]  [202.236.152.84]

>その1:EMM386.EXEなどの、バーチャルメモリマネージャは組み込んでは行けない。
>なべちゃんさんの意見と食い違うんですが、
>HIMEM.SYSの組み込みは大丈夫だと思います。
ぐぁ、つい癖で himem.sys と emm386 をワンセットで考えてた……。

Tsuyoshi  [2002/02/07 Thu 21:28:51]  [61.123.218.157]

追記

本題です。

下のソースには、問題ないと思います。
強いて指摘するならば・・・

jmp flush_q1
flush_q1:

ここの部分は、なくてもいいんじゃないでしょうか。
後はセグメントディスクリプタの値次第だと思います。

それと、cli命令で割り込みを禁止しているので、
このプログラムが終わるときには必ず割り込みを許可するべきですね。
Tsuyoshi  [2002/02/07 Thu 20:33:17]  [61.123.218.247]

Tsuyoshiです。

リアルモードとプロテクトモードを切り替えるプログラムを
実行するときに重要なことは・・・

その1:EMM386.EXEなどの、バーチャルメモリマネージャは組み込んでは行けない。
その2:セグメントディスクリプタの値に"十分"配慮すること。

なべちゃんさんの意見と食い違うんですが、
HIMEM.SYSの組み込みは大丈夫だと思います。

頑張ってください。
imakarakokokara  [2002/02/06 Wed 13:37:38]  [43.228.122.50]

どーも!!
まだ、困り果てているimakarakokokaraです。

どなたか、私が実行できないプログラムのソースを検証して
くれるという、寛大な方はおられないでしょうか?

よい、ご返事をお待ちしております...
imakarakokokara  [2002/02/06 Wed 02:07:07]  [43.228.122.50]

to なべ@abk, 澤口@一升金 さん

ご返答有難うございます。
あれから、まだ試していないのですが、わたしのPCにはconfig.sys
が3つあり、そのうちの1つにDEVICE=C:\WINDOWS\HIMEM.SYSと記述
があります。
それとWindowsMeのリアルモードDOSの起動ですが、これで正しいか
どうかは分かりませんでしたが、COMMAND.COMとIO.SYSだけを入れ
たフロッピーから起動しています。
一度、config.sysからHIMEM.SYSの記述を消して試してみたいと思
いますが、これは消しても支障ないのでしょうか?


澤口@一升金  [2002/02/05 Tue 13:57:30]  [211.2.146.48]

澤口@一升金です。

to imakarakokokaraさん:

WindowsMe とのことですが、どのようにしてリアルモードDOS
を起動していますか?
なべ@abk  [2002/02/05 Tue 02:47:27]  [202.236.152.84]

config.sysに
device=c:\windows\himem.sys とか書いてありませんか?
K.Takata  [2002/02/04 Mon 23:33:27]  [202.219.117.138]

LSI C は MS-C などとは関数のパラメータの渡し方が違うのですが、
その辺は大丈夫でしょうか。
具体的には、lgdt() を修正する必要があると思われます。
imakarakokokara  [2002/02/04 Mon 22:22:13]  [43.228.122.50]

>なべ@abk

返答ありがとうございます。
リアルモードDOSというと、DOSのみを起動させた状態ですよね?
その状態でも動かないのです!
他の原因はかんがえられませんでしょうか?
なべ@abk  [2002/02/04 Mon 18:00:00]  [202.236.152.84]

Windows動作中は動きません。HIMEM.SYS が組み込まれてても
おそらく動きません。
Real mode DOS で試しましょう。
imakarakokokara  [2002/02/04 Mon 17:30:56]  [43.228.122.50]

はじめまして。
最近486でのプログラミングを勉強しているのですが、
アスキー出版局の「はじめて読む486」に載っているプログラム
"pmseg.exe"(リアルモードからプロテクトモードに移行し、プ
ロテクトモードのセグメント方式の働きを確認するプログラム)
がどうしても実行できません。
どなたか、ご存知の方は対処法を教えていただけないでしょう
か?たぶん、次のアセンブリコードが原因だとおもうのですが...

saveDS word ?
saveES word ?
saveSS word ?
;
;; void RealToProto( void );
;
RealToProto_ proc near
push bp
mov bp, sp
;
mov cs:saveDS, ds
mov cs:saveES, es
mov cs:saveSS, ss
;
cli
;
mov eax, cr0
or eax, 1
mov cr0, eax
;
jmp flush_q1
flush_q1:
byte 0eah
word offset set_cs_desc1
word 08h
set_cs_desc1:
mov ax, 10h
mov ds, ax
mov es, ax
mov ax, 18h
mov ss, ax
;
pop bp
ret
RealToProto_ endp

ちなみに実行、コンパイルはWindowsMe, masm6.0, LSI-Cです。
どうかよろしくお願いします。
kattyo  [2002/02/01 Fri 14:21:59]  [202.18.170.10]

ログ整理お疲れ様です。

Unit Missing Link  [2002/01/25 Fri 04:30:50]  [61.114.64.6]
Unit Missing Link's Web page 'Rhythm'

 こんばんわ Unit Missing Link の Mist! です。
 随分とそのままだったログを以下のように整理いたしました。

  02/01/00 〜 03/31/00 の書き込みをログページ Message Log 20 に、
  04/01/00 〜 04/30/00 の書き込みをログページ Message Log 21 に、
  05/01/00 〜 05/19/00 の書き込みをログページ Message Log 22 に、
  05/20/00 〜 06/15/00 の書き込みをログページ Message Log 23 に、
  06/16/00 〜 07/20/00 の書き込みをログページ Message Log 24 に、
  07/21/00 〜 09/30/00 の書き込みをログページ Message Log 25 に、
  10/01/00 〜 12/31/00 の書き込みをログページ Message Log 26 に、
  01/01/01 〜 01/31/01 の書き込みをログページ Message Log 27 に、
  02/01/01 〜 04/30/01 の書き込みをログページ Message Log 28 に、
  05/01/01 〜 05/14/01 の書き込みをログページ Message Log 29 に、
  05/15/01 〜 05/25/01 の書き込みをログページ Message Log 30 に、
  05/26/01 〜 07/31/01 の書き込みをログページ Message Log 31 に、
  08/01/01 〜 09/14/01 の書き込みをログページ Message Log 32 に、
  09/15/01 〜 12/31/01 の書き込みをログページ Message Log 33 に移動しました。

 長らく重い掲示板でしたがこれで少しは快適にご活用いただけると思います。

 時間を見つけて Assembler FAQs に着手しようと思うのですが、なかなかう
まく進んでくれません。

 何かございましたらお気軽に書き込み、もしくはメールをいただけますよう
お願い申し上げます。
opo  [2002/01/21 Mon 12:18:59]  [160.15.30.2]

tsuyoshiさんへ

あっ!どーもありがとうございます。
まあがんばってみます。
返事遅れてすいません。
なべちゃん  [2002/01/20 Sun 15:35:56]  [218.46.27.196]

↓教えてくれてありがとう。なるほどねー。

Tsuyoshi  [2002/01/18 Fri 18:55:32]  [211.8.107.70]

Livesさん&なべちゃんさんへ

結果報告も兼ねての書き込みです。

CS裏レジスタの値をいろいろ変えて実行してみた結果、
どうやら、リアルモードに戻るとき、
例の Dフラグがオンになっていると止まってしまうようです。

Livesさんのおっしゃる通り、
「オフセットがFFFFh以降になってもちゃんと実行できている」
ようでした(汗)。

------

opoさんへ

僕、アルゴリズムについてはさっぱりなので・・・。

「泡立ちソート」と呼ばれるようです。
先頭から、隣接したある2つの要素に着目して並べ替えを行い、
全要素についてその並べ替えを行います。
それを数回繰り返します。

というような感じのもののようです。by"明解C言語入門編"
どん  [2002/01/18 Fri 12:41:54]  [202.32.8.10]


>アセンブラでバブルソートを書かないといけないんですが

で、CPUは?


opo  [2002/01/18 Fri 09:37:33]  [160.15.30.2]

アセンブラでバブルソートを書かないといけないんですが、まったくわかりません。
教えてください。
Lives  [2002/01/17 Thu 21:39:27]  [150.37.251.15]

また書き忘れてしまいました。すいません。
 たしかにCS.Dビットが0であれば、オペランド、アドレスともに
16ビットサイズとして命令を読んでいきますが、リミット値(FFFFFhでも)と
Gビットはリアルモードに降りた後も反映されるようです。

 つまりアドレスはFFFFh以上のアクセスが許可されるけど、
そのためには16ビット命令にいちいちプリフィックスをつけないと
いけないということです。(16ビットモードであることに変わりはないですね)
Lives  [2002/01/17 Thu 21:22:42]  [150.37.251.15]

>仕様書によれば、
 「リミット:FFFFh バイト
 ベース:現行のセグメント×16
 セグメントタイプ:.....USE16....」
 でないとリアルモードに降りられないようですから、

 そうなんですか。僕の場合だと i486-Sx, Debugコマンドを使って、
リアルモードからプロテクトモードに移行して、セグメントリミットを
FFFFh以上に設定後、リアルモードに降りるプログラムで試してみたのですが、
オフセットがFFFFh以降になってもちゃんと実行できているようでした。

 最近のCPUやアセンブラは、まだわかりませんがいろんな制限が
あるのかもしれないですね。

 あまり信頼性のないような情報で、申し訳ありませんでした。
Tsuyoshi  [2002/01/17 Thu 18:26:40]  [211.8.107.70]

まず、書き込みミスの訂正を・・・。
訂正:2002/01/12 Sat 21:39:05 の書き込みについて
63行目
; P=1,DPL=0,DT=0,S=1
-> ; P=1,DPL=0,DT=1

> 386CPUでは Dビットが1だと32ビットモードになってしまい、
> ......(省略)。

なべちゃんさんは、その事について、
「リミット64KBと仕様として規定されてるぐらいだからダメかも」
「Limit 64KB でないときにリアルモードに降りようとすると
失敗するように作られてる可能性があるかもしれない」
とおっしゃっていました。
Livesさんのおっしゃるようなことが起こると大変だから、
CPU側で止められてしまう可能性があるとのことです。

実際にそのプログラムは何をやっても動きませんでした。

仕様書によれば、
「リミット:FFFFh バイト
ベース:現行のセグメント×16
セグメントタイプ:.....USE16....」
でないとリアルモードに降りられないようですから、
やはりそれに反したことはできませんね(当たり前のこと)。

それと、USE XX の話なんですが、
僕もまだプログラミングし始めてから1年半くらいしか
経ってないド素人なんで、よく分からないんですが、
僕が認識するところの USE XX は、
Dフラグで区別される、アドレス及びオペランドサイズのことです。
もし間違っていれば、ご指摘を受けたいところです。

それでは。
Lives  [2002/01/16 Wed 22:36:40]  [150.37.251.15]

>Tsuyoshiさん
 しつこくてすいませんが、説明不足かもしれないので追加します。
 CSでのDビットに当たる位置は他のデータセグメントでは、
Bビット(ビッグビット?)と呼ばれているようで下方伸張セグメント
のときの上限を指定するもののようです。(FFFFh or FFFFFFFFh)
(具体的にはわかりませんが)
 CSと他セグメントのディスクリプタキャッシュは大体において
似通った内容となっていますが、D/Bビットのように、
同じビットでも、CSではオペランドとアドレスのデフォルトサイズを変更、
SS, DS, ES, FS, GSでは上限のサイズを変更、といったような
まったく異なる性質の属性もあるようです。

 アセンブラでプロテクトモードのプログラムをより簡単に組めたら
便利そうですね。(というかそれが普通なのでしょうが)
自分でも勉強してみたいと思います。
Lives  [2002/01/16 Wed 22:15:13]  [150.37.251.15]

>Tsuyoshiさん
 はじめまして、自分、アセンブラでプログラムしたことのない人間
なので、use16とかよくわからないんですが、

>; G=1,D=1,AVL=0,SegmentLimit(16-19): Fh
 ; P=1,DPL=0,DT=0,S=1
 386CPUでは Dビットが1だと32ビットモードになってしまい、
そのまま16ビットプログラムに戻っちゃうとオペランドとアドレス
のサイズ関係で操作値やらオペコード長やらめちゃくちゃになるのでは
ないでしょうか。例えば、16ビットでは Push Axが Push Eaxとか。
それとも、そこら辺はアセンブラがうまく処理するんでしょうか。
 Gビットはリミット値に対してしか効かないのでいいと思います。
仮想8086モードはわかりませんが、ディスクリプタキャッシュの
設定は、リアルモードでも結構反映されるようです。

 アセンブラ素人なので申し訳ないですが、これぐらいしかわかりません。
Tsuyoshi  [2002/01/16 Wed 19:11:52]  [211.8.107.70]

Tsuyoshiです。
たびたび参上させて頂いております。

>EIPを命令ポインタとして実行できないから、
>ほとんど恩恵を受けられないですね、よく考えると。

そうなんです。

暴露なんですが、発端は最近のことで、
無理矢理にFreeDOS付属のFDXMS.SYSを逆汗したことからなんです。
(これが初めての逆アセンブラ経験でした(汗)。)

その中で、この FlatRealMode という物にであって、
次に考えたことが、
CSセグメントレジスタをフラットにできれば、
リアルモード上でEIPを命令ポインタとして利用できるのでは
ないかということでした。

でも、実際はなべちゃんさんのおっしゃる、
RealModeはリアルモードで、所詮16ビットの世界なんですね。

ありがとうございました。

------

>mov eax,cr0
>and eax,7ffffffch ; 違うかも
>mov cr0,eax
>jmp short LABEL01
>LABEL01:
>(ここからリアルモード)

この結果報告は、また後ほどにということで・・・(汗)。
kou  [2002/01/16 Wed 13:23:30]  [218.41.185.73]


なべちゃん  [2002/01/15 Tue 19:58:46]  [202.236.152.84]

でしゃばってる割には頼りなくてごめんなさいね。

ひとつ気になったのは、Limit 64KB でないときに
リアルモードに降りようとすると失敗するように作られてる可能性が
あるかもしれない、といったところでしょうか。

EIPを命令ポインタとして実行できないから、
ほとんど恩恵を受けられないですね、よく考えると。
Real modeに降りるのはたしかこんなルーチンですので、
CSによってどう違うか、よかったら試してみてください。
どうなるか気になります(^^

mov eax,cr0
and eax,7ffffffch ; 違うかも
mov cr0,eax
jmp short LABEL01
LABEL01:
(ここからリアルモード)

Tsuyoshi  [2002/01/15 Tue 19:01:38]  [211.8.106.2]

>フラットリアルモード自体初耳だったりしたのですが

Googleなどで、"Flat Real Mode"で検索すると
わんさか出てくる内容で、かなり有名らしいです。

>...セグメント裏レジスタの値と>その効果が
>CPUの動作で規定されてないとすると、...

手元にある
「MMXPentiumアーキテクチャ・プログラマーズ・マニュアル」
の8.1.4節を読む限りでは(僕のパソコンMMX-Penなんです。)、
そんな事はなさそうな気がします。

CPUの一番最初(もちろんリアルモード)のCS:EIPは、

EIP=0000FFF0h
CS=
セレクタ:F000h
ベース:FFFF0000h
リミット:FFFFh
存在、読み取り/書き込み、アクセス済み
->実行開始アドレス
=EPROM開始アドレス=FFFFFFF0h

と書かれてあって、
更に、

"EPROMベースのソフトウェア初期化コードが完了するまで
CSレジスタ内のベース・アドレスが変更されないようにするため、
コードにfarジャンプまたはfarコールを入れてはならない。
あるいは割り込みを発生させてはならない。"

と書いているということは、
CSレジスタの値はCSセグメント裏レジスタの値に
反映しているということになるんじゃないかと
考えています。

でも、なべちゃんさんのおっしゃるように、
読む限りではそんな事までは書かれてないようです。

>>リミット:FFFFh バイト
>>ベース:現行のセグメント×16
>>セグメントタイプ:.....USE16....
>>でないと、リアルモードに戻れないって事ですね?

よく読んでると、
こっちの物もそのようなことを書いてました(汗)。

>リミット64KBと仕様として規定されてる

それはCSセグメントレジスタに限ってのことかも・・・、
と思う(ただ思う)のですが、どうなんでしょうか。

実際には、それ以外のレジスタはフラットにできたんですから。

>32bit jmp とか割り込み処理とか考えると4GBリミットになっても
>ほとんど恩恵はないかもなぁー。

---、そりゃ言えてるかもしれませんねえ。
僕も最近うすうすそれを感じ始めて、
プロテクトモードの魅力が段々分かってきてるところです。

>というわけで頑張って
はい。
なべちゃん  [2002/01/14 Mon 23:12:51]  [218.46.23.66]

フラットリアルモード自体初耳だったりしたのですが(苦笑)
リアルモードに戻ったときのセグメント裏レジスタの値と
その効果がCPUの動作で規定されてないとすると、
仕様外処理になるから気をつけた方がいいかも(常に動作するとき限らない)。

>jmp 従来のCS値:次のラベル
>というふうにしたらFlatにできるんじゃ・・・、

リアルモードでCSを再設定した時点で裏レジスタも再設定
されるのではないでしょうかな、と思うんだけど、リミットはどうなんだろうなぁ。

>リミット:FFFFh バイト
>ベース:現行のセグメント×16
>セグメントタイプ:.....USE16....
>でないと、リアルモードに戻れないって事ですね?

と手元の資料(80386プログラミング/CPUマニュアルの邦訳)には
記述してありました。
USE32 のセグメントから(USE16を仲介せずに)直接リアルモードへ
降りる方法はOSASKで有名な川合さんが発案(?)して使ってらっしゃいましたが、
それを使ったらどうなるんだろう(わからん)。

リミット64KBと仕様として規定されてるぐらいだからダメかもしれないしなぁ。
32bit jmp とか割り込み処理とか考えると4GBリミットになっても
ほとんど恩恵はないかもなぁー。

というわけで頑張って(ぉぃぉぃ

Tsuyoshi  [2002/01/14 Mon 18:03:45]  [211.8.106.2]

>リアルモードに戻るのにCSの再設定が必要だから
>無理だと思うんですが、気のせいでしょうか……。

プロテクトモードに入るとき、
CSを4GBリミットのセグメントディスクリプタに
セレクトさせ、リアルモードに戻るときは、
jmp 従来のCS値:次のラベル
というふうにしたらFlatにできるんじゃ・・・、
と思ったんですが、勘違いでしょうか・・・。

>プロテクトモードからリアルモードに戻るとき、
>Real CS=Protect CS が条件

これの意味するところは、要するに、
プロテクトモード上でセグメントが
リミット:FFFFh バイト
ベース:現行のセグメント×16
セグメントタイプ:.....USE16....
でないと、リアルモードに戻れないって事ですね?

実際のところ、
そういうふうにセグメントディスクリプタを設定すると、
ちゃんと動きました。

USE16とUSE32との間に起きる矛盾を考えると、
やっぱりできないんでしょうか。
なべちゃん  [2002/01/14 Mon 02:04:09]  [61.201.20.112]

うーん
>いまDOSはver2.11しか使えないのですが、

FPUエミュレーションは、FPU命令に対してエミュレーションルーチンを
コールする割り込みが発生するという仕組みだったような気が……。
エミュレーターは……別ソフトなのかなー、よく分からんですごめん。

>Enterをおしたら書いた文章が消えてしまって、

普通に改行できますけど……。

---
>今度はCSセグメントレジスタを同様にFlatにしようと思いました。

リアルモードに戻るのにCSの再設定が必要だから
無理だと思うんですが、気のせいでしょうか……。
プロテクトモードからリアルモードに戻るとき、
Real CS=Protect CS が条件になってたような気が……違うっけ?

どっちにしろ、Realモードに降りるとき、
バッファのフラッシュで short jmp / far jmp をしますけど、
far jmp をした瞬間にダメな気がします……。

Tsuyoshi  [2002/01/12 Sat 21:39:05]  [61.123.219.3]

Tsuyoshiです。
お久しぶりです。

今回も、質問のため参上させて頂きました。
ProtectModeとの関係が大きい話題です。


RealModeで64KBを超えたプロテクトメモリーが
扱えるようにするために、FlatRealModeという
メモリの使い方がある事を最近知りました。

どうやら、メモリにはセグメントディスクリプタというものがあって、そこには、セグメントの大きさ(セグメントリミット)とベースアドレス、
それに加え細々としたものが書かれているようです。

プロテクトモード上では、メモリ上のセグメントはGDT内にある
セグメントディスクリプタをセグメントセレクタ(レジスタ)が
指すことによって、選択することができます。

RealModeでは、
(ベースアドレス)
= (セグメントアドレス) × 16(Shift-L 4bit)
となっていて、
デフォルトでセグメントリミットはFFFFh byte となっています。

セグメントセレクタには、それぞれに
セグメントディスクリプタを格納するキャッシュがあり、
RealModeでは、そのキャッシュの値が、
それぞれのセグメントレジスタのデフォルト値となります。

そのデフォルトの値を変更して、セグメントリミットが4Gbと
なるように設定するのがFlatRealMode。

ここまでは序段です。


DS,ES,FS,GSセグメントレジスタは難なくFlatにできたので、
今度はCSセグメントレジスタを同様にFlatにしようと思いました。

そこで私はただ単純に、
セグメントディスクリプタのベースアドレスに
プログラム開始時のCSレジスタの値を入れて...

cli
:
jmp 0008h:ProtectModeEnabled
:
:
jmp OriginalCS:ProtectModeDisabled
:
sti

(注1)0008h: GDT entry1
dw 0FFFFh
; SegmentLimit(00-15): FFFFh

CSorigin: db 0, 0, 0
; Base address (00-15): 0
;ここはプログラム開始時のCSレジスタの値が入る.

dw 1100111110011010b
; G=1,D=1,AVL=0,SegmentLimit(16-19): Fh
; P=1,DPL=0,DT=0,S=1
; SegmentType: Code-Exec/R

db 0
; BaseAddress(24-31): 0

(注2)OriginalCS: プログラム開始時のCSレジスタの値。


すると、突然とまってしまうんです。
なんでなんでー!って考えてると、日が暮れてしまう日もあって、
自分独りでは解決できそうもないので、
Technical Assembler さんにご教授をお願いしようと思いました。
きっとどこか間違えているので、指摘して頂けませんか?
1B62h  [2002/01/11 Fri 21:35:18]  [211.8.49.4]

「なべ@abk」さん、「AF」さん、レスどうもありがとうございます。リロケーションについてはよくわかりました。海外のサイトには行きづらいので、ほかのわからないところはヘッダをいじくって逆アセンブラを使ったりして推測しようと思います。N88Basicも機械語も「いじくり→推測」のパターンで覚えましたし。ところで、WinMeをつかっていることや諸事情でいまDOSはver2.11しか使えないのですが、そんな古いDOSでもFPUエミュレーションはサポートしているのでしょうか?古いDOSほどサポートは必要ではありますが。話は変わりますが、98の割り込みベクタ16h番は数値データプロセッサとなっているのですが、ひょっとして、これで数値演算が行えるのでしょうか?8hから17hはハードウェア割り込みとなっているので、OSが違っても使えると思うのですが(ハードウェア割り込みの意味を勘違いしているかも)。擬似命令については、インタプリタ→コンパイラ→アセンブラと、他人が用意したものになるべく依存したくないと思う傾向がどんどん強くなっているので、なるべく使いたくないので(ここで他人に頼ってはいますが)。今はもっぱらハンドアセンブル&バイナリエディタです。アセンブラについてはまったく関係のない話ですが、この書き込みで改行はどうやってすればよいのでしょうか?Enterをおしたら書いた文章が消えてしまって、これが3回目のトライです。(というわけで改行のない非常に読みづらい書き込みになってしまってすみません。)
AF  [2002/01/07 Mon 00:59:09]  [210.233.166.61]
http://www.ksky.ne.jp/~afuruta/

1B62hさんこんにちは、

> EXEファイルのヘッダ(リロケーションテーブル、必要メモリ、オーバレイなど)

DOS, EXE, MZ, header, format 等のキーワードで英語圏の
サイトを検索すると見つかるかも、確かファイルフォーマット
集みたいなサイトにも行き当たれる気がします。
でも、オーバレイはそれをサポートするライブラリを
使わないと機能を発揮しません。

> よければFPUエミュレーションでの浮動小数点演算

自分でエミュレーションパッケージを作りたければ
取りあえず下に示す本かな、

『アセンブラによる高速演算技法』
http://www.ascii.co.jp/books/detail/4-7561/4-7561-0459-2.html

値段が高いので(4,800円)高校生で買えるかなぁと
(というより売っているのかなぁと)心配しています。
読みこなすには高校数学から少し背伸びをする必要が
ありますが、数学に年齢制限なんて無いですから...

# ちなみに 80x87 の浮動小数点は内部 80 ビットで計算
# しているので若干他のプロセッサと結果が違うと思った。
# 詳しくは IEEE754 での精度の取り決めを調べてみてく
# ださい(でも、応用がゲームなら気にしなくても多分平気)。

手っ取り早く浮動小数点計算がしたいというのであれば
フリーでダウンロードできる Turbo C の FPU エミュレータ
を拝借する手もあります。

# http://community.borland.com/ にてサインアップが必要ですが

.ASM ソースに EMUL 擬似命令を付けてアセンブルしリンク
すれば良いはず(本当はもうちょっと手が掛かったと思った)。

では、

澤口@一升金  [2002/01/05 Sat 11:00:41]  [211.2.146.50]

澤口@一升金です。

to あすむさん:

デバッグモードで作った実行ファイルは F5 で起動し、リリースモードの実行ファイル
は CTRL+F5 で実行します。
デバッグモードで実行できてリリースでエラーが出るのは、初期化されていないポイ
ンタが使われていることが多いようです。
なべ@abk  [2002/01/05 Sat 05:15:28]  [61.201.18.194]


>「リロケーション」や「オーバレイ」の意味や役割でした。

オーバーレイがちょっと分からないのですが(ぉぃぉぃ)、
リロケーションというのはラベルなどの位置を再配置(relocation)することです。

DOSにおいてメモリアドレスは SEG:OFF で
例えば 0550h:1444h などとなってるのはご存じですよね。
この場合、実際のメモリアドレスは 5500h + 1444h = 6944h になります。
DOSは1MBのメモリを16byte(1パラグラフと言います)ごとに分割して使用していて
すべてのプログラムはロードされるときまで、
どこの番地で実行されるか(セグメント値がいくつになるか)分かりません。

jmp 命令などで、セグメントの違うアドレスを飛ぶとき、
セグメント値が決まらないとうまく動きません。
このため、セグメント値をロードしたメモリによって
適正に値を設定してやる必要があります。これがリロケーションです。

>FPUがないCPUの場合に浮動小数点演算を行うプロシージャを

DOSが行っていたような気がします。曖昧ですが。
autoexec.bat で何か設定するんですが……(忘)
FPUが無い場合エミュレーションが行われるように設定する必要があります(^^;;

>PC98ユーザーズガイドとintelのオペコード表

私が最初やってたのと似たようなものですよ(笑) 98じゃなかったですが。
基本的にI/O資料とオペコード表があれば、プログラムは組めます。
と、まともに考えるなら、図書館などで
「はじめて読むマシン語」「はじめて読むアセンブラ」「はじめて読む8086」と
一度一通り読まれるといいかもしれません。
あとはその時代の古い雑誌とかをあたるといいですよ。

>例1 EBX、ECX、ESI、EDI etc... を破壊してはならない!!

破壊してはならないと、使用後元に戻すは本質的に同じですが。
VCは知りませんが、一般的に ebp,edi,esi,ebx,esp +セグメントレジスタ
全部は変更不可なような気がします(VCも同様らしいです)。
試しに、全部のレジスタを push/pop で退避/復元してみてはどうでしょうか。

あとはメモリエラーがどの位置(作成したアセンブラ関数内か外)か、
そのエラー命令の内容はどんもなのかみれば確認できそうですが。

>#ここら辺はもしかして、す〜ぱ〜ぱいぷらいんが絡んでるじゃないですか。
>#だから、jmp命令でキャッシュをふらっしゅ!したんですけど駄目でした。(涙)

うーん多分違います。CPUのハードウェアレベル最適化(高速化)は
ソフトウェアレベルで全く影響が出ないように設計されるのが普通ですし。

あすむ  [2002/01/05 Sat 03:42:22]  [211.2.42.66]

あすむです。
なべ@abkさんありがとうございます。

>アクセス違反ですから、ポインタの扱いを間違ってるのではないでしょうか?
やはり、そう思います?
何度もソース見直してるのになんでかな〜。


ところでVCでインラインアセンブラを書く時って、
決まり事ってありましたっけ?
例えば、
 例1 EBX、ECX、ESI、EDI etc... を破壊してはならない!!
 例2 EBX、ECX、ESI、EDI etc... を使用したら(関数終了時に)元に戻す事!!
こんな具合のようなもの。
#この例はむか〜しに聞いたような気がするけどよく覚えていない。


#あとは個人的に疑っているのが、デバッグのステップ実行でうまくいって、
#通常の実行でコケるあたり。
#ここら辺はもしかして、す〜ぱ〜ぱいぷらいんが絡んでるじゃないですか。
#だから、jmp命令でキャッシュをふらっしゅ!したんですけど駄目でした。(涙)


ということで、もう一度ソースを見直してみます。
どうも有難う御座いました。

1B62h  [2002/01/04 Fri 16:53:50]  [211.8.49.4]

「なべちゅん(なべちゃん?)」さん、レスどうもありがとうございます。私が知りたかったのはもっと初歩的なところで、「リロケーション」や「オーバレイ」の意味や役割でした。(前者は一応見当はついているのですが。)それと、FPUがないCPUの場合に浮動小数点演算を行うプロシージャをソフトウェア側で用意することをFPUエミュレーションというものだと思って使っていましたが、ひょっとして違いましたか?自分で作った32ビット同士の浮動小数点乗算プログラムが、正しい値にならないのでPC98全盛(というか86〜486時代)のときに使われていたよい方法を教えていただけないかな、と思ったのでした。(自分で作ったプログラムと同じアルゴリズムで6ビットぐらいの数を紙に書いて計算したときには正しい値が得られるのですが)
ところで、私は、古本屋や書店でアセンブラ関係の本に出会ったこともないので、持っているアセンブラ関係の資料といったら、PC98ユーザーズガイド(i/oポート系やメモリアドレスなどが載っているだけでアセンブラの資料とはいえない)とintelのサイトで見つけたオペコード表ぐらいしかないのですが、そういった本を扱っているところはやっぱり少ないのでしょうか?それともただ単に私の行ったところの品揃えが悪かったのでしょうか?
なべちゅん  [2002/01/02 Wed 05:22:42]  [61.201.20.132]

>私のやってるABK Project名でこんなのがあります。
訂正、合著氏名義でした。

なべ@abk  [2002/01/02 Wed 05:21:57]  [61.201.20.132]
Free386 offcial

>「Access Violation」のダイアログが出力されます。
アクセス違反ですから、ポインタの扱いを間違ってるのではないでしょうか?
VCはまともに使ったことないので(ましてディバガは)よく分からないのですが
セグメントレジスタが不正でないか、確保した安全なメモリではないメモリに
アクセスしてないかよく確認してみたらいいかも知れません。

>アセンブリプログラムは286の98でやっています。

いいですね。98とかのDOSマシンでアセンブラを学ぶのは大変有意義です。
アセンブラがまともに使える人がどんどん減少してると
思われるのでぜひ頑張ってくださいね。

>EXEファイルのヘッダ(リロケーションテーブル、必要メモリ、オーバレイなど)が
>よくわからず作れません。

その昔発売されていた「MS-DOS拡張機能」というDOSの拡張パックに
付属のマニュアル(MS-DOS プログラマーズリファレンス)に書かれていたと思います。
PC-98/ FM-R,TOWNS / OKI-if800...etc 何でもいいので、みつけたらぜひgetしてください。
DOSプログラムに必要な基本知識は、ほとんどそこに詰まっています。

EXEファイルのヘッダは、私のやってるABK Project名でこんなのがあります。
簡易すぎますが、参考になるでしょうか?
ftp://ftp.abk.nu/pub/text/dos/
英語の資料ならば、DOS header relocation 辺りを入れて検索すれば
出てくるようです。

>よければFPUエミュレーションでの浮動小数点演算に

エミュレーションの何を知りたいのかが分かりません。




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