![]() |
Message Log 24 | Return to Parent Menu |
Last Updated by 07/01/05(Fri) |
| |||
やっぱり 2000 年もアセンブラッ!!だねっ |
| |||
| |||
: 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. |