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

 
Tips
 

  2004 年はちょっとおとなしい (^^;


 
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/0412/31/04
 




たつや  [2004/12/13 Mon 15:46:34]  [211.2.180.194]

申し訳ありません、訂正です。

bcc32 main.c -c ==>> bcc32 -c main.c
たつや  [2004/12/12 Sun 20:28:19]  [211.2.180.194]

はじめまして、たつやといいます。
さっそくですが、尋ねたいことがあります。

BCC5.5 + NASM + alink = NativeModeDOS.exe をしたいのですが、うまくいかないようです。
このことについて、詳しく教えていただけたらと思います。


ソースについては以下の様です。

;--start.nas---------------------------;

extern _putc
extern _main

;エントリーポイント
..start:
push dword 'S'
call _putc
add esp,04h

call _main

mov ax, 4c00h
int 21h


;--putc.nas----------------------------;

;void __cdecl putc ( __int32 c);
global _putc

_putc:
push edx

mov dl,[esp+2+4]
mov ah,02h
int 21h

pop edx
xor eax,eax ;一応 return 0;
ret


/*--main.c----------------------------*/

extern void __cdecl putc ( __int32 c);

void main ( void)
{
/*呼び出すと失敗...(むしろエラー)
putc('S');
*/
}


nasmw start.nas -f obj
nasmw putc.nas -fobj
bcc32 main.c -c
alink start.obj putc.obj main.obj -oEXE -o test
げる  [2004/12/06 Mon 17:50:13]  [218.228.243.163]

始めまして。げるといいます。アセンブリ言語でWINDOWSAPIを呼ぶにはどうしたらいいんですか。MessageBoxAは呼べたのですが、GetModuleHandleなどが呼べません。(MessageBoxだけ呼べました。)CALLの前に何を入れたらいいのでしょうか。
piyo  [2004/11/28 Sun 00:12:22]  [60.41.59.201]

はじめまして、piyoといいます。
唐突ですが、下記内容のプログラムを書きたいのですが
わかりません。足し算、引き算はわかるのですが
掛け算、割り算がわかりません。
どなたかお力をかしていただけないでしょうか?
宜しくお願い申しあげます。

=次の台形の面積を計算し、答えを表示せよ。 
=
= 上底8下底10高さ7
=                    
=      
= START
= LD GR1,A
= ADDA GR1,B
= ST GR1,C
=
= A=10 B=8 C=7
Xeno  [2004/11/22 Mon 12:54:24]  [220.110.19.138]

DOS上でMOUSE.COM等を使わないで直接マウスをコントロールするには
どうすればいいのでしょうか?
現在のところさっぱりやり方がわかりません。

よろしくお願いします。
九龍  [2004/11/15 Mon 17:02:15]  [219.163.188.106]

>>こんがり様へ

 N = 5、M = 5 と仮定した場合のサンプルソースを書いてみました。(ようするに 縦 5 横 5)
 CX レジスタを CH = 変数 I、CL = 変数 J として使用しています。
 一応見直しましたが、ポカしてたら見逃して下さい(最近 C ++ ばっかり使用してるので^^;)。
 でもアセンブラの最低限の知識があれば、伝えたい事はご理解頂けると思います。

mov bx,(B 配列のセグメントを入れてね)
mov ds,bx
mov ax,(B 配列のオフセットを入れてね)
mov si,ax
mov bx,(A 配列のセグメントを入れてね)
mov es,bx
mov ax,(A 配列のオフセットを入れてね)
mov di,ax

xor ch,ch

S_LP1:
cmp ch,05h ; N = 5 なので 5 回ループ
jz E_LP1 ; ch が 5 ならばループ終了

xor cl,cl

S_LP2:
cmp cl,05h ; M = 5 なので 5 回ループ
jz E_LP2 ; cl が 5 ならばネストループを終了

mov ax,05h ; I のアドレス計算(1 行は 0 〜 4 の 5 要素)
mov bl,ch
mul bl
push ax ; I のアドレスはまた後で使用するので待避
mov bx,ax

mov ax,04h ; [M - J] のアドレス計算(最初のループで 5 - 0 = 5 となり、配列番号をオーバーする為 4 にしてあります。もし上記の通りで OK ならば 05h にして下さい)
push cx
xor ch,ch
sub ax,cx
pop cx

add bx,ax ; これで BX は [I][M - J] のアドレスとなる
mov ax,[si + bx] ; AX に B [I][M - J] の内容が入る(DS:SI に B 配列の先頭アドレスが入っています)
mov dx,ax

pop bx ; 待避されていた物を元に戻す
mov al,cl ; [J] のアドレス計算
xor ah,ah
add bx,ax ; これで BX は [I][J] のアドレスとなる

add [di + bx],dx ; A [I][J] += B [I][M - J](ES:DI に B 配列の先頭アドレスが入っています)

inc cl
jmp S_LP2

E_LP2:
inc ch
jmp S_LP1

E_LP1:
NOP

以上です。



名無しの権兵街  [2004/11/14 Sun 06:04:36]  [220.147.172.252]

>>こんがりさん
えっと、、、もしアセンブリで書いてみたなら、それ見せてもらえるとなにかアドバイスできるかも^^;
こんがり  [2004/11/12 Fri 19:19:02]  [160.11.70.201]

こんにちは。初めてここにきました。宜しくお願いします★
さっそくですが、質問があります。
for(I=0;I<N;I++)
for(J=0;J<M;J++)
A[I][J] += B[I][M-J]
end
end
をアセンブラに書きなおさなくてはいけないのですが、2重ループや
2次元配列をどうやって書いたらいいかわかりません。
誰かわかる方教えて下さい。
名無しの権兵街  [2004/11/03 Wed 18:17:09]  [222.159.244.182]

>>あっきさん
OSっすか、、、僕も作りたいっすね〜^^vでもまだ資料集めの段階、、、^^;

>>けんぼぉさん
「はじめて読むPentium マシン語入門編」ちょっと興味あったけど、近くの本屋には置いてないみたいです、、、
リンク先見たかんじでは、Pentiumっていうよりアセンブリの入門書って感じですね

>>岸本健治さん
こちらこそ、よろしくです^^v

ところで、皆さんが使ってるアセンブラはなんですか??
僕はNASM使ってます
岸本健治  [2004/09/25 Sat 13:11:32]  [219.22.132.24]
初めまして

初めまして。アセンブラに興味があってここにやってきました。
皆さんよろしく。
news-  [2004/08/10 Tue 23:27:20]  [66.98.226.51]

<a href=>news </a>
link-  [2004/08/10 Tue 23:27:18]  [66.98.226.51]

<a href=> link</a>
けんぼぉ  [2004/07/09 Fri 10:26:47]  [220.210.99.153]

ども、けんぼぉです。

既にご存じかと思いますが、「はじめて読むPentium マシン語入門編」
がアスキーから7/16に発売されます。

書名 はじめて読むPentium マシン語入門編
著者等 蒲地輝尚 水越康博 著
シリーズ はじめて読むシリーズ
発売日 2004/07/16
形態 A5 (256ページ)
定価 2,940円 (税込)
ISBN 4-7561-4466-7

http://www.ascii.co.jp/books/detail/4-7561/4-7561-4466-7.html
名無しの権兵街  [2004/07/08 Thu 20:21:17]  [220.147.176.132]

>>澤口@一升金
レス遅れてすいません、、、
どうやら確認方法でチョンボしてたみたいです。データをprintf関数で確認してたんですが、『0x00』で文字列終わりって判断されてたみたいです^^;素直にint 0x10で確認したらちゃんと読み込めてました^^;

助言ありがとです。
あっき  [2004/07/08 Thu 02:25:33]  [61.124.52.171]

申し訳ありません、解決しました。
18セクタを超えたときの計算で、セクタ0を指定するようになってました。
ヘッダとかシリンダとかは0ベースなのにセクタだけ1ベースなんですね。。。

お騒がせしました。
あっき  [2004/07/07 Wed 23:35:27]  [61.124.52.171]

はじめまして。OSを作っているのですが、ブートローダが上手く動作しません。

ブートローダでセクタ21〜2をint13hを利用して1セクタずつ読み込んでいるのですが、18セクタ目からエラーになってしまいます。しかし、18セクタ目から読み始めるようにするとセクタ18〜2は正常に読むことができます。
トラックが移るときになにか処理が必要なのでしょうか?

あと、int13hってヘッダとシリンダがありますが、19番目のセクタってどう指定するんでしょうか。今はシリンダ=0、ヘッダ=1、セクタ位置=1としています。

以上です。よろしくお願いします。
澤口@一升金  [2004/07/01 Thu 23:21:12]  [60.34.106.235]

澤口@一升金です。

to 名無しの権兵衛さん:

int 13h の Read Sector は 1 バイトずつではなく、
セクタ単位でしか読み込めませんから、0x00 を読んだ
ところで止めるような動作はそもそもできません。
読み込みデータの確認方法に問題はないですか。



名無しの権兵街  [2004/06/25 Fri 02:39:51]  [220.147.174.217]

まじめまして。さっそく質問なのですが、BIOSコールINT 0x13を使ってフロッピーからデータを読み取ろうとしたのですが、途中まで読み込んだところで止まってしまいます。
いろいろ調べてみると、どうやらフロッピーから『0x00』というデータを読み込んだところでそのあとにまだデータがあっても読み込みを止めてしまっているみたいです。
止まらないで最後まで読み込む方法はあるのでしょうか??(それとも、僕のPCだけでおきるのかなぁ、、、、
cels  [2004/05/22 Sat 22:45:08]  [218.230.104.36]

フロッピーのセクタ5はFATによって使われています。
ハードディスクと異なり、通常フロッピーディスクには
先頭セクタの後に未使用のセクタはありません。

Sector 5 of a floppy disk is used by FAT12.
Different from a hard disk, a floppy disk doesn't have
any unreserved sector after the first sector.

bug  [2004/05/17 Mon 19:19:52]  [217.10.246.156]

Hi to you, i hope that you or some of the programmers here can help me or just to share if he has or have the same problem like mine.
So, it's about something that i though will be an easy thing that obviously is not like that that's why i'm here...
Trying to boot the original MBR of Win98 or Dos or any other ofter loading my program was not successful.My program is doing this:
Copy the original MBR to sector 5(not used i have the check with DE).
Copy itself to sector 1(replacing the original MBR)
After boot:
-Load itself somewhere(empty) in the RAM and continue execution from there
-Then Load the Original MBR(WIN 98/DOS/etc.) to 0000:7c00 and retf to the last instruction saved on the stack(es:bx)-->0000:7c00
* I don't know why but there is some kind of mistake mine or i don't know... I have looked at many many other boot managers and there were an exelent examples of doing this but it's not working again!!!!!
* Something that i should mention about is that i'm doing this over floppy disk but i dont think that there is some big difference between FD and Hard Disk.
* The result is that BIOS boot from the Diskett but.After this it wait and if you press key it load again my MBR and againg and so on...
-----------------------
So if someone can help with advice or to tell me why this stupid MBR(Win98) don't want to run correctly.???PLEASE i'll be very GRATEFULL to HIM or HER!
Thanks
Michael

クリ  [2004/04/11 Sun 01:15:52]  [220.21.100.131]

澤口@一升金さん、どうもありがとう御座います。

説明不足でした。
ちょっとしたアルゴリズムをデバッガでレクチャーしようと思ったの
でした。
なので、標準、付属が望ましく質問させていただきました。
澤口@一升金  [2004/04/10 Sat 11:46:49]  [211.120.99.10]

澤口@一升金です。

to クリさん:

MS社の Debugging Tool はここにあります。

http://www.microsoft.com/whdc/ddk/debugging/default.mspx

コンソールモードのデバッグをするなら、 Borland社の Turbodebugger
が使いやすいんじゃなかろうかと思います。

http://www.borland.co.jp/cppbuilder/freecompiler/turbodebugger.html

あるいはここにもツールがあります。

http://www.jorgon.freeserve.co.uk/

Cygwin と gcc の組み合わせで開発していれば GDB Debugger が
使えますし、Visual Studio や C++Builder,CodeWarrior などの
商用開発ツールにはそれぞれデバッグツールが付属します。

クリ  [2004/04/05 Mon 09:11:19]  [220.21.100.131]

こんにちは。
よそで質問したのですが、レス貰えなかったのでこちらでのポストと
なりますがお許しください。

WIN2000 Proの付属デバッガなんですが、16bit版のdebug.exe以外は
無いのでしょうか? 以前32bitコンソール版が立ち上がった事があり、
使いたいのですがファイル名思い出せず探し出せません。
(windowsフォルダ以下見ても、それらしきファイル見つからず)

御存知の方おられましたらお教えください。
BlueRose  [2004/04/01 Thu 17:53:49]  [219.0.248.32]

しろさん、レスありがとうございました。

今は、Windows-XPで開発しています。
ご指摘の環境変数のComSpecを確認してみたところ、以前の作業の都合で、command.comを登録してそのままになっていました。
これを、cmd.exeに直したら、あっさり解決しました。
とてもうかつでしたが、こんなことで、Visual Studioって大丈夫なのでしょうか?

おかげさまで、アセンブルできるようになり、作業を完了することができました。
どうも、ありがとうございました。

しろ  [2004/03/27 Sat 16:07:13]  [220.96.35.178]

BlueRoseさん、こんにちは

> プログラムが大きすぎてメモリに入りません.

お使いのOSは9X/NT系列のどちらですか?
私は今現在NT系列のOSを使っていないのでそちらはよくわからないのですが、
VisualStudioはカスタムビルドは.batファイルを介してコマンドを実行する
ようなので

9X系列なら
・.PIF ファイルのプロパティ(C:\WINDOWS\SYSTEM\CONAGENT.PIF ?)
・環境変数 COMSPEC の設定

NT系列なら
・環境変数 ComSpec の設定
・.BAT 拡張子の関連付け
・CONFIG.NT の内容

あたりを見直すことになると思います。
BlueRose  [2004/03/26 Fri 21:34:24]  [219.0.248.19]

はじめまして。
ふだんは、VC++でプログラムしている者です。
C++で作ったプログラムからアセンブラルーチンを呼ぶプログラムを作ることになりました。
それで、
C:\Program Files\Microsoft Visual Studio\VC98\Bin
に、ML.EXEとML.ERRを入れて、Visual Studioのプロジェクトー>設定−>カスタムビルド で、MLを起動するように設定してみました。
ところが、「プログラムが大きすぎてメモリに入りません.」という、エラーメッセージがでてしまい、アセンブルできません。
環境変数の設定(Pathとか)を短めにしたりしてみたのですが、解決できません。

どなたか、同じような経験がある方がいらしたら、解決方法を教えていただけないでしょうか?
とても困っています。
よろしくお願いします。

VC++のバージョンは6.0
MLのバージョンは、6.11d
です。
カスタムビルドで、
Xeno  [2004/03/09 Tue 19:23:27]  [220.110.19.138]

カトさんありがどうございます。

チェインテーブル...つまりクラスタ0より前にテーブルがあるのかな?

FAT32 Specificationでチェインテーブルの説明らしきところを発見しました。
このページは下記のような計算式があり
Nに何の値が入るか解らなかったので読み飛ばしていました。
なんとか読んでみます!! 

If(FATType == FAT16)
FATOffset = N * 2;
Else if (FATType == FAT32)
FATOffset = N * 4;


// この目的の「FATエントリ2」にたどり着くまでには、ディレクトリエントリ
// からマッチするディレクトリの名前を得て、その先頭のクラスタ番号を得る
// 必要があります (先頭クラスタ番号 == 先頭のFATエントリ番号となる) が、
// そちらの方は大丈夫でしょうか

先頭クラスタとはディレクトリエントリ構造体のDIR_FstClusHI、DIR_FstClusLOのことでしょうか?

一応、現状ではルートディレクトリリストを読み込んで
リスト内のフォルダをクリックすればそのフォルダリストを読み込む
とういう芋づるまでは出来ております。
チェインが解らないので1Cluster分のリストしか表示されませんが...(^^;;;

頑張ってみます。

16ビットと32ビット  [2004/03/09 Tue 19:18:13]  [202.32.215.62]


力卜  [2004/03/08 Mon 21:23:56]  [192.51.44.43]

NASM on Win2kさん、Xenoさん、こんばんは。

NASM on Win2kさん:

以前から、Windows2000でDOSアプリの標準出力が画面にうまく出力されない
ことを確認しています。Windows2000の問題かと思います。(当方 W2kPro SP4)
そのような状況になるとコマンドラインから「command /c echo ABC」と
しても「ABC」と出ないのではないでしょうか。「command /c echo ABC | more」
なら画面に表示されると思います。
この現象は、当方ではコマンドプロンプトを複数開くと起きやすいようです。
この現象が起きたら、私は画面を制御しているDOSアプリ(filmtnやmiel)を
実行して、直しています。

Xenoさん:

サブディレクトリにしてもファイルにしても、先頭クラスタからの
続きのクラスタ番号は“FAT”(ファイルアロケーションテーブル)を
参照すればわかると思います。“FAT”は先頭セクタ(IPL)の次の
セクタから存在しています。例示されたものの場合、“FAT”の各エントリ
は以下のようになっているのではないでしょうか。

FATエントリ2: 継続クラスタ番号 == 5 (→ 続きはFATエントリ5を参照)
FATエントリ3: クラスタチェーン終了マーク
FATエントリ4: 継続クラスタ番号 == 6 (→ 続きはFATエントリ6を参照)
FATエントリ5: クラスタチェーン終了マーク
FATエントリ6: クラスタチェーン終了マーク

クラスタチェーン終了マーク:
12bit FAT: 0x0FFF (0x0FF8〜0x0FFEの可能性もあり)
16bit FAT: 0xFFFF (0xFFF8〜0xFFFEの可能性もあり)
32bit FAT: 0x0FFFFFFFL (0x0FFFFFF8L〜0x0FFFFFFELの可能性もあり)

この目的の「FATエントリ2」にたどり着くまでには、ディレクトリエントリ
からマッチするディレクトリの名前を得て、その先頭のクラスタ番号を得る
必要があります (先頭クラスタ番号 == 先頭のFATエントリ番号となる) が、
そちらの方は大丈夫でしょうか。

以上です。

Xeno  [2004/03/02 Tue 12:58:04]  [221.188.83.48]

MicrosoftのFAT32 Sepecificationをなんとか読んで
FATエディタを作ってFAT解析に励んでおります。

フォルダ内のファイルリストがすべて取得できなくて
困っております。 次のような感じの場合、どうやって続きの場所(クラスタ)
を見つけ出せばいいのでしょうか?(あくまでも例です)

Cluster 2: フォルダ情報の先頭
Cluster 3: FILE0001.BINのデータ
Cluster 4: FILE0002.BINのデータ1
Cluster 5: フォルダ情報の続き
Cluster 6: FILE0002.BINのデータ2

よろしくお願いします。
NASM on Win2k  [2004/02/25 Wed 16:31:57]  [211.1.195.236]

アセンブラ初心者です。

毎日コミュニケーションズ社の「いまどきのアセンブラプログラミング」を読んで、
Windows 2000 Professionalで244頁に掲載されているプログラムのソースを
アセンブルし実行すると画面に何も文字が出力されず、
コマンドプロンプト上のカーソル位置がおかしなことになってしまいます。

以下がそのソースです。

;-------------------------;
; 1.Hello World
;-------------------------;
org 100H

mov ah,09H
mov dx,HELLO
int 21H
mov ah,4CH
int 21H

HELLO db 'Hello, World!',0Dh,0Ah,'$'
;-------------------------;

ヘルプ画面は正しく表示されアセンブルも成功したのですが、
どういうわけかCOMファイルを実行した時だけ動作がおかしくなります。
ちなみにWindows 98とWindows XP Professionalでも同じソースをアセンブルして
COMファイルを実行したのですが、特に問題なく動作しました。

NASMはWindows 2000だと正しく動作しないのでしょうか?
是非とも教えて下さい。宜しくお願い致します。
匿名  [2004/02/21 Sat 18:34:59]  [220.96.32.103]

誰が書いても同じようになると思うが
; dehl = de * hl(符号無し)
; af,bcは保存されない
ld c,l ; ld bc,hl
ld b,h ;
ld hl,0
ld a,16
_1:
add hl,hl ; dehl *= 2
rl e ;
rl d ;
jr nc,_2

add hl,bc
jr nc,_2
inc de
_2:
dec a
jr nz,_1
ret

# Z80のニモニックもステート数もすでにほぼ忘却
bp  [2004/02/19 Thu 20:06:21]  [61.124.38.3]

しかも、説明が1カ所間違ってるよ(泣
返値は、DEの方が上位16ビットですね。

bp  [2004/02/19 Thu 20:03:07]  [61.124.38.3]

うわ。リロードのタイミング間違えてしまいました。
大変失礼しました>all

bp  [2004/02/19 Thu 20:02:18]  [61.124.38.3]

>だいかす氏

できましたか。それは何よりです。
私も適当にサンプルを書いてみました。
ワーク4バイト込で、98バイトにもなってしまいました。
以下、ソースです。
vvvvvvvvvvvvvvvvvvvv
MUL16:
PUSH HL
PUSH BC
LD C, D
CALL MUL8
LD (PROD+2), HL
POP BC
PUSH BC
LD B, E
CALL MUL8
LD (PROD), HL
POP BC
PUSH BC
LD B, D
CALL MUL8
CALL ADD3B
POP BC
LD C, E
CALL MUL8
CALL ADD3B
LD BC, (PROD)
LD DE, (PROD+2)
POP HL
RET

MUL8:
PUSH BC
EXX
POP DE
XOR A
LD H, A
LD L, A
LD A, E
OR A
JR Z, ENDMUL
LD A, D
LD H, D
OR A
JR Z, ENDMUL
LPMUL:
SRL A
JR NC, SKPADD
ADD HL, DE
OR A
JR Z, ENDMUL
SLA E
RL D
JR LPMUL
ENDMUL:
PUSH HL
EXX
POP HL
RET

ADD3B:
PUSH HL
POP BC
LD HL, PROD+1
LD A, (HL)
ADD A, C
LD (HL), A
INC HL
LD A, (HL)
ADC A, B
LD (HL), A
RET NC
INC HL
INC (HL)
RET
PROD:
DW 0, 0
^^^^^^^^^^^^^^^^^^^
BCに被乗数、DEに乗数をロードしてMUL16を呼ぶと、
BCに上位16ビット、DEに下位16ビットを返します。
破壊するレジスタは、AF, BC, DE, DE', HL'と
台風のようなコードですが、それでも重くて
ゲームなんざにゃ使い物になりませんね^^;
速度が要求されるようであれば、積を求めるより
テーブル参照の方が良い場合もあります。

 とりあえず、これより効率の良いコードを書ける人に
お願いです。後学の為にも、是非ソース提示キボンヌ(笑

bp  [2004/02/19 Thu 20:02:10]  [61.124.38.3]

>だいかす氏

できましたか。それは何よりです。
私も適当にサンプルを書いてみました。
ワーク4バイト込で、98バイトにもなってしまいました。
以下、ソースです。
vvvvvvvvvvvvvvvvvvvv
MUL16:
PUSH HL
PUSH BC
LD C, D
CALL MUL8
LD (PROD+2), HL
POP BC
PUSH BC
LD B, E
CALL MUL8
LD (PROD), HL
POP BC
PUSH BC
LD B, D
CALL MUL8
CALL ADD3B
POP BC
LD C, E
CALL MUL8
CALL ADD3B
LD BC, (PROD)
LD DE, (PROD+2)
POP HL
RET

MUL8:
PUSH BC
EXX
POP DE
XOR A
LD H, A
LD L, A
LD A, E
OR A
JR Z, ENDMUL
LD A, D
LD H, D
OR A
JR Z, ENDMUL
LPMUL:
SRL A
JR NC, SKPADD
ADD HL, DE
OR A
JR Z, ENDMUL
SLA E
RL D
JR LPMUL
ENDMUL:
PUSH HL
EXX
POP HL
RET

ADD3B:
PUSH HL
POP BC
LD HL, PROD+1
LD A, (HL)
ADD A, C
LD (HL), A
INC HL
LD A, (HL)
ADC A, B
LD (HL), A
RET NC
INC HL
INC (HL)
RET
PROD:
DW 0, 0
^^^^^^^^^^^^^^^^^^^
BCに被乗数、DEに乗数をロードしてMUL16を呼ぶと、
BCに上位16ビット、DEに下位16ビットを返します。
破壊するレジスタは、AF, BC, DE, DE', HL'と
台風のようなコードですが、それでも重くて
ゲームなんざにゃ使い物になりませんね^^;
速度が要求されるようであれば、積を求めるより
テーブル参照の方が良い場合もあります。

 とりあえず、これより効率の良いコードを書ける人に
お願いです。後学の為にも、是非ソース提示キボンヌ(笑

だいかす  [2004/02/19 Thu 17:03:35]  [61.196.20.173]

>bpさん

初心者の僕にも非常に分かり易い説明、どうもありがとうございます。プログラムの方は完成することができたのですが(なんとも効率の悪いものになってはしまいましたが)、こういう(bpさんのような)考え方もあるんだなぁと感心するばかりです。本当にありがとうございました。
bp  [2004/02/17 Tue 09:22:36]  [61.124.38.3]

誰も反応していないようなので・・・。

>だいかす氏

16bit*16bitの計算ですか?Z80で?
ええと、Z80で、任意乗数の乗算は非常に荷が重い処理です。
32bitの処置を考える前に、次の点について検討してみて下さい。

・本当にそんな大きな数を扱う必要がありますか?
・積を2^nで割った値では、使用目的を満たせませんか?
・乗数か被乗数のどちらかが、定数になりませんか?
・乗数か被乗数のどちらかが、「とびとびの値」になりませんか?
・乗数か被乗数のどちらかが、(0〜255より狭い)特定範囲の値に
 なりませんか?

 ルーチン作成のためには、次のように考えて見て下さい。
1.8bit*8bit(=最大16bit)のルーチンは書けます(ました)か?
2.レジスタhlとbcの値を掛け合わせるとします。
H = h * 256, B = b * 256 とおくと、
hl * bc
= (H+l)(B+c)
= HB + Hc + lB + lc
= hb * 65536 + (hc + lb) * 256 + lc
と変形できます。

3.各8bit*8bitの値の範囲は、0 〜 0fe01hなので、
 H=0 or B=0 ならば HB = 0
 H≠0 and B≠0 ならば 00010000h <= HB <= 0fe010000h
 これと、2の同値変形の結果を参考に、ルーチンを書きます。

てなわけで、どうしても計算しなければならないようであれば、
がんばってみて下さい。

ななし  [2004/02/15 Sun 01:38:46]  [210.233.20.9]

諸事情により当分レスできませんが、宜しくお願いします。

word×8列×8行の行列をinvert(行と列を入れ替える)したいの
ですが、どこかにSSEを使った簡潔なサンプルのソースコードは
あるでしょうか。
ちなみにさしてスマートではないinvertは既に書きました。

行列をメモリから読み出すmovの回数と、書き出すmovの回数が等
しくなるような(つまり読み書きは常に16バイト単位で終わる
ような)美しいコードが書けるかと思ったのですが、どうしても
読み出しは16バイト、書き出しは8バイト単位でないとコーディ
ングできません。
8バイト単位でのinvertならmmxレジスタだけで行えますし、
私の能力では、emmsが重い以外はSSEに変えるほどのメリットを
見い出せませんでした。
だいかす  [2004/02/08 Sun 06:06:31]  [61.196.16.15]

はじめまして。z80の勉強をしているもの(超初心者)です。

いきなりですが、質問です。16×16ビットの乗算をシフト、ローテイト命令を使って実行したいのですが、32ビットの扱い方がよくわかりません。どのようなプログラムを作れば扱えるでしょうか。どなたか教えて下さい。



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