Message Log 24 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 06/16/0007/20/00
 




Silphire  [2000/07/20 Thu 15:22:42]  [210.253.182.2]

どうも始めましてSilphireと申します。

質問なのですが、NASMでは、
分割アセンブルをしてCOMファイルを作ることはできないのでしょうか?
どうもマニュアルを読むだけだと、そのようなことはできないようにおもえます。
どなたかご教授下さい。

力卜  [2000/07/20 Thu 13:55:10]  [192.51.44.15]

cojicojiさん。力卜です。

>また、どうも書き込みがうまくいかないと思っていたら
>セクタは0ではなく1からだとやっと知りました。
MS-DOSでの論理セクタ番号は、基数が0ですから間違いやすい
のかも知れません。FDの物理セクタ番号は、普通は1からです。
MS-DOSの論理セクタと物理セクタの対応は、1.44 2HDでは、
論理セクタ 0 ==> 物理track:0, side:0, sector: 1
:
論理セクタ17 ==> 物理track:0, side:0, sector:18
論理セクタ18 ==> 物理track:0, side:1, sector: 1
:
論理セクタ35 ==> 物理track:0, side:1, sector:18
論理セクタ36 ==> 物理track:1, side:0, sector: 1
:
論理セクタ2879 ==> 物理track:79, side:1, sector:18
のようになっています。まとめると、
論理セクタ番号=(track*2+side)*最大セクタ番号+sector - 1
です。(ただしdouble sidedの場合。1S, 1DDとかはまた別)

>1セクタの容量をどうやって知るのかわからなかったのですが、
PC/AT互換機だと、ほとんどの場合、1セクタ=512バイトと決め
つけてよいと思います。
実際にやるのなら、「512で試し読み⇒失敗なら、1024バイトで
試し読み⇒失敗なら、…」のようにリトライをすれば実現できそう
な気がします。1セクタの容量の問題以外にも、2DDなのか2HDなのか
の判定も同様にすればできそうな気がします。
(いずれも私は試したことないですが)

>これはもうint13hを逆アセンブルして
>動作を知るしかないと思うのですが、
>セクタ単位ではなくもっと細かく読み書きができるわけですね。
int 13hとその内部が扱うのも、やはりセクタデータのみと考えて
いいと思います(FORMATのときはちょっと特殊なことしますが)。
もしint 13hを解析するのなら、DMAや、FDC(intel 8727 or
NEC μPD765A/745/7265)の知識が必要になりそうです。
昔、PC-8801シリーズやPC-9801シリーズを使っていたヘビーな
人に聞くといろいろ教えてもらえるかも知れません。
(私はFDCとしてはFUJITSUのMB8877系、かつDMAでないプログラム
転送による方式しか知りません。FM-7ユーザーなので(^_^;))

>ギャップはセクタを区切るだけのものと理解していました。
念のため。2D/2DDの例にあげたもので「ギャップ」と書いたもの
以外はギャップではありません。ギャップは多少ずれて上書きされて
も大丈夫な領域です。ギャップ以外は、不意に上書きされたり、
読めなくなったりすると、FDに正常にアクセスできなくなる可能性
があります。

cojicoji  [2000/07/20 Thu 00:49:05]  [202.211.170.82]

cojicojiです。
カトさん詳細な説明ありがとうございます。
フロッピーって両面にかけるんですね。知らなかったです。
また、どうも書き込みがうまくいかないと思っていたら
セクタは0ではなく1からだとやっと知りました。

1セクタの容量をどうやって知るのかわからなかったのですが、
やっぱりそういった情報が含まれており、
BIOSを介してアクセスすると隠蔽されている部分が
あるということですね。
これはもうint13hを逆アセンブルして
動作を知るしかないと思うのですが、
セクタ単位ではなくもっと細かく読み書きができるわけですね。
ギャップ部にいろんな情報がある事を知り勉強になりました。
情報処理試験を受けたとき
ギャップはセクタを区切るだけのものと理解していました。

アンネさん
書き込み遅くなりました。
bochsダウンロードしました。ちょっと動かし方がわからなくて
まだ、快適な環境を得られていません。
virtual discはつくってみたのですが
どう実行したらよいかわかっていない状態です。
今、テスト中でパソコンをあまり触らないので、
おわってからじっくり試したいと思います。

というわけで、いまだにフロッピーからコードを読み込み
そこへジャンプするというレベルまでしか達成できていません。
MINIX本を読んでi-nodeとかの意味を知る事ができたので
中途半端なunix-FSとかができればいいなぁなんて思ってますが、
果たして僕にできるのかなぁ…
力卜  [2000/07/18 Tue 12:35:25]  [192.51.44.19]

cojicojiさん。

フロッピーのトラック上にあるデータは、
(セクタ長+セクタ間ギャップ長)*セクタ数
で求められる長さよりも、もうちょっと複雑になっています。
3.5" or 5" の 2D / 2DDの例ですが、次のように
Data(セクタデータ)とGap3(セクタ間のギャップ)のまわりには
もっといろいろな情報がくっついています。
--------------------------------
preamble=Gap1 (4Eh*32),
{
Sync (00h*12),
IDAM (A1h, A1h, A1h, FEh),
IDaddress (Cyl, Hed, Rec, leN),
CRC (high-byte, low-byte),
Gap2 (4Eh*22),
Sync (00h*12),
DAM (A1h, A1h, A1h, F8h(DDM)/FBh(DM)),
Data (??h*セクタ長),
CRC (high-byte, low-byte),
Gap3 (4Eh*n3)
} * セクタの数,
postamble=Gap4 (4Eh*n4)
--------------------------------

…しかし、cojicojiさんがやろうとしている通常のセクタ単位の
読み書きでは、セクタデータ以外の存在はほとんど気にする必要は
ありません。

必要なのは、フロッピーの種類ごとのシリンダ(トラック)数、
ヘッド(サイド)数、レコード(セクタ)数、レコード(セクタ)長と、
扱えるシリンダ(トラック)番号、
ヘッド(サイド)番号、レコード(セクタ)番号の範囲です。

3"FD 2HD 1.44MBでは、トラック数が80 (0〜79)、サイド数が2
(0〜1)、セクタ数が18 (1〜18)、セクタ長は512となっています。
(()内は扱える範囲)
これらをすべてデータあるいはプログラムとして使うと、
80 * 2 * 18 * 512 = 1,474,560バイト扱えることがわかると
思います。

"A Description of the DOS File System"
(http://www.alumni.caltech.edu/~pje/dosfiles.html)
の 7. Reserved Sectors の終わりの方に、米国での一般的な
フロッピーの種類とトラック数、セクタ数、セクタ長などの一覧表
が載っています。
# 先頭の方には、ブートセクタのBPB (明にBPBとは書いてないけど)
# の表も載っています。

"Linux-Kernel Archive: FAT filesystem" の 1996/10/03 #0129
(http://www.uwsg.indiana.edu/hypermail/linux/kernel/9610.3/0129.html)
には、前述のURLの BPBの説明にない比較的新しい領域(Signature,
IDなど)についても載っています。

日本語の資料としては、
"長いファイル名の基礎講座"
(http://www.vector.co.jp/soft/data/prog/se044198.html)
"DISKに関する資料"
(http://www.vector.co.jp/soft/data/hardware/se016321.html)
なども参考になると思います。
(後者は PC-98固有罫線を使ってあるのかな?)

個人的には、MS-DOSなどに頼らない簡単なDOSみたいものを作る
ときにも、FATによるファイルが扱えるようになっていると
便利かなと思います。
そのような場合も上のページが参考になると思います。

KAS  [2000/07/17 Mon 22:48:24]  [195.67.79.70]

Daisukeさん、ありがとうございます。

アセンブルできました。
ただし、実行ファイル(.EXE)を逆アセしたら開始コードが
200hから始まっていました。
なんででしょう?

これからSAMPLEファイルを見つけて、いろいろと
勉強してみます。

Daisuke  [2000/07/17 Mon 00:41:51]  [210.255.5.39]

to KASさん

NASMでCOMファイル(FLAT BINARY)ができるのは
デフォルトですのでオプションの指定が必要です。
下記のようにすればOMFフォーマットのOBJファイルが作成
されます。(-f オプション)

c:\nasm>nasm -fOBJ filename.asm

EXEファイルはリンカが無いと作成できませんので別途必要です。
link.exe / tlink.exe / alink.exe / lld.exe など

EXEファイルはOBJファイルから作成します。

c:\bin>alink -oEXE filename.obj

NASMのサンプルファイルはNASMのソースアーカイブや
ALINK・NASM−IDEのアーカイブ内に付属してますので
参考にしてみてください。

ALINK・NASM−IDE等はNASMのホームページの
リンクより入手可能です。

NASMホームページ:

http://www.cryogen.com/Nasm
KAS  [2000/07/16 Sun 18:10:59]  [195.67.79.70]

最近NASM(DOS版)をダウンロードしてアセンブルしてるのですけど、
実行ファイルがCOMファイルとしてできてしまいます。
NASMで、EXEファイルを作成するにはどうするのでしょうか?

それと、NASMで書かれた小さいSAMPLEプログラム(DOS版)を探し
ています。

どうかよろしくお願いします。

cojicoji  [2000/07/15 Sat 15:27:01]  [202.211.170.67]

下の訂正です。ごめんなさい。
×1440000/998≒148
○1440000/9702≒148


cojicoji  [2000/07/15 Sat 15:24:09]  [202.211.170.67]

フロッピーの構造についての自己レスです。
割り込みベクタ1Eh(0000:0078h)に
フロッピーのパラメータテーブルのアドレス
があることがわかりました。
そのアドレスからオフセット04h,05hに
トラック当たりのセクタ数、セクタ間のギャップ長が
格納されているそうです。
ちなみに調べてみると、
2HD1.44の今使っているフロッピーは
トラック当たりのセクタ数:12h(18)
セクタ間のギャップ長:1Bh(27)(単位はバイト?)
でした。
これらから、
1トラックの容量:(512+27)*18=9702バイト
トラックの数:1440000/998≒148
をもとめました。
結果、シリンダ番号は8bitで指定でき
だいたい148までと解釈しました。
あってますよね?
アンネ  [2000/07/15 Sat 05:12:31]  [210.234.14.139]

> cojicoji さん
> ラベルに対してoffsetをつけていたのが
> 間違いであったとわかりました。

NASMではoffsetはつけないですが、MASMでは必要です。
間違いではありません。
#あそこのページのコードはNASM用でしたね。。。(--;;

あとリブートを繰り返すのは大変なのでPCのエミュレータを
使ってみてはどうですか。
http://www.bochs.com/

Windows用のバイナリはこちら。
ftp://ftp.v.nu/Bochs/
cojicoji  [2000/07/15 Sat 03:38:10]  [202.211.170.100]

アンネさんから教えていただいたページを見て
ラベルに対してoffsetをつけていたのが
間違いであったとわかりました。

あぁ、jmpのときはoffsetをつけていなかったのに、
なぜmovの時だけoffsetをつけていたのだろうか?
答えは、そういうもんだと思っていたからです。
ゴ〜ン…

cojicoji  [2000/07/15 Sat 03:07:44]  [202.211.170.100]

連続かきこみの、cojicojiです。

今回は
フロッピーディスクの構造について質問です。
int 13hを呼ぶとき、
10bit(0-1023)のシリンダ番号と
6bit(0-63)のセクタ番号と
4bit(0-15)のヘッド番号を渡しますが、
この内フロッピーに関しては、
ヘッド番号は0のみだと思います。
そうすると1セクタに512バイトだから
1024*64*512=33554432≒33Mバイトになります。
これは1.44Mバイトに反するので
シリンダ番号に制限があるのかな?と思い、
1.44*1000000/(64*512)=43.9453125
と計算し43シリンダという結果がでました。

しかし、
http://www.linux.or.jp/JF/JFdocs/hdd-intro.html
ここをみるとシリンダあたりのセクタの数にばらつきがある
ハードディスクもあるとのことです。
フロッピーディスクでは
64セクタ固定と考えていいのでしょうか?
また、フロッピーではセクタ番号は
6bitも使わずシリンダ番号は43よりも多いのでしょうか?
よくわからないです。どなたか教えてください。


あと、上のページで
>「すべてのセクターに通し番号を付け、
>その番号によってセクター位置を指定する」方法は
> "LBA" と呼ばれており、
>すべての SCSI ディスクコントローラ、
>および 504MB 以上の大容量ディスクに対応した
>IDE コントローラの多くはこの方法によって
>ディスクにアクセスすることができます。
とあり
int 13h,ah=42h(extended read)
int 13h,ah=43h(extended write)
が紹介されていたので
http://www.ctyme.com/intr/rb-0696.htm
をみてみました。
AH = 42h
DL = drive number
DS:SI -> disk address packet
とあったのですが、セクタ番号を指定する部分がありません。
ためしに使ってみたらCflagは0でエラーにはならないでしたが
どこから読んできたのか分かりません。
このあたりも教えてください。

だらだらとごめんなさい。よろしくお願いします。

cojicoji  [2000/07/15 Sat 03:02:24]  [202.211.170.100]

>アンネさん

>おっしゃってることがイマイチよく理解できませんが、(汗
アセンブラ始めたばかりなので
変なことやっているかもしれません。

;test.asm
ASSUME CS:CODE,DS:CODE
CODE SEGMENT
ORG 100h
いろいろ…
mov ax,offset HELLOMSG
call print_str ;axの指すメモリの文を出力
いろいろ…
HELLOMSG:
DB 'Hello',00h

というプログラムを書いたとき、
ml test.asm
exe2bin test test.com
debug test.com
-w 100 0 0 1
再起動
こうするとうまくプリントされなかったので、
プログラムのORG 100hをORG 7c00hに変えたとたん
うまくプリントされるようになりました。
バイナリをみると
offset HELLOMSGの解釈が
両プログラムで変わっていました。
このとき、ORG 7c00hに変えると
exe2bin test test.com
でファイルを変換できなくなりました。
そこでtest.exeをバイナリエディタで開き、
どのあたりにプログラムが書かれているか探してみると、
ORG 7c00hに対して7e00hから始まっている事がわかりました。
そこで7e00hまでファイルをカットしたわけです。
(前の書き込みでは7c00と書いてました。まちがいですね)

うまい方法があるとは思いますが、
今は独学で試行錯誤がんばっていますので
思わず変な事をやっていると思います。

ちなみにプログラムの始まりのアドレスを探すときも
mov ax,ip
ができなかったので、
call AAA
AAA:
pop ax
とかやってました。


>フロッピーからブートさせる手順は↑のページが参考になるとおもいます。
あぁ、やりたい事がかいてありそうだぁ〜。英語がんばろう。
またまた、情報ありがとうございます。

それでは。


アンネ  [2000/07/15 Sat 01:03:49]  [210.234.14.139]
http://www.phys.uu.nl/~mjanssen/

> cojicoji さん

おっしゃってることがイマイチよく理解できませんが、(汗
フロッピーからブートさせる手順は↑のページが参考になるとおもいます。

私はNASM使ってるんでMASMのことはわかりませんが、
.COMファイルは(たしか)素のバイナリなので、.COMにすればrawrite.exeで
そのまま書き込めるはずです。

cojicoji  [2000/07/14 Fri 23:02:01]  [202.211.170.91]

cojicojiです。

>アンネさん
どこにいったか分からなくなったlinuxのCD見つけたので
rawrite.exeつかってみました。
ファイルをまるごと入れてくれるようなので、
ファイルの先頭部分を切るツールを作り、
それと組み合わせて使っています。

今までは、毎回フォーマット処理してたので、
(debug.exeはフォーマットしたdiscじゃないと受け付けてくれない)
時間短縮でストレスが減り、助かります。
情報ありがとうございます。


ファイルの先頭部分を切っている話ですが、
biosがメモリの7c00hに読み込んでくれる事をようやく知り、
うまくいかないで困っていた
メモリ上に配置した文字列を表示するルーチンが
ORG 7c00hを始めに書く事により
ようやくうまく動きました。
そこでアセンブル後のexeファイルの先頭7c00hまで
切る事になったためです。
このあたりMASMのオプションで指示できると思いますが…

そこで、MASMで知っているといい感じのオプションって
いくつかあると思うのですが、何かあります?


歩野零一  [2000/07/13 Thu 00:48:22]  [210.230.134.190]

いつもお世話になっています。
不明なオペコードについて、お聞きしたいと思います。

インテルのデベロッパー用HPでFast_IDT_ap528.htmのがありますが、
この処理のうちで次のような命令が出てきます。

movdf dword ptr [esi+8*12], mm1

このmovdfをPII、PIIIのインストラクションで探してみましたが、
載っていないようです。
マクロのような気もしますが、ご存知の方はいらっしゃいますか?

閑話休題:
MMXでDCTを書いたら、スパース行列分解アルゴリズムを使うより
力技で計算したほうが早い気がしますが、気のせいでしょうか。
64、32ビットローテート命令があれば、バタフライ演算もステップ
数を食わないのに…。

ずとし  [2000/07/12 Wed 00:00:42]  [210.255.32.221]

おはこんばんちは。また質問にきました。

えーと、MASMと、VCを使って、C++のクラスメンバ関数を、
MASM側で作成するには、どうするといいのでしょうか。

やってみようと思ってるのは、
クラス定義からメンバ関数を消した構造体をMASMで定義して、
それを使って、thisポインタを第一引数に持つ関数を定義してリンク、
ってやつです。
これだと、クラスのメンバ関数としてリンクさせる方法と、
クラスのメンバ変数だけ取り去って、同様に扱える構造体としていいのか、
が不明です。

やっぱり不可能だ、とか、もっといい方法がある、とか、
レス期待してます。

それではまた。
アンネ  [2000/07/11 Tue 23:43:54]  [210.234.14.158]

> cojicoji さん
> 私が今やっている方法は、アセンブラで生成したtest.com
> をdebug test.comで読み込み-w 100 0 0 1と打ち込み
> test.comのアドレス100から1セクタ分、フロッピー(0)
> の0セクタに
> 書き込むといった方法です。

rawrite.exe 使うってのはどうです?
LinuxのインスールCDに入ってるやつです。

rawrite -f test.com -d a
ってかんじで。

ぴょン太  [2000/07/11 Tue 23:37:57]  [210.139.252.164]
http://obey-me.virtualave.net/

どうもぴょン太です。

こないだ質問してからずっとMSDOS用のTSRを組んでいるのですが、
常駐させて終了するah=31h/int 21hを実行する際に
dxにパラグラフ単位で常駐するサイズを指定しなければなりませんね?
そこで今は、CODEとDATAを全部常駐させてしまう方法を取ってますが、
他に、めんどうだけど常駐時に使う部分は全部CODEの先頭部分に詰めてしまって、
常駐時に使う部分だけをパラグラフ単位に直して指定する方法、しか知りません。

他にももっと有効(実用的)な手段がおありでしたら教えてください。
アポトーシス  [2000/07/11 Tue 16:10:17]  [210.139.214.150]

to 澤口@一升金さん

素数のことありがとうございました。
やはり、ふるいにかけるのが一番なんですね。
エラストテネスの方法で頑張ってみることにします。
cojicoji  [2000/07/11 Tue 02:36:30]  [202.211.170.119]

>MS-DOS のディスクのブートセクタには BPB(BIOS Parameter >Block)を書き込んでおく必要があります。

レスありがとうございます。BPBという言葉ははじめて知りました。ちょっと勉強してみます。
この掲示板を見初めて知らない言葉をよく見かけるのでためになります。

やっと画面の出力ができるようになりました。
まだ数値を文字に変換するルーチンを書いてないですが
去年勉強したCASLの本から引用しようと思っています。

私が今やっている方法は、アセンブラで生成したtest.com
をdebug test.comで読み込み-w 100 0 0 1と打ち込み
test.comのアドレス100から1セクタ分、フロッピー(0)
の0セクタに
書き込むといった方法です。
間違ってハードディスク(1)に書き込みそうで心配です。
OSが防いでくれるならいいのですが…
そしてパソコン再起動→フロッピー起動の手順です。
もっと楽なやり方ってないのかなぁ。

ちょっと面倒ですがCのprintfとかに頼らないとこが
いい感じです。(BIOSにたよりっぱなしですが…)

それでは。

AF  [2000/07/11 Tue 00:50:54]  [210.233.160.2]

cojicoji さんこんにちは、

>フォーマットするとセクタ0の初めあたりにMS-DOS5の文字が見えますが、
>もしかして何かの実行プログラムが書き込まれているのでしょうか?
>ディスクのフォーマットっていったいどういうことなのでしょうか?

Microsoft のサイトに行って BPB とか boot Sector と言う
キーワードで検索するとヒントが得られるかもしれません。
MS-DOS のディスクのブートセクタには BPB(BIOS Parameter Block)
を書き込んでおく必要があります。これが無いと未フォーマット
ディスクとして扱われるか、めちゃくちゃなデータが記録された
ディスクとして扱われます。

> あと、私が書いたプログラムが実際に動いていたとして、
> どういった方法でデバッグすべきでしょうか?
> 画面への文字出力とかはまだ難しそうだし…

ブートセクタのデバックはちとむずいです。でも、画面に
1 文字でも出力できればレジスタの値を表示された文字
から推測することもできます。考え様です。ほら、'A' は
41H でしょ!

ではでは、
cojicoji  [2000/07/10 Mon 12:38:44]  [202.211.170.103]

こんにちは
windowsのdebugをつかえば
フロッピーへのセクタ単位の書き込みができたので、
セクタ0にフロッピーをアクセスするint 13hを数回実行する
プログラムを書き込みました。
起動するとint13hを書いた分だけアクセスランプがつくので
面白くなってきたのですが、
デバッグのためにフロッピーに書き込んだデータを
windowsのdebugで読もうとしても
フロッピーをフォーマットし直さないと
読めなくなります。

フォーマットするとセクタ0の初めあたりにMS-DOS5の文字が見えますが、
もしかして何かの実行プログラムが書き込まれているのでしょうか?
ディスクのフォーマットっていったいどういうことなのでしょうか?

あと、私が書いたプログラムが実際に動いていたとして、
どういった方法でデバッグすべきでしょうか?
画面への文字出力とかはまだ難しそうだし…

質問しかしていないので、参考にしている本を書きます。
工学図書
DOS/V・BIOSとC言語
平成7年初版で平成9年で4版なので結構売れている本かもしれません。
澤口@一升金  [2000/07/10 Mon 11:32:48]  [210.190.4.131]

澤口@一升金です。

to アポトーシスさん:

「素数を算出する」というのがいまいちわかりません。
1000桁とか一万桁とか任意の桁数の素数をつくる、という意味でしたら、
確かそんな都合のいいアルゴリズムはなかったと思います。
32bit 以下の素数をすべて求める、とかいう意味でしたら、
除数を 2 から始めて順序に割ってみるだけ、いわゆるエラストテネスの
ふるい法でいいんじゃないかと思うのですが、アセンブラでの整数除算
に何か問題でもあるのでしょうか?

アポトーシス  [2000/07/10 Mon 04:42:38]  [210.139.214.175]

はじめまして。

今、VC6.0のインラインアセンブラのみで素数を算出する
プログラムをコードしたいのですが、どう組上げたらよいのか
よくわかりません。

アセンブラは、はじめたばかりでどう質問したらよいかわからなく
内容が曖昧で申し訳ありませんが何方かお願いします。
小林  [2000/07/10 Mon 01:21:11]  [210.173.77.108]

>本来のアセンブラと異なり、実値がどのように利用されるか
>__emit__ では判断できませんから、仕方がない部分でしょう。
__emit__でもコンパイラが判断してオフセットを1バイトか4バイトに
するものかと思っていたんですけど、それはなさそうなんですね。

では、"オフセットが4バイト"の命令を使っておきます。
ありがとうございました。


>Borland C++ suite がインプライズ社から販売されましたね。
僕のところでいろいろとヘッダファイルを配布しているんですが、
これまではユーザーがC++ BuilderのLearningエディションを使ってたり
C++ Compilerを使っていると、TASMを買わないとアセンブラが使えない
という状況だったんで__emit__を使っていたんですけど、
安いモノでもTASMが付いてくるとなると、だんだん意義が薄れてきそうです。

もちろん喜ぶべきことですけどね。
澤口@一升金  [2000/07/10 Mon 00:15:47]  [210.190.4.131]

澤口@一升金です。

to ルナさん:

とりあえず、チュートリアル集を紹介しておきます。

http://www.geocities.com:0080/SiliconValley/Park/9784/tut.html

PC9801 と異なり、PC/AT クローンの場合は、 Graphics Mode という
概念があって、これを決めないと、ピクセルとアドレスの対応が決まりま
せん。
もちろん、アドレスもビット並びも全く違います。
過去アーカイブにもいろいろなグラフィックス関連サイトが紹介されていま
す。
cojicoji  [2000/07/09 Sun 18:25:19]  [202.211.170.121]

よくわからないですが
MASMでアセンブルしてintが実行できました。
(まだフロッピーの読み書きとかはできてませんが)
ご迷惑おかけしました。

cojicoji  [2000/07/09 Sun 16:04:21]  [202.211.170.121]

はじめまして、難しい内容でしたが興味からログを一気読みしました。
そこで質問です。とんだ勘違いをしてると思いますがお願いします。

フロッピーから起動し簡単な処理を行うといった事をしたいです。
私の考えでは
コンパイラのインラインでアセンブラを書き、
リスティング機能でえられたコードを
フロッピーの初めのセクター?に書き込み、
それで起動する、
という手段を想像しています。
そこで過去ログの方法の
>>フロッピーの先頭にコードを書きこめるのか分かりません。
>DOSでのBIOSの話ですが、アブソリュートライトを使います。
>AT互換機でBIOSでディスクの書き込みは、

>int 13h
>ah=03h
>al=書き込みセクタ数
>bx=書き込みデータのオフセット
>ch=書き込み先頭位置のシリンダ位置
>cl=セクタ位置
>dh=ヘッド位置
>dl=ドライブ番号(ビット7が0の時はフロッピー:1はハードディスク)
>es=書き込みデータのセグメント

>返り値
>ah=ステータス(0=エラー無し)
>al=書き込んだセクタ数
>fl=エラーのときはキャリーが1

を用いたプログラムをまず作り、
自由なセクタに書き込む環境を作りたいです。
ところがwin2000の環境ではプロテクトモード?なのでint 13hを使えないようです。
(コンパイルはできても実行できません)
初めて読む486にリアルモードに移るソースがのってますが
実行してもいいのでしょうか?(パソコンはこわれないかな)

DOSの環境を持っていない場合どうしたらよいでしょうか?
環境はwin2000+vc6です。

澤口@一升金  [2000/07/09 Sun 12:55:25]  [210.190.4.131]

澤口@一升金です。

Borland C++ suite がインプライズ社から販売されましたね。

http://www.inprise.co.jp/bcsuite/index.html

日本語版のコンパイラ、アセンブラ、デバッガ一式で \15,000
ですから、使いでがあるんじゃないかと思います。
PC98 用の Turbo C や Turbo Pascal もパックに含まれてい
ますしね。
きたざわ  [2000/07/09 Sun 04:02:27]  [210.155.203.193]
http://www.egroups.co.jp/group/bccompiler

>小林さんへ

__emit__ は、アセンブラじゃないです。
アセンブラ以前の「バイナリコードの埋め込み」です。
ですから、常に 32bit で評価されるようですね。
本来のアセンブラと異なり、実値がどのように利用されるか
__emit__ では判断できませんから、仕方がない部分でしょう。
__emit__ で組み合わせる命令の方を 32bit 長を使うよう
指示すれば良いですよね?

ルナ  [2000/07/09 Sun 00:26:11]  [210.172.135.38]

ども。NASMを使ってアセンブラを触ってます。
アセンブラの本って、大抵昔のものになって
しまい。PC98環境での説明で、ほとんどがされています。
そもそも、私がアセンブラをやろうと思ったのは、
C/C++で、当たり前のようにやっているディスプレイへの
表示とかは、内部的にはどんなことをやっているのだろうか?
って、興味が出たからです。
それで、ディスプレイへの表示は、特定位置のメモリにデータを
書き込むとそれが、ディスプレイに反映されることまでは
わかりました。
そこで、ビットマップファイルを読みこんで、一つ一つ点を
打っていって絵を表示するというものを作成してみようと思いました。
ですが、私の使っているマシンはAT互換機のため、
本で書いているアドレスへデータを書き込んでもだめのようなんです。
そこで、こういった場合、どうやって、どこに書き出せばいいのか、
とかを調べるのでしょうか?
ハード依存の処理の場合は、その都度環境を調べることになるのでしょうが、その調査というのは、どのように行うのでしょうか?
hikki  [2000/07/06 Thu 13:38:18]  [202.244.183.70]

問題のアドバイスをしていただきありがとうございました、今その課題の手引きを教授が配って解説をしています、どうやらこの問題が出来ない人たちはすくなくないようで(我々を含む)悪戦苦闘しています、まだ時間があるので頑張ってみようと思います。
本当にありがとうございました。
小林  [2000/07/03 Mon 00:06:45]  [210.173.77.168]
http://www.ky.xaxon.ne.jp/~hitoshi/programming/BCCMMX/BCCandMMX.htm

初めまして。小林と申します。

最近、Borland C++ Compiler5.5で__emit__を使って機械語を埋め込んでいるのですが、
分からないことがありまして、悩んでいます。

変数のアドレスを埋め込む際、
int a;
__emit__(&a);
のようにしてアドレスを埋め込むのですが、BCB5(トライアル版)のヘルプによると、
”自動変数または引数変数のアドレスを使うと,BP からの変数のオフセットが
-128 から 127 までの範囲内であれば 1 バイトを占め,範囲外であれば 1 ワードを占める”
とあるのですが、必ず4バイトのオフセットになっているようなのです。
具体的には、0xF8になるべきところでも、0xFFFFFFF8となっているのです。

常に4バイトになるようならそれはそれでいいのですが、たまに1バイトになるような
こともあるのでしょうか?

インプライズ/ボーランドに聞けば?とも思われるでしょうが、Borland C++ Compiler5.5は
テクニカルサポートをしない、という話なので・・。

よろしくお願いします。

#変数の宣言にstaticを付けて静的変数にすれば、オフセットではない普通の(?)アドレスに
#なるようなので、とりあえずそれでやっているのですが。

ずとし  [2000/07/02 Sun 15:38:51]  [210.249.19.202]

ひさしぶりに現れます。

以前相談ネタにしたGBデバッガーは、
ひとまず使えるものができました。
公開はできませんが。
例のジャンプテーブルですが、
VC上では普通のジャンプテーブルは書かせてもらえませんでした。
なので関数ポインタコールテーブルか、
switchでコンパイラにテーブル作ってもらわないかんようです。
VCの最適化には勝てんということで、
結局全部Cに書き換え中だったりします。
__fastcall っていうのが結構効くみたいなので。

Tomohiko Igasakiさんへ。
情報も提供せずにいらん突込みをいれますが、
パチンコROMの解析って、やっていいんですか。
なんだかデンジャラスな気がするですが。
正規の開発か移植でないなら、やめることをお勧めします、一応。
液晶用ROMならあんまし問題ないでしょうけど。
AF  [2000/06/30 Fri 02:25:19]  [210.233.160.2]

> お忙しくなければ、この問題の解説と解き方を教えてもらいたいと思います。

宿題かな (ま、きついことは言わないけど...)
ただし、答えは直に教えない :-)

課題1 は数列の計算と言うよりかは、表示が大変でしょう、

n=16 に限っているので、数列の計算は楽そうです。a16 に必要
なビット数を見積もってみてね... n=100 当たりまでとなるとし
んどいですよ...

出力は strtol 等の関数ソースを参考にアセンブラで
作ってみては...(でも BCD を指定しているところがミソだな)

課題2 は小数をもつ数の計算
計算式が示されているし、このままアセンブラに落とせば良さそう。
小数を扱う場合、桁の維持等には注意が必要かな...

使用している機械が x86 (x87 コプロセッサ命令)だと、
レジスタスタック機構について慣れが必要です。

最近のプロセッサは (RISC と言われている奴を含めて)三角関数
命令が備わっていたりします。

# えっ、三角関数がないプロセッサを使ったマシンで 3D オブジェ
# クトがガンガン動いている(回っている)って、それはどうしている
# か考えてみてください (三角関数、平方根の計算はどの様にしたら、
# 高速なのか、あるいは高精度なのか理解できるようになります。
# 三角関数の計算はテイラー展開だけではない...)

「その機能を確認せよ」... ある意味では C のプログラムとリンク
して表示などは楽できる手段を認めているかも...

課題3 はテキスト処理とソートですね、

地道にテキストパーサーと、ソートする処理を書くかな。yacc, lex
のお世話にならなくてもアセンプラで直に書けます。パーサーは無限
ループに落ちないように気をつけましょう。処理に必要な作業域の
確保(見積もりにも)要注意、ソートは、手っ取り早く実現できそう
なアルゴリズムを選べばいいかな?

# 8人だからそれほど処理時間のオーダーは気にしなく
# てもいいか... でも点数が処理時間の短い順だったら...

# くれぐれも yacc, lex で作ったソースをコンパイラで
# でアセンプラに落として提出しようとは思わないように、
# 多分膨大な出力なので「人か書いた風」に直すのも一苦労

えっ? awk や sort コマンドを起動して処理するプログラムを
書くって...それもまた楽しいでしょう。点がもらえるかな...

ではでは...

歩野零一  [2000/06/29 Thu 23:55:24]  [210.238.175.69]

急ぎならCで組んで、cc -S する手がありますね。
ただし出力されたソースのラベルに手を加えるのを忘れずに。
でないとバレバレです。

#アセンブラがCASLだったらコツコツやるしかないですね。

Cも判らない、言われたら一手間ですけど。
初心者  [2000/06/29 Thu 16:15:23]  [202.244.183.23]

hikkiさんが書いた問題で私は@番は大体わかっています。
A、B番がまだやり始めて余り時がたっていないので、解らないことがあります。
よろしければ、教えてください。
お願いします。

hikki  [2000/06/29 Thu 15:33:14]  [202.244.183.23]

どうも、はじめまして。
分からない問題が出て困っています。
まだ、アセンブリ言語を習い始めたのでわかりません。
よろしければ、教えていただけないでしょうか?

課題1
フィボナッチ数列
an+1=an-1+an、 a0=0、 a1=1、n=1,2,3・・・
の各項を計算するプログラムをアセンブリ言語を用いて作成し、その機能を確認する。
ただし、n=16まで計算するものとする。
(1)2進数の表を作成する。
(2)2進数化10進数(BCD)による表を作成する。

課題2
与えられたx、ただし 0≦x≦π/4 について SIN(x) の近似値を計算するプログラムを作成し、その機能を確認せよ。ただし、計算は第2項まで行うものとして、係数は下記の値を用いる。また、以下の点に注意すること。
                        
SIN(x) ≒ C0x+C1x^3
ただし、 C0=0.99959257
      C1=−0.1615350

なお、このときの最大相対誤差は 4.084×10^−4 であり、
Taylor展開の途中打ち切りに比べて約1行改善されている。

課題3
8人の学生と試験の成績がアスキーコードで下記の順序でメモリに格納されている。

  Bill:69,Bob:65,Frank:54,Keith:72,Paul:84,Rick:57,Terry:65

試験の成績順(得点の高い順)にソートし、名前と得点を要素とする表を作成しなさい。
なお、データは下記のデータ分で与え、表のデータはすべてアスキーコードとします。
exam db 'Bill:69,Bob:65〜Rick:57,Terry:65'

といった問題です。
お忙しくなければ、この問題の解説と解き方を教えてもらいたいと思います。
どうか、よろしくお願いします
Tomohiko Igasaki  [2000/06/29 Thu 14:20:39]  [133.95.106.130]

パチンコのROM の解析および作成のために、
8ビット68系(具体的には6802と6811)の
アセンブラと逆アセンブラを探しています。

Linux 上で作業したいので、できるだけ
フリーのものでソースも公開されている
ものがいいです。お持ちの方、ご存知の
方などはいらっしゃいませんでしょうか。

Ichi  [2000/06/28 Wed 06:57:54]  [210.237.205.239]

> csとdsの指すメモリが同じなので
実験で確認しただけなので、間違ってるかもしれません。
# 公式な資料が見つからない...
ゆきのはら  [2000/06/27 Tue 21:50:35]  [202.219.178.154]

Yahoo!オークションにMASM Ver6が出品されていました。
http://auctions.yahoo.co.jp/jp/auction/14412311 です。

cels  [2000/06/27 Tue 01:55:35]  [203.180.144.13]

to Ichiさん

> >x86にコンフォーミングセグメントというのがあります。
> それでいいのですか。わかりました。
あ、Linkのオプションがほんとにそれなのかどうかはわかりません(^^;
たぶん同じものを指していると思いますが。

> csとdsの指すメモリが同じなので、dsを通して書きこんでやります。
なるほど。よくわかりました。
dsのほうのセグメントディスクリプタなら
アクセス可能というわけですね。

びたみん  [2000/06/27 Tue 00:52:33]  [210.130.67.147]

澤口@一升金さん

こんばんわ。

ありがとうございます。早速見てみます。
助かりました。
syphaslet  [2000/06/27 Tue 00:31:36]  [133.15.41.75]

Daisukeさん 早速のレスありがとうございます。

早速落としてきて参考にさせていただいています。
他にも自分なりにいろいろ調べてみたんですが、
DOS/V互換のアーキテクチャにはテクストVRAM領域という
PC98x1では当たり前の概念は、標準ではなかったみたいですね。
知らずに分けのわからない書き込みをしてしまいまして恥ずかしいです(^^;
澤口@一升金  [2000/06/26 Mon 12:06:52]  [210.190.4.131]

澤口@一升金です。

to びたみんさん:

ここにあります。

http://www.psyber.com/~tcj/hexspec.txt
びたみん  [2000/06/26 Mon 00:44:29]  [210.130.66.60]

インテルHEX形式の詳細なフォーマットが
書かれているホームページ又は資料等を御存知の方は、
いらっしゃいませんでしょうか??

あまりに一般的過ぎるのかどこ探しても見つかりません。
よろしくお願いします。


Daisuke  [2000/06/25 Sun 18:34:37]  [210.255.5.97]

to syphasletさん

DOS/V環境での資料は simtel.net にある
Interrupt List が参考になると思います。

http://www.simtel.net/
syphaslet  [2000/06/25 Sun 05:45:22]  [133.15.41.75]

はじめまして、みなさん。

PC98でアセンブラでプログラムを書いたことがあるからと、
今度はDOS/Vアーキテクチャ向けのアセンブラプログラムを
書くことになって困っているうちにたどり着きました。

質問なのですがDOS/Vアーキテクチャに関して知る上で参考に
なるようなウェブサイトはないでしょうか?
特にメモリマップがわからないのでテクストVRAMの位置すら
わからなくて参っています。
Ichi  [2000/06/24 Sat 05:38:32]  [210.237.205.243]
NASM

to Lisp氏:
>MASMとNASMってアセンブラのシンタックス上の違いっておるんでしょうか?
結構あります。たとえば、NASMではすべてのラベルはアドレスを持ち、
アドレスしか持たない。つまり、MASMでは mov foo, eax と出来ますが、
NASMでは、 mov [foo], eax としなければなりません。

また、型も持たないので、NASMでは、foostrucという構造体と、その
インスタンスfooistrucがあったとして、[foostruc.member]なんてことが
出来ず、[fooistruc+foostruc.member]と書かなければなりません。

詳しくはマニュアルの2.2を見てください。
Lisp  [2000/06/23 Fri 23:08:24]  [210.160.41.210]

MASMとNASMってアセンブラのシンタックス上の違いっておるんでしょうか?詳しいかたご回答願います。
Ichi  [2000/06/23 Fri 07:08:56]  [210.237.207.200]

to cels氏:

>Discardableでなくてもスワップはされると思います。
(略)
>.exeからロードされる、といったものだったと記憶しています。
むぅ、relocatableと勘違いしていたようです。
http://micro.uoregon.edu/win31/segload.html に (Win3.1ですが)
>Microsoft Windows loads programs into memory in segments (64K blocks
>of memory) marked fixed, movable, or discardable. Windows can unload
>discardable segments when it needs more memory for other applications.
という記述がありました。

>x86にコンフォーミングセグメントというのがあります。
それでいいのですか。わかりました。
cf.) http://www.intel.co.jp/jp/developer/vtune/v4/cbts/refman.htm
システム・プログラミング・ガイド

>ところで、x86には読み書き実行すべて可能な
>セグメントというのは存在しないようです。
>どうやって実現してるんでしょう?
Windowsは、コード領域に、ページレベルで書きこみ保護をしています。
/SECTION:.text,ERWD で、このページレベルの書きこみ保護を無効にして、
csとdsの指すメモリが同じなので、dsを通して書きこんでやります。
(実験済み)
つまり、セグメントとしては、読み出し可のコードセグメント、
ということになります。
cels  [2000/06/23 Fri 03:33:39]  [203.180.144.116]

to Ichiさん

Discardableでなくてもスワップはされると思います。
メモリが不足したとき、Discardableなセグメントは
スワップされずに破棄され、また必要になったときには
.exeからロードされる、といったものだったと記憶しています。
記憶が曖昧なので違ってるかも。

x86にコンフォーミングセグメントというのがあります。
これは高い特権レベルのセグメントに対して使われます。
通常低い特権レベルから高い特権レベルのルーチンを呼ぶには
コールゲートを通さないといけませんが、そのルーチン内で
特権が必要な処理を行っていなければわざわざ特権レベルを
変更する必要がありません。
そういうルーチンをコンフォーミングセグメントにすると
そうでないときより効率がよくなります。

IOPLは、I/O特権レベルのことでしょうか?
こちらはちょっと意味がわかりません。

ところで、x86には読み書き実行すべて可能な
セグメントというのは存在しないようです。
どうやって実現してるんでしょう?

kakushi  [2000/06/22 Thu 21:18:34]  [210.224.140.11]

to celsさん

どうもありがとうございます。
大変助かりました。

>Interrupt Listっていうドキュメントがあります。
>過去ログによると、ここのinter60a.zip〜から落とせるようです。
>ftp://ftp.riken.go.jp/pub/simtelnet/msdos/info/

全部ダウンロードしました。良い情報をありがとうございます。

>最初int 51hを調べたんですがどうも違うっぽいです(^^;
>pascalって16進数使えないんでしょうか。

私は、pascalは読んだことがないので、最初はcelsさんと
同じように調べました。

では。


Ichi  [2000/06/22 Thu 05:31:05]  [210.237.206.42]

to しろさん:
>> /SECTION:.text,ERWD
>末尾の D(discardable:破棄可能)はつけるべきではないと思います。
Dは、(実際の)メモリから破棄可能、つまりスワップしてもよい、
という意味だと理解していたのですが、どうなのでしょうか。 > 皆さん

ほかにC(Conforming),I(IOPL)等もあるのですが、よく(特にIが)わかりません。
ご存知の方がいらっしゃいましたら、お教えください。
(検索してもなかなか出てこない...)
しろ  [2000/06/22 Thu 04:53:54]  [210.253.203.178]

to Ichi さん
> /SECTION:.text,ERWD
末尾の D(discardable:破棄可能)はつけるべきではないと思います。
このフラグが Win95 でどのように扱われているか正確に把握しているわけ
ではなく、discardableという単語のイメージからなんとなくなのですが。

Mc.N  [2000/06/22 Thu 03:28:47]  [210.225.220.210]

3mode ですか。懐かしいですね。
昔、書いた資料ですが参考になれば。

http://homepage1.nifty.com/mcn/dev/3mode.htm
ぴょン太  [2000/06/21 Wed 13:41:42]  [210.159.27.92]
MS-DOSまたは汎用 > ハードウェア > ディスクドライブ用

私も昔にPC98x1で1.44MB formatが読めなくて困った時がありました。

3mode非対応のFDドライブで1.44MB formatを読み書きをするには
物理的な改造(オシレータの交換など)がなければ無理っぽいです。。。
うち  [2000/06/21 Wed 12:02:05]  [210.162.161.178]

澤口@一升金さん、ありがとうございます。

3モードのドライバーが無くて自分で作ろうと思ってます。

澤口@一升金  [2000/06/21 Wed 01:22:55]  [210.190.4.131]

澤口@一升金です。

to うちさん:

1.2MB って NEC PC98 の 1.25MB フォーマットのことですか?
あれはチップと 3mode ドライブの組み合わせによるので汎用的
な切り替え方法はないような気がするのですが。(資料が少なく
て実はよくわからない)
というか、今のマシンでは(もし 3Mode Drive が組み込んであ
れば)1.44MB と 1.25MB は自動認識してしまうのではないです
か?



うち  [2000/06/19 Mon 09:10:12]  [210.162.161.178]

はじめまして、

今度、DOS/Vで、フロッピーディスクを直接制御して、ディスク内容の読み書きをしなければ行けなくなったのですが、1.44MBと1.2MBの切り替えがわかりません。
どなたか、お願いします。

澤口@一升金  [2000/06/19 Mon 08:32:48]  [210.190.4.131]

澤口@一升金です。

to cels さん:

>最初int 51hを調べたんですがどうも違うっぽいです(^^;
>pascalって16進数使えないんでしょうか。
元投稿はたぶん Turbo Pascal ですね。なら、16進表記が
できます。この場合、イミディエイト値の頭に '$' をつけます。
51h -> $51 です。
Ichi  [2000/06/19 Mon 06:21:03]  [210.237.205.238]

to しろさん
はじめまして。
>下の方で Win98 でのコード領域への書き込みのテストをされていますが、
>デバッガ上で動作を確認されていませんか?
いいえ、VC++のインラインアセンブラを使って組み、結果をputsを
使用して出力して確認しました。
...と思ったら、CSとDSの指すメモリの一致を調べていただけで
CSには書きこんでいないことが発覚しました。
修正したら、ちゃんと(?)ページ違反が起きました。

>デバッガ上ではデバッガによるブレークポイントの設定やパッチ当て等
(略)
>るはず)
理解しました。

>コード領域への書き込みですが、Win95 ならリンク時にコード領域
(略)
>は手元にないので未確認)
/SECTION:.text,ERWD
で合ってるでしょうか。
通行人  [2000/06/18 Sun 19:57:04]  [210.160.41.210]

Daisukeさんありがとう。
NASMは現行で対応しているのは分かりました。
MASMって現在の最新のバージョンでも無理なのかな?>>Daisukeさん、その他詳しい人。
Daisuke  [2000/06/18 Sun 18:18:40]  [210.255.7.95]

to 通行人さん

>P3でSSE命令を使いたいんですけれど対応している
>アセンブラってどんなものがあるんでしょうか?

NASM 0.98 以降なら PentiumIII の SSE が使えます。
SSE は午後のこーだのソースが参考になります。

NASM はここにあります。
http://protools.exit.de/

しろ  [2000/06/18 Sun 18:01:38]  [210.253.200.163]

to Ichi さん
はじめまして。
下の方で Win98 でのコード領域への書き込みのテストをされていますが、
デバッガ上で動作を確認されていませんか?

デバッガ上ではデバッガによるブレークポイントの設定やパッチ当て等
の便宜上、コード領域への書き込みが許可されている可能性があります。
(またこの場合、他プロセスとのページイメージの共有は禁止されてい
るはず)

コード領域への書き込みですが、Win95 ならリンク時にコード領域
(.text セクション)から read only の属性を除去するだけで可能にな
ります。当然この場合、該当領域は他プロセスと共有されません。(NT
は手元にないので未確認)

自己書き換えに関しては、ずっと以前、「メモリ保護のあるOSで自己書
き換えをしたい場合は、関数全体をごっそりスタックにコピーして書き
換え、実行するとよい。そういった用途のためにそれらのOSではスタッ
ク領域は実行可能とマークされている。」といったことをどこかで読ん
だことがあります。

通行人  [2000/06/18 Sun 16:53:58]  [210.197.78.140]

P3でSSE命令を使いたいんですけれど対応している
アセンブラってどんなものがあるんでしょうか?
cels  [2000/06/18 Sun 16:19:22]  [210.149.131.143]

> kakushi さん
Interrupt Listっていうドキュメントがあります。
過去ログによると、ここのinter60a.zip〜から落とせるようです。
ftp://ftp.riken.go.jp/pub/simtelnet/msdos/info/

それによると、
AX=13h/int 10hはビデオモードの変更
AX=0Bh/int 33hはマウスカウンタの読み込み
のようです。

最初int 51hを調べたんですがどうも違うっぽいです(^^;
pascalって16進数使えないんでしょうか。

kakushi  [2000/06/18 Sun 13:57:03]  [210.224.140.11]

こんんちは。相当昔に書き込みをしたことのあるkakushiです。
今回もまた質問をしに参りました。

私は今、メガデモを作っている最中で、いろいろな所から(主に海外)ソースをダウンロードしては解読という作業をやっています。

その中で、pascal中でインラインアセンブラを使用しているソースがあるのですが、そのインラインアセンブラで何をやっているのかさっぱり分からないので誰かに助けてもらおうと思い、書き込みをしています。

以下にそのアセンブラの部分をそのまま転載します。
ライセンスは完全にフリーなので問題はないと思います。

@
asm
mov ax,19;
int 16;
end;

A
asm
mov ax,11;
int 51;
shr cx,1;
add c,cx;
add r,dx;
end;

上記2つです。一番分からないのはINT 16 と INT 51です。
できる限り調べてみたのですが、これが何を意味するのか分かりませんでした。

どなたか教えてくだされば幸いです。
よろしくお願いいたします。
ルナ  [2000/06/18 Sun 08:05:20]  [210.172.135.226]

あぅ〜。
バカですね、私って。ヾ(´▽`;)ゝエヘヘ
「H」が、抜けてるだけなんて・・・。
戻っていたんでふね・・・。

ありがとうございました。
bochs  [2000/06/17 Sat 23:31:27]  [210.234.15.48]

> ルナさん
メインルーチンの
int 21

int 21h
にすれば動きますよ(苦笑)
ルナ  [2000/06/17 Sat 20:57:40]  [210.172.135.202]

はじめまして。
NASMを使ってアセンブラを勉強しています。
ディスプレイに文字列を表示するところまでは、
自力でできたのですが。
サブルーチン的なものは、どのようにやればいいのか
わかりません。
もしかしたら、ヘルプに書いてあって見逃しているかも
知れないのですが、いかんせん英語が・・・・。

下のは、メインルーチンからサブルーチンをCALLして、
「うひょーー」「俺様素敵」と表示して、
メインルーチンに戻ってくるように書いたつもりなんですが。
じぇーんじぇーん戻ってきてくれない・・・。
どうやったら、メインルーチンに戻れるんでしょうか。
アセンブラは、CASL以外やったことなくて・・・。
(しかも、数年前)


---------------------------------------------
org 100h

section .text
Start:
call SubProc
mov ah,09h
mov dx,Message3
int 21
ret

SubProc:
mov ah,09h
mov dx,Message1
int 21h
mov dx,Message2
int 21h
ret

section .data
Message1 db 'うひょー!',0DH,0AH,'$'
Message2 db '俺様素敵',0DH,0AH,'$'
Message3 db 'メインルーチンに戻ってきたよ$'
澤口@一升金  [2000/06/16 Fri 23:04:33]  [210.190.4.131]

澤口@一升金です。

to AYA さん:

TASM なら、 TASM /? でコマンドラインスイッチオプションが表示
されます。
ただ、これだけでは解読がつらいので、ちょっと説明。

/j*** グローバルなディレクティブを指示します。
 ・SMART スマートリンク(使用されていない PROC はリンクしない)の指定
 ・JUMPS ジャンプを最適化(ショートジャンプで到達不能なときロングジャンプ
       に置き換える)
 ・LOCALS ローカルシンボル(PROC 内だけで有効なシンボル)を許可する

/u*** アセンブラバージョンを変更します
 ・M520 って MASM 5.2 の事?

/m*** 前方参照が解決されない場合何度パスするかの指示です。
 ・8 TASMは本来 1 パスコンパイラなのですが、8 パスまで実行。

/t アセンブル成功時にはメッセージを表示しない、という指定。

/l リスティングファイルを生成する指示

以上でわかる通り、コマンドスイッチは本質的に関係なさそうですね。

とはいえ、いくらなんでもソースが説明と不整合すぎます。雑誌編集の
手違いで全然別のソースを掲載してしまったのではないでしょうか。



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