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

 
Tips
 

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


 
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/01/0005/19/00
 




ココアラ  [2000/05/19 Fri 23:43:42]  [210.228.248.121]

>一応ML.EXEとTASM.EXE、NASN.EXEを
>持ってます。もっと良いとがあればそちらの方がいいんですけど。
>初心者に扱いやすいというよりも将来性のあるものが良いです。

充分すぎやしませんか・・・!?

将来性は、どのアセンブラを使うか云々ではなく、あなたの積む経験が
ものをいうと思います。つまり、どれを使ってもOK、と思います。

ソースコードの可搬性のことを言うなら、MASMかTASMなのかな?
KS  [2000/05/19 Fri 22:05:10]  [210.147.136.10]

はじめまして、KSといいます。
厳密には大分前に1・2度違うHNで質問させて頂いているので
はじめましてでは無いかもしれませんが。

今回ここの掲示板に戻って来たのはもう1度アセンブリ言語に
兆戦しようと思ったからです。
前は結局C言語に逃げてしまいました。
Cを学ぶ前にここのページを何度か見ていたので1度挫折したCを
何とか理解できるようになりました。
いくつかソフトも作ってみました
それで、上を目指したいというのかでアセンブリ言語にもう1度
兆戦することにしました。
Cの時と同じように、Cを勉強したことにより
(余り関係ないですが、プログラムが如何なるものなのか
ということが少し理解できたので)
前のアセンブリ挑戦で挫折させられたセグメントも
何とか理解出来たかなと自分で思ってます。
実際は分かったというふうに勘違いしてる可能性もありますが(^^。

でCでのプログラミングの経験からプログラミングを学ぶには
実戦が一番ということが分かりました。
なのでアセンブリで何かソフトを作ってみたいと思うのですが、
何かいい入門用の初めに作れば勉強になるようなソフトは
ありませんか?
出来ればつまずいた時にここで聞けばすぐに答えの帰ってくるような
簡単なやつが良いんですけど。
あとこれからアセンブリを学んでいくにはどのアセンブラが
良いですか?
一応ML.EXEとTASM.EXE、NASN.EXEを
持ってます。もっと良いとがあればそちらの方がいいんですけど。
初心者に扱いやすいというよりも将来性のあるものが良いです。
もしML.EXEならもう1度↓アドレスからDLしようと思います。
いろいろとあつかましいことをだらだらと書いてしまいましたが、
よろしくお願いします。それと長すぎてすいません。
澤口@一升金  [2000/05/19 Fri 17:39:11]  [211.0.69.33]

澤口@一升金です。

to JA KYOSAI さん:

CPU や FSB クロックの設定は CPU やチップセットのソフト的
な機能ではなく、マザーボードのハード設定機能ですので、一般
的にはできないと思います。
arm  [2000/05/19 Fri 12:52:27]  [192.51.44.19]

>とりあえず、Cのコードをコンパイルする際にアセンブラ
>コードの出力をさせてみます(VC++6.0)。
># 可能なんですよね(汗)
>...ちなみに、これを行うにはどうすればいいので
>しょうか?

一番簡単な方法は、何か適当なソースを書いて、(a = bとか)
そこにF9キーでブレークポイントを張って実行させます。
停止したところで、右クリックして「混合モードを表示」とすれば、
アセンブラのコードが出てきます。

アセンブリソース生成のオプションは /Fa です。
コマンドプロンプトから、VC++のbinにあるvcvars32.bat実行して、

cl /Fa main.c

みたいな感じでOkです。

刹那  [2000/05/19 Fri 09:25:28]  [138.107.10.1]

ぴょン太さん、貴重な情報&ご助言、誠にありがとう
ございました。

> インラインだけなら関数間の引数や戻り値の受け渡しの方法とか
> Cのコードがどんなニーモニックに変換されるか、とかが
> 理解出来ていれば、初めから勉強しなくても問題ないんではないでしょうか。

ハイ、ここから躓いております(汗)
とりあえず、Cのコードをコンパイルする際にアセンブラ
コードの出力をさせてみます(VC++6.0)。
# 可能なんですよね(汗)
...ちなみに、これを行うにはどうすればいいので
しょうか?
オンラインヘルプを見る限りでは出てなかったです。
もしかして、コマンドラインからコンパイルしないと
できないのでしょうか?
また、この方法が書かれているHP・書籍に関する情報を
もしご存知でしたらお教え頂けないでしょうか?
# もしFAQでしたらすみません。

どうか、宜しくお願い致します。
JA KYOSAI  [2000/05/19 Fri 00:58:25]  [210.197.210.9]

質問なのですが,CPUの倍率を変更、もしくはFSBを変更するプログラムを作りたいと思っています。チップセットやCPUによって、コーディングは違うと思いますが、技術的に可能でしょうか?
ぴょン太  [2000/05/18 Thu 12:26:23]  [210.159.27.125]

@参考書籍等
インターフェース別冊とかトラ技のバックナンバーとか、
結構古いのは本屋で探すより古本屋で回って探したほうがいいかも。
書店や出版社に注文したところで在庫切れなのは目に見えてるし。
あとは、電子回路が好きな人とか大抵はCQ出版のバックナンバーを
持ってますので見せてもらったり譲ってもらったりするのも一つの手かも知れません。

to 刹那さん
インラインだけなら関数間の引数や戻り値の受け渡しの方法とか
Cのコードがどんなニーモニックに変換されるか、とかが
理解出来ていれば、初めから勉強しなくても問題ないんではないでしょうか。
言うまでもなく1からアセンブラ組めるのが一番でしょうけど。

インラインアセンブラのマニュアルとかを探すよりは、
人の書いたものを参考にするのがいいかも知れません。と思います。
ftp://ftp.hornet.org/pub/demos/code/effects/
↑海外のdemoのソースとか見ると、
ほとんどがアセンブラか、C+インラインアセンブラ、
あるいはPascalで書かれてるようです。
あ、↑のサイトだとVC関係ないですね…
刹那  [2000/05/16 Tue 15:14:17]  [138.107.10.1]

はじめまして。
[MMX] & [インラインアセンブラ]で検索をかけて
此処に来ました。
今後ともどうぞ宜しくお願い致します。

早速質問で恐縮ですが、VC++ 6.0のインライン
アセンブラを用いてMMX命令を用いた処理を作成
したいと思っておりますが、VC++ 6.0のインライン
アセンブラに関するマニュアルというものは存在
するのでしょうか?
もしありましたら、書名等をお教え頂ければ大変
嬉しく思います。

# やはり8086アセンブラ用の書籍から勉強しなく
# てはいけないでしょうか(汗)

どうか宜しくお願い致します。
近藤妥  [2000/05/16 Tue 01:38:31]  [202.245.160.87]

ぴょン太さん
ありがとうございます。
早速、探しに行こうと思います。
ぴょン太  [2000/05/16 Tue 00:26:37]  [210.139.252.163]

うわーごめんなさい。
今日DOS6で動かして見て、死にました。
inを使ってたのが悪かったみたいで直しておきます(汁)
バッファに溜まってるとか、そんなのが悪さをするんでしょうか。
Win98の窓では動くけども、DOSで動かすと、ってことで、
やっぱDOS窓はエミュレーションな部分があるんでしょう。多分。

>- エントリ(開始アドレス)を指定してない。
なぜか昔はmainを書いてたのですけど、
書かなくても動くので今は書いてません。
やっぱり必要なんでしょうか?

>- メモリ1バイトを2バイトレジスタに入れる処理が好ましくない。
これは頭ではわかってたんですけど、
ソースを書いていたときにとりあえず1バイトにしたかったんで…
ああ。言い訳ですね^^;;

>- 文字列の長さに定数値を使っている。
>〜略〜
>cmp cnt_flg,(offset mese)-(offset mes)
うーん。そんなやり方ってあったんですね。勉強になります。

今日、また授業があって、きちんと動くようになったので、
直しておきます。わざわざどうもです。
力卜  [2000/05/15 Mon 17:45:10]  [192.51.44.12]

to ぴょン太さん
ソース見てみました。いくつか気になった点があったので挙げてみます。
なお、私はWin2000Proのコマンドプロンプト上で、nasm用に書き直しています。

- エントリ(開始アドレス)を指定してない。
ラベル"main"をエントリにしたいようですが、それが指示されていません。
masmはよくわかりませんが、ソース末尾の end を、end mainとかにするのかな?

- スタックセグメントとスタック用バッファは用意してあるけど、使っていない。
Win2000の debug.exeで vect1ch.exe の起動直後の ssとspの値を見ましたが、
ssは、csと同じ値を、spはゼロを持っていました。(^_^;)
スタック用バッファの次のアドレスを指すように ss:sp を設定します。
stack segment word stack 'stack'
dw 100h dup(?)
sbottom:
stack ends
:
main proc near
cli
mov ax,stack
mov ss,ax ; ss設定
mov sp,offset sbottom ; spをスタックの底に設定
sti
:

- メモリ1バイトを2バイトレジスタに入れる処理が好ましくない。
次のようにしてsiに、cnf_flg(バイトメモリ)の内容を入れようとしていますが、
mov si,word ptr [cnt_flg]
and si,00ffh ;;マスク
これは、次のようにするとよいと思います。(masmでうまく通るかな?)
movzx si,byte ptr [cnt_flg]
または、最初の
cnt_flg db 0 ;;55ms*n カウント
の後ろに、
db 0
を入れて、and si,00ffh をやらないという方法もあります。
場合によって、word として見たり、byte として見たりするのです。
なお、私なら、
xor bx,bx
mov bl,byte ptr [cnt_flg]
mov dl,byte ptr [mes+bx]
とやります。…
# 私は 486DX で開発している人間なので、パーシャルレジスタストール
# は意識していませんが、最後の例は引っかかるのかもしれないので、
# 気を付けてください。

- 文字列の長さに定数値を使っている。
cmp cnt_flg,21
という行がありましたが、最初に
mes db ' PUSH ESC KEY TO END '
mese:
とかしておけば、
cmp cnt_flg,(offset mese)-(offset mes)
と書け、あとでメッセージを変更しても問題なくてよいと思います。

- キー入力を I/Oポート直読みで行っている。
これは問題というワケではないですが、キーポートの直読みをしている
ため、私の環境(Win2000Proのコマンドプロンプト)では、二度目以降の
起動直後に、すぐにプログラムが終了してしまいます。
調べてみたら、最初に起動したプログラムの後でのI/Oポート60hの読み
込み値が、常に 1になっていました。
BIOSファンクションや、BIOSワークの読み出しでキー入力を調べた方が
よいかも知れません。
ではでは。

ぴょン太  [2000/05/14 Sun 05:19:35]  [210.139.252.164]

to 近藤妥さん

トラ技SP、ブートストラップ、インターフェースなど、
CQ出版社から出てるものは、ある程度信用していいと思います。
トラ技SPの中でも、No10「IBM PC&80286のすべて」はよく見ます。
基本的なことは「すべて」書いてあります。多分。
ただ、トラ技SPは最近本屋ではNo50〜くらいしか置いてなくて全く見かけません。

そういやCQ出版の別冊本ってなぜかあまり紹介されませんね。
私が見てないだけかも。時代は過ぎたのか。
近藤妥  [2000/05/14 Sun 02:09:34]  [202.245.160.87]
C言語で始めるWindowsプログラミング

PC/ATの基本ハードについての良書を教えてもらえませんか?
BIOSの使い方など、DOSとアセンブラから攻めていくのに
必要なのです。
ぴょン太  [2000/05/14 Sun 00:21:30]  [210.139.252.165]
1CHのサンプルです^^;;

↑時間のある人は見てくださいね。ソース汚いですけど。MASM5.1です。
何か「こうすると良い」とか、アドバイスもらえるとうれしいです。
私の宿題をやってくれ、と言ってるわけではありません。
あと拡張子をexeにするとexeファイルが落ちてきます。そんだけ。
------------------
to Kakef31さん

今の私の知識では、全くついていけません(汗)
昔、一度だけPC98のHDDをガリガリとダイレクトに読み書きしたんですが、
もちろん、クラッシュしました。DOS5だけだったからよかったんですけどね。
その辺のことも機会があれば触ってみたいとは思うんですが、
まだそんなに知識が無いのと、資料が英語なのとで、
私には見つけることさえも難しいです。
誰かが和訳で書いてくれるのを待ちましょう。
なんだか人任せですね…。あぁ。
------------------
to 澤口@一升金さん

外国にもいないんでしょうか…。
いつも外国にはとんでもないプログラムを作れる凄腕のプログラマーがいて…
という印象なんですが。

軍のドメインってなんだか格好良いですね。
そういや圧縮とか暗号化の技術には「やれ軍隊だそれ輸出だ」というのが
ついてきますが、そんなに大変なことなのでしょうか。
私には一生関係なさそうですが^^;;;
澤口@一升金  [2000/05/13 Sat 09:19:17]  [211.0.69.33]

澤口@一升金です。

to ぴょん太さん:

わたしは FA 開発者の ML にも入っていますが、 WinNT
でリアルタイム割り込みを使いこなしている人というのは
見たことありませんから、外国にもいないんじゃないでし
ょうか。

わたしならリアルタイム Linux をおすすめしたいですけ
どね。 VMWare を乗っければ Windows アプリも走るでし
ょう。

http://www.rtlinux.org/rtlinux.new/index.html

フリーのリアルタイムカーネルにはこんなのもあります。
( URL アドレスに注目!)
日本の自衛隊も情報戦の準備くらいしているでしょうから、
成果をどんどん公表してもらいたいですね。

http://www.rtems.army.mil/rtems.html
Kakef31  [2000/05/13 Sat 09:11:04]  [210.253.98.109]

>ぴょん太さん

・割りこみ関係(私もよく知らないのですが)
DOS窓で(ハードウェア割り込みをフックする)プログラムを
常駐させたまま窓を閉じる、これと似たような事ですかね。
本来のタイマ割りこみはシステムVMで処理され、
DOS窓のベクタはエミュレーションされているですが、
幾つかの割りこみは、ウィンドウがアクティブでなくても、
ベクタテーブルが指すルーチンを呼んでいるのでしょう。

NTも含め、通常はOS以外はIDTを読み書きできないので、
ベクタをいじるには、ドライバを書くか、あるいは、
WIN95系ならVXDとか。それ以外にありません。

・ハードディスク関係
通常のOSでは、ドライバを経由して読み書きしますが、
(WINは知らないけど、UNIX系なら/dev/????とか)
リアルモードで動作するOS(つまりDOS)なら、BIOSを呼びます。
具体的にはint13hを呼び出して、IDE-HDDを読み書きできます。
(SCSI-BIOSが有効にしてあれば、SCSI-HDDも読み書きできます)
このとき、拡張int13hを使わないと、8G以上の領域にアクセス
出来ません。
WIN95系のDOS窓の場合は、
デバイスマネージャでint13hがチェックされていれば
SCSI-BIOSをエミュレーションしてくれます。
ただし、DOSモードでなければ、起動ドライブは書き込みできません。
(起動ディスクの他のパーティションは出来るかも)
拡張int13hの使い方は、日本語で解説してある所は知りませんが、
英語での解説は、見つける事が出来ます。

ついでに。
現在、手元にはDOS/V機しか無いのですが、どうしてもPC98の外付HDD
(しかも開放された領域)を読みたくなった事があり、
幾つか試してみました。(上の文は、その時の経験によるもの)
PC98のHDDのセクタ0の後半部分はほぼ使われていないようで、
パーティションテーブルをうまく書きかえれば、そのまま
DOS上で認識できます。
(拡張領域として設定すればドライブレターも変わりません)
WIN98でもDOS互換モードにならずに読み書きできました。
たぶん、98に戻しても、そのまま起動できると思います。

また長々と失礼しました。
80年式@ぴょン太  [2000/05/13 Sat 01:59:31]  [210.139.252.165]

to カトさん

詳しくありがとうございます。
フラグの退避と復帰、割り込み禁止を追加するだけで
なんとか不安定ながらも動作するものは作れたんですけど、
1Chって、やっぱりタイマだけあって、危険なものなんでしょうか。
プログラムはきちんと動いても、割り込みの後始末を少し怠ると、
Windows(98)が見事におかしくなります。

プログラムを終了してからDOS窓の挙動が段々とおかしくなり、
怖いのでDOS窓を終了して、再度DOS窓を開くも、さらに挙動不審に。
最後にはDOS窓を強制終了も出来ず、電源OFF+Scandiskとなりました。
という現象に陥りました。

あんなのをいじる時って「DOS窓だからハングしてもいいや」という
気持ちは捨てた方がいいんですね…。
フリーズすればマシンの再起動は覚悟しないとダメですね。

それと、
>far jmpの代わりに、far callで元のベクタを呼んですぐに復帰するのなら、

というのは、なんだか参考になりました。
今までfar jmpで飛ぶかiretで戻るかの2つしか無いと思ってましたから。

学校はですね…。秘密ということにしておいてください(汗)
------------------
to 澤口@一升金さん

そんなとこからはじめないとダメなんですか…。
もっと簡単に「どこどこを触って〜(略)〜するとできる」とか思ってました。
かなり険しい道のりですね…。
って言ってもどこかの外人さんとかは簡単に(?)
やってのけるんでしょうけど。
------------------

学ぶべきことが多すぎる。嫌になりそうだ…。どうしましょ。
力卜  [2000/05/12 Fri 12:20:50]  [192.51.44.12]

to ぴょん太さん。

最初のpushfの必要性はわかりますよね。(念のため)

>どうも〜。う、stiにpopf…。そんなの書いてなかった…。

割り込み処理ルーチン自体に時間が掛からないようなら
stiの必要性は低いと思いますが、念のため入れてあります。
ハードウェア割り込み要求は、長時間放っておくと不都合が
起きる可能性がありますので。(一般に何が起きるかはわかりません)

popf は、far jmpで元の割り込みベクタにジャンプするのなら
必要です。そうしないと、スタックの整合性が狂いますから。
far jmpの代わりに、far callで元のベクタを呼んですぐに復帰
するのなら、最初の pushf に対する popf をしないで、far call,
iret の順でしょうか。

>講義の先生は08hではなく今回は「あえて標準的な」1chを扱うと言っていたので
>一応1chなのですが、やっぱり1chの方が標準的なのでしょうか。

標準的か否かというより、用途次第という気がします。

int 08hは、PIT(programmable interval timer)を直接いじって
割り込みの周期を本来よりも短く変えるようなときに処理ルーチン
を差し替えして使います。とてもハードウェア寄りな割り込み
です。
例えば周期を1/4(13.75ms)にした場合、4の倍数回目の割り込みは
55ms周期になりますから、割り込み処理が終了した後、元のベクタ
にジャンプしてあげます。
4の倍数回目でない割り込みだった場合は、割り込み処理が終了した
後に元のベクタに戻るのではなく、自分でハードウェア割り込みの
後始末をしてから復帰します。
具体的には自分で割り込み終了(EOI)を宣言(I/Oポート操作)して、
保存したレジスタを復元して、最初の pushf に対する popf をして
から iret する必要があります。

int 1ch は、int 08h の本来(元)の処理ルーチン内で発行される
ソフトウェア割り込みだと思います。
もし、上記の例のように 割り込み周期が変更してあっても、新しい
int 08h ハンドラは、55msごとに元の int 08hハンドラを呼ぶ
でしょう。(ただし、まっとうな作りのソフトなら、ですが。)
これにより、もし 割り込み周期が変えてあっても、55msごとに
int 1ch が発行されることになります。
また EOI の処理は、int 08hハンドラが最後にちゃんとやって
くれます。
よって、割り込み周期(55ms)を変更する必要がない場合にはこちらを
使う方が EOI などを書かなくてよいだけ簡単です。
また、割り込み周期が変更されないため、処理ルーチンのネスト
(割り込みベクタの書き換えのこと)を何段しても、誤った周期で
処理が行われてしまうなどの問題がありません。
このため、常駐するプログラムに使うのもよいかも知れません。

ところで、楽しそうなことをやってる学校ですねぇ(^_^)
ではでは。

澤口@一升金  [2000/05/12 Fri 09:41:59]  [211.0.69.33]

澤口@一升金です。

to ぴょん太さん:

>あと、NT上で割り込みベクタを書きかえる方法とかってないんですか?
WinNT DDK をダウンロードして、デバイスドライバを作成すれば
できるでしょう。

>それとかOSの制約を受けずに直接HDDをガリガリ読む方法とかないでしょうか。。。
ブートローダを自作して、E-IDE とか SCSI のプロトコルを駆使して・・
Linux とか FreeDOS のソースが読めればそれを参考にできるでしょう。
ぴょん太  [2000/05/12 Fri 00:04:52]  [210.139.252.164]
http://ns.to/asm/

to カトさん

どうも〜。う、stiにpopf…。そんなの書いてなかった…。
講義の先生は08hではなく今回は「あえて標準的な」1chを扱うと言っていたので
一応1chなのですが、やっぱり1chの方が標準的なのでしょうか。
どっちにしろコードに大きな変わりはないと思うのでやってみようと思います。
なんだかDOS用スクリーンセーバーを作るのが目的みたいです。
どうもありがとうございます。また何かあったらお願いします。

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

あと、NT上で割り込みベクタを書きかえる方法とかってないんですか?
書き換えてもメリットはないと思いますが、気になったので…。
それとかOSの制約を受けずに直接HDDをガリガリ読む方法とかないでしょうか。。。
気になればなるほどだんだんと疑問が出てきます。。。うぁぁ(悩)
力卜  [2000/05/11 Thu 10:08:15]  [192.51.44.12]

ぴょン太さん。
PC/AT互換機のDOS(窓)上で、int 1ch じゃなくて、その大元の int 08hを
フックしていいるプログラムを作りましたが、うまく動作しています。
55msごとに本来のベクタにジャンプする処理をしているんですが、
その部分のひな型だけを抜き出してみました。うまく動作すればよいですが…
なお、ソースは nasm 用ですので、masm 用には書き換えが必要なハズです。
OldTmrV dw 0,0 ; 古いタイマベクタ: オフセット, セグメント
TmrHdlr pushf ; フラグを保存する
sti ; 短期間だが他の割り込みを許可する
push ax ; 使用レジスタ群を保存する
push ds ; 〃
mov ax,data ;
mov ds,ax ; データセグメントに値を指定する
: ; (さまざまな処理をする)
pop ds ; レジスタ群を復元する
pop ax ; 〃
popf ; フラグを復元する (cli命令相当の動作を含む)
jmp far [cs:OldTmrV+0] ; 古いベクタにジャンプする
もし誤りがあれば指摘してください>ALL。以上です。

arm  [2000/05/11 Thu 00:51:36]  [163.139.58.62]

こんちは。
インラインアセンブラでメンバ関数にアクセスする方法ですが、なんかだめそうですね。
でもメンバ変数にはアクセスできるので、celsさんの方法を少しいじって、

class Foo {
public:
Foo() { bar = Bar; }
void Bar(void);
void (Foo::*bar)(void);
};

これなら call obj.bar と書けますね。意味ないですが…。

shuna  [2000/05/10 Wed 20:51:37]  [208.32.26.78]

はじめまして。
検索でみつけました。
アセンブラはCでインラインアセンブラを少しやった程度です。
後はデバッグ時に時々みますが。
アセンブラで使っている本は、工学社の「80386プログラミング」
です、良い本だと思いますがあまりみかけません。

お力をお借りさせて頂く時もあるかもしれませんが、宜しく
お願いいたします。

NEW  [2000/05/10 Wed 19:59:37]  [210.251.66.227]

>iretで戻っちゃダメなんですー。
>もともとの処理をまるごと書き換えるだけならiretですけど。

ああ、やっと意味が分かった、自分の処理に最初に飛ばして、
本来のint 1chに戻るって事ですね。

うーんまずは、自分のオリジナル処理内で何にもしないで
戻ってみてはどうですか?
自分の処理の中でOSのシステムコール呼んでいるとか。

後はいやらしい症状として、再入しているって事はないですかねぇ。
intは普通、cli状態で呼ばれるんだっけか?

再現性あります?
スタック大量に使っているとか?

もうint 1chとか言われても覚えていないンですが(^^;
大昔の経験だと、割り込みコントローラってものがあって(^^;
そいつの割り込みマスクを制御しなきゃとか、色々あったもんですが...。


どん  [2000/05/10 Wed 19:10:58]  [210.196.94.34]

澤口@一升金さん、どうもありがとうございました。これからいってみます。これからも、アセンブラで困った時には、立ち寄らせていただきますので宜しく御願いいたします。


相模隆明  [2000/05/10 Wed 16:59:09]  [150.15.16.31]

to ぴょん太さん

私が思いつく事としては

・レジスタの内容が保存されていますか
・スタックの関係は保たれていますか
・intで呼び出されたルーチンの中でintを使用していませんか
・保存してある本来のベクタの順序はオフセット−セグメント
 の順序になっていますか

これくらいですね。
ぴょン太  [2000/05/10 Wed 13:05:44]  [210.159.27.184]

to 澤口@一升金さん
またなぜそんなHNに…(謎)
どうもありがとうございます。
MASM6のソースをわざわざMASM5に直さなくて済みました^^

to NEWさん
iretで戻っちゃダメなんですー。
もともとの処理をまるごと書き換えるだけならiretですけど。

to cocoalaさん
なんか、フラグはいじらなくていいみたいなんです。
割り込み禁止をかけないとダメかなとは思ったんですけど、
それでもないみたいだし。
cocoala  [2000/05/10 Wed 12:22:27]  [210.235.232.4]

intで割り込まれたら、pushfでFARjmpてのはダメですか?
澤口@一升金  [2000/05/10 Wed 11:03:45]  [211.0.69.33]

澤口@一升金です。

to ぴょん太さん:

ML(Tech Asm)からの再掲です。時間が経っているので、バージョン
とか今では少し変わっているかもしれない。

以下引用
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
標準的にはマイクロソフト社が配布しているデバドラ開発用の
ツールを使います。

http://www.microsoft.com/ddk/download/98/BINS_DDK.EXE
(2.9 MBytes)
http://www.microsoft.com/ddk/download/98/98SETUP.EXE
(1.9 MBytes)
の2つをダウンロードして解凍します。
ml.exe
ml.err
link.exe
がアセンブラプログラムに必要なツールです。
ml.exe は 現在 MASM 6.11d 相当ですが、これは MMX や 3DNow!
に対応していないので、パッチを入れます。

ftp://ftp.microsoft.com/softlib/mslfiles/ML612.EXE
ftp://ftp.microsoft.com/softlib/mslfiles/ML613.EXE
ftp://ftp.microsoft.com/softlib/mslfiles/ML614.EXE

です。
また、link.exe は 32bit リンカですので、リアルモードプログラ
ム(16bit プログラム)を作るときは

ftp://ftp.microsoft.com/softlib/mslfiles/lnk563.exe

が必要です。

澤口@一升金  [2000/05/10 Wed 10:51:27]  [211.0.69.33]

澤口@大崎 あらため澤口@一升金です。

to どんさん:

アセンブラマニュアルってアセンブラソフトのマニュアルですか?
なら、ソフトメーカーがわからないと誰も答えられないでしょう。

本家本元の Z80 アセンブラとマニュアルがダウンロードできる。

http://www.zilog.com/support/sd.html

Z80 ニーモニックなどの解説ページ

http://www.geocities.com/SiliconValley/Peaks/3938/z80_home.htm

ツールが少し。

http://margo.student.utwente.nl/el/micros/xx80/

MSX のページ。非公開ニーモニックの解説がある。

http://www.msxnet.org/tech/

NEW  [2000/05/10 Wed 09:32:28]  [210.251.66.227]

>そこでint 1chをいじるンですけど、ベクタの書き換えをして
>自分の処理を割りこませて、使うレジスタの保存と復帰、
>戻るときはレジスタ復帰、far jampで本来の処理に戻る。
>というステップなのですが、確実に止まってくれます。

あー最近ベクタフックするプログラムなんか書いてないんで
忘れたけど、intで呼ばれたら、iretで戻るんじゃないっけ?

ぴょン太  [2000/05/10 Wed 00:48:06]  [210.139.252.165]
大麻

授業でやったンですが、インターバルタイマが上手くいきません。
55ms毎でカウントして…ってことをやってます。
そこでint 1chをいじるンですけど、ベクタの書き換えをして
自分の処理を割りこませて、使うレジスタの保存と復帰、
戻るときはレジスタ復帰、far jampで本来の処理に戻る。
というステップなのですが、確実に止まってくれます。

何か足りない処理とか、見落としやすい注意点ってありますか?
他の割り込み番号だと割り込みルーチンは動くのに…。
どん  [2000/05/09 Tue 18:28:19]  [210.196.94.34]

初めまして、どんともうします。GOOで検索してココにだとりつきました。現在Z80のアセンブラマニュアルやアセンブラの説明が書かれているページ、もしくはPDFファイルを探しています。初心者でもわかりやすい物が欲しいのです。みなさまのお力をお貸し願えませんでしょうか。宜しく御願いいたします。


oh  [2000/05/09 Tue 02:36:16]  [202.219.231.203]

>Disk1〜Disk4の中に入っているファイルを全てどこかのディレクトリにコピーしてからInstall.exeを実行すればいいと思います。
出来ました。ありがとうございます。
だけではいけないので自分が実行したインストール方法を書いておきます。

http://community.borland.com/article/images/21751/tcpp101.zip
からTurboC++1.01をダウンロード。
C:\tcに展開。
ディレクトリC:\tc\allを作りC:\tc\Disk? (?は1から4)の中身全部をコピーする。
cdでC:\tc\allに移動してusモードになりinstallと打ってエンターを。
インストール画面が出てくるので進むインストールするディレクトリは
C:\PROGRA~1\BORLAND\TCにしました。
インストールを実行。
これでインストール出来るはずです。
Nishimura  [2000/05/09 Tue 00:05:47]  [210.175.221.71]

ohさんへ

Disk1〜Disk4の中に入っているファイルを全てどこかのディレクトリにコピーしてからInstall.exeを実行すればいいと思います。

oh  [2000/05/07 Sun 22:54:57]  [202.219.232.81]

>Disk1〜Disk4にはいっているファイルを4枚のフロッピーに振り分け
>てフロッピーディスクからUSモードでInstallを実行すると良いと思います。
なるほど。
さっそくやってみました。
しかしDisk2を入れてコピーしている時に
File C:\TC\BIN\UNZIP.ZIP HELP....(ここから覚えていない) not found とでて終了してしまいます。
インストール先のディレクトリが悪いのかと思い変えてみましたが同じでした。
DOS窓からがダメかと思ってMSDOSモードでもやりましたが結果は同じ。
でもディレクトリ構成がわかったのでとりあえず使えるようになりました。(^^;;;;
ヘルプファイルなどがインストール出来てないんですけどね。
*.CA1、*.CA2などはどうやって展開するのだろうか・・・?

TurboC++1.01はここからダウンロード出来ます。
http://community.borland.com/article/0,1410,21751,00.html
jackal  [2000/05/07 Sun 19:06:04]  [210.248.187.17]

ohさんへ

Disk1〜Disk4にはいっているファイルを4枚のフロッピーに振り分け
てフロッピーディスクからUSモードでInstallを実行すると良いと思
います。
oh  [2000/05/07 Sun 03:03:13]  [202.219.232.65]

場違いだと思いますが失礼します。
http://community.borland.com/article/0,1410,21751,00.html
からTurbo C++1.01をダウンロードしてインストールしようと思ったのですが出来ません。
具体的には、Disk1に入っているINSTALL.EXEを実行しても何も起こらないのです。
INSTALL.EXEを実行したのはWindowsのDOS窓からです。
環境はWindows 98です。
Windowsにはインストール出来ないのでしょうか?
とおりすがり  [2000/05/06 Sat 23:54:00]  [210.234.15.55]

http://nav.webring.org/hub?ring=x86asm;list

なんか見てみるとアセンブラで Win32 やってる人結構いるみたいですよ。
実際のところは SDK の関数をアセンブラから呼び出してるだけ
って感じですけど。

Ichi  [2000/05/06 Sat 05:55:21]  [210.237.205.254]

to ぴょん太さん
>アセンブラは組めてもWindowsアプリケーションを組めないのは、
>重症でしょうか…?それと、同じ境遇の方っています?
私もいまのところ同じようなものです。
98でアセンブリ言語バリバリのプログラムは組めても、
Windowsだと、ちょっと...な状態です。
最近は専らコンソールアプリを作ってます。

# おとなしくMFCを使えばずいぶん楽なんですけどね。
ぴょン太  [2000/05/06 Sat 00:36:05]  [210.139.252.165]
http://ns.to/asm/

to celsさん

どうもありがとうございます。
私はこのページさえもたどりつけなかった。クッ…。
-----
どうしましょ。DDKダウンロードしに行って、
Win32プログラムが組めないことになんだか負い目を感じてしまった。
ずっと通信環境の無いPC-9801(486世代)の上、
MASMと逆アセンブラとバイナリエディタのみで独学してきた私には、
Windowsアプリケーションは遥か彼方なのれす。遠いです。

アセンブラは組めてもWindowsアプリケーションを組めないのは、
重症でしょうか…?それと、同じ境遇の方っています?
cels  [2000/05/05 Fri 23:41:44]  [210.149.134.226]

to ぴょン太さん

MASM単体はちょっとわからないのですが、
DDKを落とせば入っています。

http://www.microsoft.com/hwdev/ddk/ddk98.htm

ぴょン太  [2000/05/05 Fri 02:09:04]  [210.139.252.163]
無題

ずっと昔から覗かせてもらってます〜。どうも。
「お久しぶりです」と言っても誰も覚えてないか。
書きこんだ当時は違うHNだったし。

澤口@大崎さん、お願いがあります。
メーリングリストで発言された、MASM6.?(MLですね)の場所を
もう一度書いてもらえませんでしょうか。
あるいは誰か知ってる方、お願いします。
「確か発言されてるはずだ」と思い、BBSの過去ログを見ても見つからず。
発言されたのがメーリングリストだったことを思い出しました。
マイクロソフトのダウンロードセンター行っても、
私の技術不足でMASMに当てるパッチしか出てきません(泣)

実はHDDが全部消えちゃいまして…。
皆さん寝ぼけたままFDISKを扱うのはやめましょうね(w

どうかよろしくお願いします。
cels  [2000/05/04 Thu 00:33:31]  [203.180.145.204]

to ずとしさん
>パーシャルレジスタストール
レジスタの一部に書き込んだ後でレジスタ全体を読みこむと起こる
遅延のことをそういいます。
読み込んだときに最低7クロック止まります。

>やっぱりサポートしてないっていうことなんでしょうけど。
>未サポートなんでしょうか、それとも、呼ばれちゃまずいんでしょうか。
>アセンブラでそんなことするなってことですかの。
インラインアセンブラではタイトな一部のコードだけを書くことしか
考えていないのでしょう。
メンバ関数を呼ぶにはなんらかの追加機能が必要なので。

to yutaroさん
1.mov eax,a
2.mov eax,offset a
とするとaを変数として
1: eax = a
2: eax = &a
が近いでしょう。
シンボルを変数として見られる、という設計のようです。
個人的にはなんとなく馴染めないので
いつも[a]とか書いてしまいますが。

to Kakef31さん
>BCC32でやっても、メンバ関数のアドレスは直接取得できませんね。
BCCでもだめですか。
やっぱりアセンブラからC++を呼ぶことまで考えてないんでしょうね。

>#この当時はインラインアセンブラで'include'とか'segment'とかも使ってました。
いいですね、それくらいできると。
VCでも#includeなら使えますが(笑)

ずとし  [2000/05/03 Wed 22:38:48]  [210.238.165.55]

毎度。

>セグメントの先頭からのオフセット値なので、

あーそういうことだったんですね。納得。

@ジャンプテーブルの件
いろいろ教えていただきまして。
とりあえず、Cで配列を作って、ジャンプは'jmp jmp_table0[eax*4]'でいってみます。
インラインでつけたラベルのアドレス値は、C側で記述できるだろうと高をくくって。

あと、少し気になったのは、
>  mov  al,data8
>  mov  r16,ax
>等をするとパーシャルレジスタストールが起きて、

ここいらに書いてある「等」っていうのは、
「オペランドサイズの違うメモリー絡みの命令を
 同じレジスターに対して続けて使う等」
って感じだと予想して読んだのですが、間違って、ない、ですか。
それと、なんとかストールとかいうやつらは、速度以外にも障害を与えますか。
かなりわかりませんでした。すいません。はやく本買わなくちゃぁいかんですな。
'xor eax,eax'とかは心がけて使ってるので、大丈夫かも。

@メンバ関数呼び出し
>命令列はわかるのですが、肝心のメンバ関数アドレスがとれないのです。
>即値アドレスは当然使えませんし、

コンパイラがコードをはけるということは、
アドレス算出用のクラス情報をコンパイラは知ってるわけで、
その情報がアセンブラの部分では使えない。
やっぱりサポートしてないっていうことなんでしょうけど。
未サポートなんでしょうか、それとも、呼ばれちゃまずいんでしょうか。
アセンブラでそんなことするなってことですかの。
yutaro  [2000/05/03 Wed 19:05:00]  [172.143.190.128]

>Kakef31さんへ

1.mov eax, a
  mov eax, [eax]

2.mov eax, offset a
3.lea eax, a

チェックしてみたら1番はC言語っぽく書くと
eax=*a
2と3番は
eax=&a
だと思うんですけど..そうですよね

yutaro  [2000/05/03 Wed 17:16:45]  [172.138.215.131]

>Kakef31さんへ

これはきまりなんですね。

>void (Foo::*f)(int) = &Foo::bar;

こんな書き方できたんですね。
とても勉強になりました。

>お返事を下さった方々へ

ありがとうございました。
今、MASM32とDirectXで3DのGAMEを
作りたいなと思っています。
(ちょっと前までVisual C++で作ってた)
Drawと3Dの初期化を終えて、これからゲームの中身を作ります。
また、謎にであったらここへきたいと思います。
それでは....
Kakef31  [2000/05/03 Wed 16:14:43]  [210.253.98.205]

>yutaroさん
>1.mov eax, [a]
>2.mov eax, a
>  mov eax, [eax]
aがメモリ上の変数である場合、
  mov  eax, a    と
  mov  eax,[a]   は、
全く等価です。
2.の形式で、望む結果を得るには、
  mov  eax, offset a  か
  lea  eax, a      を
用います。

>celsさん
BCC32でやっても、メンバ関数のアドレスは直接取得できませんね。
メモリ変数のアドレスの前に'BYTE PTR'がついちゃいます。
仮想関数テーブルが3DWORD使っているのが原因のようですね。
leaでアドレスを得てからcall memするしか方法が...
TCC1.01とかの頃は違った気がするので、例外処理とかの関係でしょうか?
#この当時はインラインアセンブラで'include'とか'segment'とかも使ってました。
#TASMを呼び出していたので。
cels  [2000/05/03 Wed 08:21:24]  [203.180.144.19]

>'db'とか'dw'とか'd?'とかでデータ定義ってできるんですか。
インラインアセンブラでは使えません。
代わりに_emitという擬似命令があるのですが、
8ビットしか置けなくてかなり使えませんね。
関数テーブルをCで作るか、
MASMとかの普通のアセンブラを使ったほうがいいかもしれません。

>[edx + eax*SIZE myType]っていう書式があるそうですが、
>この場合eaxは符号有りなのか、無しなのか。
SIZEは1,2,4,8のいずれかです。
eaxの符号はよく考えればわかると思います。
アドレススペースは32bitしかありませんので。

>変数に代入してるところをトレースしてコードをパクッてきて、
>#define Call_m_func(func_name,class) __asm ????? __asm ????? _asm ????
>とかで書式をでっち上げる。可能でしょうか。
命令列はわかるのですが、肝心のメンバ関数アドレスがとれないのです。
即値アドレスは当然使えませんし、
シンボル名は?とか@が入っていてインラインではエラーになります。

Kakef31  [2000/05/03 Wed 03:03:10]  [210.253.98.142]

初めまして。時々のぞかせてもらっています。
アセンブラはDOS(98)の時代にかじったまま
WINは全然理解できてない者です。
32ビットコードは、スーパーアスキーの
386 de MS-DOSで勉強しました。今はああいう記事、少ないですね。

>ずとしさん
> offset
> 前につければ、プログラムアドレスを返してくれる、
> で、あってますか。

だいたいあってると思いますよ。
セグメントの先頭からのオフセット値なので、
offset DGROUP:address
が必要なときもあります(フラットモデルでは不要)
また、アドレスの差を求めるときは、sub命令を使わずとも、
  mov ebx,(offset func01) - (offset func00)
で大丈夫だと思います。(括弧は不要かな?)


>アドレステーブルの作り方がわかりません。
アセンブラの場合
JUMP_TABLE  label dword
  dd  func00,func01,func02,func03,
  dd  func04,…,funcFF
等を作り、
  movzx    eax,this.DMGopecode ;[edx]?
  call/jmp  JUMP_TABLE[eax*4]  ;*1,*2,*4,*8のいずれか
;  ここで、分岐予測が必ず外れるため、ペナルティが大きい
で大丈夫です。

C言語ならば、僕の場合
typedef void vfn_t(void); //これで少し見やすくなる
static void func00(void)
{  /* NOP */ }

vfn_t *TABLE[] = {
  func00,func01,
  …,funcFF, };
としておいて、

void callcode(int code)
{  TABLE[code]();  }
でコールします。
コンパイラの出力も、上記アセンブラの方法と
ほとんど変わらない(レジスタをかませる程度)
ものになると思います。
vfn_t型に引数のある型を使っても大丈夫です。


あと、少し気になったのは、
> 8ビットレジスタ上位下位ともに使いまくり。
ですが、P6コア(PenII,PenIII等)の場合、
  mov  al,data8
  mov  r16,ax
等をするとパーシャルレジスタストールが起きて、
パイプラインが止まります。このペナルティは不定で、
大抵、分岐予測が外れたときよりも大きいと思います。
古いコンパイラ(TurboC 2.0等)は、平気で
  mov  al,data8
  mov  ah,0
  ret
等の関数を作りますね。回避するには、movzxを使うか、
  xor/sub ax,ax
  mov   al,data8
とするのが良いです。(P6を前提にするなら、movzxが良い)
  mov  ax,0
  mov  al,data8
では駄目です。いずれaxレジスタを読み出したときに、ストールします。
reg8→reg32やreg16→reg32でも同様です。


いきなり長くなって、すみませんでした。
ずとし  [2000/05/02 Tue 23:38:47]  [210.147.66.97]

毎度どうも。おはこんばんちは。

>add eax,offset jmp_table0
>でいけるはずです。

'offset'の使い方に自信が無かったので。
前につければ、プログラムアドレスを返してくれる、
で、あってますか。
知ってるオフセットって言葉のイメージと
なんだか違うのでよくわかりませんでした。

>jmp命令のテーブル作るのはあまり効率的とは思えません。
>アドレステーブルを作って jmp [eax] のほうがよいのでは。
>なにか理由があるのでしょうか。

ええ、実は。
アドレステーブルの作り方がわかりません。
まずはインラインアセンブラでラベルのプログラムアドレスを
データ定義する書式がわかりません。
'db'とか'dw'とか'd?'とかでデータ定義ってできるんですか。
以上の物は試したところできなかったようですが。
それとも、
static void* jmp_table0[256] = {
code0, //nop
code1,
:
:
};
とかでいけるんでしょうか。
こっちは、試す前に例のやつで動いてしまったので試してないです。

で、'jmp メモリー'の、このメモリーってゆうオペランドのことでまたちょっと。
'jmp'に限らずですが、インデックスの指定はどこまでいけるんでしょうか。
[edx + eax*SIZE myType]っていう書式があるそうですが、
この場合eaxは符号有りなのか、無しなのか。
掛け算される配列のサイズとかの定数は何ビットで符号の有無は。
とか、ですね、いろいろよくわからないことがあって。
まぁ、今回も、情報お待ちしてますってことで。毎度、すんません。

>命令の出現頻度はエミュレーションできるようになってから
>統計を取るのが楽かも、と思いますがどうでしょう。

やー、面白そうですな。ぜひやりましょう。
どうせならデバッガーの驚きの新機能にしちゃいましょう。命令出現頻度統計。
出力されたデータをもとにEXE内のコードがカスタマイズできるとか。
夢が広がりますねぃ。へへへ。

>>メンバ関数の呼び方
>いったん変数で受けるあたりがダサいですが、一応呼べます。
>MASMなら直接呼べますが、手動で名前マングリングしないと
>いけませんね。
>このコンパイラの制約を回避する方法はあるのだろうか。

変数に代入してるところをトレースしてコードをパクッてきて、
#define Call_m_func(func_name,class) __asm ????? __asm ????? _asm ????
とかで書式をでっち上げる。可能でしょうか。

だいたいに、自分でやればいい話なのですが、
いまのところ仕事場にしか環境が無いもんで。
頼ってばっかですいません。いつも長くてすいません。
yutaro  [2000/05/02 Tue 23:16:15]  [64.236.63.243]

申し訳ありません。
ひとつ前の質問を訂正します。

a DWORD ?

1.mov eax, [a]

2.mov eax, a
  mov eax, [eax]

  でお願いします。
yutaro  [2000/05/02 Tue 22:20:40]  [64.236.81.114]

ここで質問するのも2回目になります。
MASMをつい最近はじめました。

さっそくご相談ですが、
1番と2番はどうして結果が違うのか教えてください。

1.mov eax, [変数]

2.mov eax, [レジスタ]

Ichi  [2000/05/02 Tue 07:16:09]  [210.237.206.9]

>GBのプログラムは画面表示のレジスターを、
>描画中にもいじって演出したりするので、
>頻繁に照合しないと画面の再現が望む物までいかないのです。
なるほど。失礼しました。
一ライン描画されるごとにパレットを変えて
擬似的に色数を増やす、と言うのと同じですね。

質問があります。
DPMIを使って、仮想86モードのタスクを作ろうと思うのですが、
なかなかどうしたら良いのか分かりませんので、
次の理解が正いかどうか教えていただけないでしょうか。
1.TSSのディスクリプタはGDTに置かなければならない。
2.DPMIを使ってではGDTを変更できない。
3. 2より新しいタスクを自分で作ることは出来ない。
4. 3より、自分自身を変更して仮想86モードのタスクにすれば良い。

3辺りが間違っているような気がするのですが...
もし間違ってたら、新しいタスクを作る方法も教えてください。
よろしくお願いします。
cels  [2000/05/02 Tue 03:24:05]  [203.180.144.206]

to ずとしさん

>lea ebx,jmp_table0
>add eax,ebx
うざいというここですが、
add eax,offset jmp_table0
でいけるはずです。

jmp命令のテーブル作るのはあまり効率的とは思えません。
アドレステーブルを作って jmp [eax] のほうがよいのでは。
なにか理由があるのでしょうか。

命令の出現頻度はエミュレーションできるようになってから
統計を取るのが楽かも、と思いますがどうでしょう。

>メンバ関数の呼び方
ちょっと考えてみました。
Fooってクラスがあって、メンバbarを呼びたいとします。

Foo t;
void (Foo::*f)(int) = &Foo::bar;
_asm {
 lea  ecx,t
 push 5
 call f
}

いったん変数で受けるあたりがダサいですが、一応呼べます。
MASMなら直接呼べますが、手動で名前マングリングしないと
いけませんね。
このコンパイラの制約を回避する方法はあるのだろうか。

ずとし  [2000/05/01 Mon 23:22:02]  [210.147.66.101]

>(http://www7.freeweb.ne.jp/computer/ichi98/opinion/t0002.html)

ややや、ありがとうございます。わざわざ実験していただいたとは。
なんともありがたいことです。
で、ですね。
CPU1命令なんて関数にするほどコード無いんで、ベタで書いてます。
8ビットの貧乏性でCALLが怖いんですよ。
最近のやつはスタックがやたら速いとかも聞いたことあるんですがね。
つまりは、__asm{
lea eax,for_get_code_size0
lea ebx,for_get_code_size1
sub eax,ebx ;ジャンプ命令一個のサイズを教えてもらいます
mul [edx]this.DMGopecode ;ゲームボーイのCPUオペコード
lea ebx,jmp_table0
add eax,ebx
jmp eax
;
end_of_operation:
jmp cpu_loop ;命令実行完了しました
;
code0: ;nop
jmp end_of_oeration
code1:
code2:
;
jmp_table0:
jmp code0 ;nop
jmp code1
for_get_code_size1:
jmp code2
for_get_code_size2:
;
} //end of __asm
って感じで書いたと思います。思い出して書いてるので正確じゃないです。
いやー遠慮の無い'jmp'しまくり具合がとってもデンジャラスですねぃ。
ジャンプ先の計算で'lea'がウザイのですが、ラベルのプログラム番地を
直でオペランドにもってきたらなんだかバグッたのでこうしてあります。
なにか情報があればありがたいです。

>出現頻度の高い命令「だけ」個別にチェックして、そのあと
>ジャンプテーブル等の速い方法で分岐すれば良いと思います。

命令の出現頻度なんて。
あ、'daa'はあんまり使わないですね。'ld a,a'とかもたぶんいらないですね。
出現頻度低いのを見つけても、なんにもならないですねぇ。
ひとまず仕上げ段階までほっぽっときます。

>どこまで描画された(はず)かのカウンタを作って、
>実行が中断したらそこまで描画する、というはどうですか?

「実行が中断した」がどの状態のことだかわかりませんが、
カウンターを作ってやってはおります。
GBのプログラムは画面表示のレジスターを、
描画中にもいじって演出したりするので、
頻繁に照合しないと画面の再現が望む物までいかないのです。
カウンターはCPU処理、画面処理の切り替えの最適化の道具ということで。

ふう、いらんアセンブリとか埋めて長くなりました。
こういう書き込みはだめでしょうか。
ずとし  [2000/05/01 Mon 23:21:55]  [210.147.66.101]

NELSさんへ。
GBアセンブラなら、うーんと、
「DMG」とかで検索かければいけるんじゃないでしょうか。たぶん。
たしか、フリーのアセンブラ、あったはずです。海外にも、たしか。
あのぅ、GB、詳しいですよ。
マルヒなことでなかったらいろいろ。聞かれりゃお答えすると、思います。
で、そういう質問がこのBBSで容認されれば、ですが。
NELS  [2000/05/01 Mon 11:38:23]  [210.232.69.58]

はじめまして
実は、GameBoyでアセンブラで
組みたいのですが
参考になるページなどございませんでしょうか
コンパイラとリンカはあるのですが
DL先ではC言語で組んでいたもので
アセンブラでの組み方がわかりませんでした。
どなたかご存じでしたらお教えくださいませ。



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