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

 
Tips
 

 やっぱり 2002 年もアセンブラッ!!だねっ・・・て、こればっかり (^^;


 
Message log list
 

 アセンブラ掲示板に書き込まれた過去のログです。


Message log 44 (05/01/0506/30/05)
Message log 43 (01/01/0504/30/05)
Message log 42 (01/01/0412/31/04)
Message log 41 (11/01/0312/31/03)
Message log 40 (10/01/0310/31/03)
Message log 39 (04/01/0309/30/03)
Message log 38 (12/01/0203/31/03)
Message log 37 (08/01/0211/30/02)
Message log 36 (05/01/0207/31/02)
Message log 35 (03/01/0204/30/02)
Message log 34 (01/01/0202/28/02)
Message log 33 (09/15/0112/31/01)
Message log 32 (08/01/0109/14/01)
Message log 31 (05/26/0107/31/01)
Message log 30 (05/15/0105/25/01)
Message log 29 (05/01/0105/14/01)
Message log 28 (02/01/0104/30/01)
Message log 27 (01/01/0101/31/01)
Message log 26 (10/01/0012/31/00)
Message log 25 (07/21/0009/30/00)
Message log 24 (06/16/0007/20/00)
Message log 23 (05/20/0006/15/00)
Message log 22 (05/01/0005/19/00)
Message log 21 (04/01/0004/30/00)
Message log 20 (02/01/0003/31/00)
Message log 19 (01/01/0001/31/00)
Message log 18 (11/01/9912/31/99)
Message log 17 (09/05/9910/31/99)
Message log 16 (08/21/9909/04/99)
Message log 15 (07/01/9908/20/99)
Message log 14 (04/01/9906/30/99)
Message log 13 (02/01/9903/31/99)
Message log 12 (11/01/9801/31/99)
Message log 11 (09/21/9810/31/98)
Message log 10 (08/01/9809/20/98)
Message log 09 (07/01/9807/31/98)
Message log 08 (05/04/9806/30/98)
Message log 07 (04/08/9805/03/98)
Message log 06 (02/23/9804/07/98)
Message log 05 (01/01/9802/22/98)
Message log 04 (11/09/9712/31/97)
Message log 03 (10/17/9711/08/97)
Message log 02 (08/22/9710/16/97)
Message log 01 (06/20/9708/21/97)


 
Message log 05/01/0207/31/02
 




澤口@一升金  [2002/07/25 Thu 00:49:32]  [61.197.17.218]

澤口@一升金です。

to 小林さん:
<ワした。
ありがとうございました。

力卜  [2002/05/27 Mon 12:11:44]  [192.51.44.14]

豊田さん、こんにちは。

>「jmpi」という命令に出くわしました。

http://www.linux.or.jp/JF/JFdocs/readkernel.txt の、
「3.3. bootsect.S - 実際の動作」にある jmpi ですね。

処理内容からして、「jmpi <オフセット>,<セグメント>」と記述し、
cs に <セグメント> を代入し、ip に <オフセット> を代入する
far jump命令 (0xEA, OFFS_LO, OFFS_HI, SEG_LO, SEG_HI )でしょうね。

これは、
「インテル・アーキテクチャ・ソフトウェア・ディベロッパーズ・マニュアル中巻」
の jmp命令の箇所では次のように書かれています。
「EA cd JMP ptr16:16 オペランドで指定されるアドレスに絶対far ジャンプする。」

as86ってマイナーなのか、ドキュメントもあまり整備されていないようで、こういう
アセンブラ依存の情報を見つけるのは難しいみたいですね。
http://www.linux.org/docs/ldp/howto/Assembly-HOWTO/as86.html
http://www.cix.co.uk/~mayday/

ちなみに jmpi の i は、immediate(即値)を意味するのだと思います。
nasm だと jmp <セグメント>:<オフセット> (例: jmp 0ffffh:0000h)と
書けます。masmでの即値指定の書き方は私は知りませんが。

豊田芳彰  [2002/05/27 Mon 05:04:17]  [211.1.200.214]

Linux の一番最初のバージョンのソースコード(アセンブラ)
と言われるものを眺めていたところ、
「jmpi」という命令に出くわしました。
これはどういった役割の命令なのでしょうか。
何となくジャンプ命令だとはわかりますが、
「jmpi go, INITSEG」
というような使われ方をしていました。
(go はラベル、INITSEG は INITSEG = 0x9000 と定義されていた)

i386 上で動くように設計されたソースらしいので、
「インテル・アーキテクチャ・ソフトウェア・ディベロッパーズ・マニュアル」
の中巻の「命令セット・リファレンス」で調べてみましたが、
この命令は載っていませんでした。

知っている方がいらしたら、教えて頂けないでしょうか。
よろしくお願いします。

Tsuyoshi  [2002/05/24 Fri 21:23:57]  [211.8.110.161]

Tsuyoshiです。

>プロテクトモードにおいても違和感なく各サービスを実行
>するために、割り込み時にだけリアルモードと同じ環境にもどして
>あげる必要があります。仮想86モードを用いたメモリマネージャ
>などが有名です。

仮想8086モードですかぁ。IntelCPUが8086との互換性を
維持しているのは、このためですね。

ご解説、ありがとうございました。
Lives  [2002/05/23 Thu 21:30:26]  [150.37.251.15]

>Tsuyoshiさん
 プロテクトモードに以降すると、IDTの内容は特殊ディスクリプタ
形式として認識されるため、たしかにリアルモード用である従来の
BIOSコール、DOSファンクションなどは使えなくなります。
 プロテクトモードにおいても違和感なく各サービスを実行
するために、割り込み時にだけリアルモードと同じ環境にもどして
あげる必要があります。仮想86モードを用いたメモリマネージャ
などが有名です。
 プロテクトモード用のIDTにはそれぞれに、適切に仮想86モードで
対応する割り込みサービスを実行できるようなルーチンを書いておく
ようです。
 EMMなどでは、
普段:仮想86 −>
割り込み時:プロテクト(モニタカーネル) ー>
割り込みサービス:仮想86 ー>
割り込み終了準備:プロテクト −>
割り込み終了:仮想86
 といった感じでしょうか。
Tsuyoshi  [2002/05/22 Wed 14:22:23]  [211.8.110.161]

すみません。書き込みミスです(^^A)。↓
Tsuyoshi  [2002/05/22 Wed 14:19:57]  [211.8.110.161]
tuyosi16@mail.kbn.ne.jp

Tsuyoshiです。

またまた、おじゃまします。

プロテクトモードに移行するとき、
IDTを新しく設定しなければならないとなると、
MS-DOSが使っていたIDTとは違うものに
なってしまいます。

そこで、疑問があります。

リアルモードにおけるIDTには、なんかいーっぱい
ファンクションが詰まっておりましたが、
プロテクトモードになると、あれらは全部
使えなくなるってことですか?!

どなたか、教えてください・・・。
Tsuyoshi  [2002/05/20 Mon 20:46:56]  [211.8.110.161]

Tsuyoshiです。

・・・ということは、80x86のCPU構造は、Intel社のものが標準と考えてよいのですね。

Livesさん、ありがとうございました。
Lives  [2002/05/20 Mon 16:45:47]  [150.37.251.15]

>Tsuyoshiさん
AMD社とIntel社の命令はほぼ完全に互換しているのではないでしょうか。

>セグメンテーション・メカニズム
セグメント方式のことですか。この他、ページング方式など80386から
受け継がれてきたメモリ管理の為の機構も含めて、WindowsやDOSを
動作させるために、基本的な命令フォーマットはバイナリレベルで
互換性があるはずです。
ただ、SSE, 3DNow!などの特殊な拡張命令は、それぞれのメーカーの
独自のものだと思います。そういえば、AthronXPってSSE命令を
搭載しているそうですね。
ぼくもPentium以降のCPU機構の詳細はよくわからないので
まちがっていましたらすいません。
Tsuyoshi  [2002/05/20 Mon 14:02:48]  [211.8.110.161]

Tsuyoshiです。

突然失礼します。

AMD社のとIntel社のとの命令は互換性があるとは知っているのですが、
どこまでが互換しているんでしょうか。
といいますのは、Intel社のCPUには、セグメンテーション・メカニズムという機能がありますが、
AMD社のCPUには、あるのかどうかが心配なんです。

もしそうだとしたら、命令フォーマットも同じということになるんですか?

どなたか、教えて頂けませんでしょうか。
もえ  [2002/05/18 Sat 07:17:23]  [218.228.63.191]

ずいぶん返信が送れて申し訳ありません。
いろいろとありがとうございました。
Unit Missing Link  [2002/05/17 Fri 01:29:30]  [61.114.64.6]
Unit Missing Link's Web page 'Rhythm'

 こんばんは Technical Assembler の管理をしております Unit Missing Link の
Mist! でございます。
 みなさまの日々の書き込み感謝多謝です m(_ _)m

  01/01/02 〜 02/28/02 の書き込みをログページ Message Log 34 に、
  03/01/02 〜 04/30/02 の書き込みをログページ Message Log 35 に移動しました。

 リンクを一件追加いたしました。
  OS Developer's Site を運営されている kubota 氏よりメールを頂き、
Technical Assembler - OS Developer's Site 間で相互リンクをさせてい
ただくことになりました。

  OS Developer's Site さんは OS をつくっちゃおう!な情報サイトです。
 アセンブラ他いろいろな情報系のリンクがあります。

 将来このページから OS が誕生する!?


  OS Developer's Site
  http://ise-city.no-ip.com/~foo/
ASEMBRA  [2002/05/13 Mon 22:28:13]  [218.141.164.11]

>カトさん。レス有り難うございます。
 半角と全角の違いに気をつけます。

 ご指摘の通りALに0を設定していました。
 エラー処理は手持ちのリファレンスで調査してみます。

 また、ご指摘をお願いします。
澤口@一升金  [2002/05/13 Mon 14:52:38]  [61.197.17.152]

澤口@一升金です。
澤口@一升金です。

>(実はこのエラー処理の手順は詳しくないので詳しい方のフォローがあればうれしいです)

この件についてはカトさん以上に詳しくないのですが、

xor ax,ax
int 13h

でリセットしてしまうのがてっとり早いかと。他のエラーもありうることだし。

エラーの一覧表

http://www.bioscentral.com/misc/biosint13.htm

力卜  [2002/05/13 Mon 12:37:22]  [192.51.44.11]

ASEMBRAさん:

当方では以下の指定をして、int 13hでドライブA:の先頭セクタ (Track(Cylinder)#0,
Side(Head)#0, Sector#1)を読むことができています。
AH=2(セクタ読み込みファンクション)、AL=1(連続して読み込むセクタ数; 1)、
DL=0(ドライブ; 0=A:)、DH=0(サイド; 0=おもて), CL=1(セクタ; 1=Sector#1)、
CH=0(トラック; 0=Track#0)、
ES=読み込みバッファのセグメント値、BX=読み込みバッファのオフセット値。

トラック番号に79以上を指定してもエラーとなっておらず、毎回同じ読み込み内容と
なってしまうとのことなので、ひょっとしたら AL にゼロを指定していて、セクタの
読み込み操作が実は行われていないという気がするのですが、どうでしょうか。

ちなみに、FDへのアクセスは、FDが抜き差しされたときの対エラー処理が必要です。
Carry=1のときAH=6なら、AH=16h の int 13h ファンクションを一度呼んでから
再度アクセス(読み込み/書き込み)をする必要があるようです。
(実はこのエラー処理の手順は詳しくないので詳しい方のフォローがあればうれしいです)

最後に、掲示板への書き込みにいわゆる半角カタカナを使用しないでくださいね。
この注意は、このページの先頭の“− Caution! −”にも書かれています。

豊田芳彰  [2002/05/13 Mon 04:40:11]  [211.1.200.151]

to 澤口@一升金さん:

情報ありがとうございます。
Windows9x の場合は、デバイスドライバを書かなくても
Ring0 へ移行する方法があるのですね。
しかし、どうもセキュリティホールを利用している感じです。
うちは Windows2000 なので、
とりあえずデバイスドライバを書くという方向でがんばってみます。

ASEMBRA  [2002/05/13 Mon 00:41:31]  [218.141.164.11]

現在、ディスクBIOSを使ったプログラミングをしています。
フロッピーディスクに書き込まれたデータを読込むために、割り込み番号0x13h
、サービス番号0x02のソフトウェア割り込みを実行するコードを記述しているので
すが、予想通りの動作をしてくれません。
フロッピーディスクの場合、シリンダ番号の範囲は0から79のはずですが、どのシリ
ンダ番号を指定しても、同じ内容が読込まれてしまいます。また、80以
上の値を指定しても、エラーになりません。
どなたか、わかる方がいれば、教えて頂けないでしょうか?
よろしくお願いします。

(修正: 半角カナを全角カナに変更いたしました)
MM-santa  [2002/05/11 Sat 05:03:44]  [203.141.139.213]

MM-santaです。

>澤口@一升金さんへ

> 自分でスタートアップルーチンを書く目的は、
> ・ROM化できるコードをつくりたい
> ・IPLも自作してDOSのない環境でも動作させたい
> ・とにかくプログラムサイズを小さくしたい
> のいずれかになると思います。
> このときに自作スタートアップルーチンが標準スタートア
> ップルーチンと比較して何ができて何ができていないのか
> 確定できていないと何かと困るわけです。
確かにそのとおりだと思います。
私は、当初、スタートアップ・ルーチンの部分については
そんなに深く考えていませんでした。
動作させるという方に重点を置いていましたので。

>> あと、「main()」終了後に、スタートアップルーチン内にある「終了処理の
>> ルーチンが実行される筈ですが。
>> (割り込みベクタを元に戻すなど)
> スタートアップ・ルーチンのアセンブラーソース
> :
> :
> つまり、プログラム終了時の後始末は main の中からスタートアップ
> コードを呼び出しているわけではないです。
すみません、これは私の文章の書き方が良くありませんでした。
普通にスタートアップ・ルーチンがLINK・実行されているならば
「終了処理のルーチン」内でも、グローバル変数が参照される筈だと
いうことを言いたかっただけです。
明確にして措いた方が良いのかなと思って、追加書込みをしました。
もうひとつ参考程度に付け加えさせてもらうと、「main()」実行中に
「Ctrl-C」キーが押下されると、「終了処理のルーチン」に遷移する
筈だと思います。
(この部分は、「BC4 の CD-ROM」をインストールしてチェックを
するつもりです)

澤口@一升金  [2002/05/10 Fri 17:30:08]  [61.197.17.195]

澤口@一升金です。

追加情報です。
ここに"Going Ring0 in Windows9x"という記事がありました。

http://fly.cc.fer.hr/~lethe/asmjournal/html/apj_1/Going%20Ring0%20in%20Windows%209x.shtml
豊田芳彰  [2002/05/10 Fri 16:22:54]  [211.1.200.150]

豊田です。

to 澤口@一升金さん:

> Windows で Ring0 はカーネルモードのプログラムの
> 実行空間として使われます。
> なので、アプリから直接この空間に移行する方法はな
> く、デバイスドライバとして別途にプログラムを作成
> する必要があります。

やはり、デバイスドライバとして作る以外ないのですね。
じつは DDK はもうダウンロードしてきており、
まずはヘルプをじっくり読もうとしたのですが、
いきなり「VC++ の Professional Edition 以上しかサポートしていない」
と書かれており、開発を躊躇していました。
(うちは、VC++ 6.0 の Standard Edition )

ただ、友達の VC++ でコンパイルすることもできるので、
紹介して頂いたソースだけでも解析してみます。

> 試しに Win2000 で実行してみたら、 Ring0 保護違反と言われました。

うちも Windows2000 なので同じエラーが発生しました。
これは、Windows2000 用のDDKでビルドし直さないといけない、
ということですよね。

澤口@一升金  [2002/05/10 Fri 13:22:44]  [61.197.17.195]

澤口@一升金です。

to 豊田さん:

Windows で Ring0 はカーネルモードのプログラムの
実行空間として使われます。
なので、アプリから直接この空間に移行する方法はな
く、デバイスドライバとして別途にプログラムを作成
する必要があります。
デバイスドライバの作成ツールは、市販されているも
のもありますが、ふつうは MS社が無料で配布している
DDK(Device Driver Development Kit)を使います。
OS ごとに別々になっています。

http://www.microsoft.com/ddk/

読み込んでいないので解説できませんけど、多少の抜け道
はあるのかも。

http://www.sonic.net/~undoc/ntcallgate.html
http://www.anticracking.sk/Articles/Ring0.txt

この EXE を解凍すると Ring0.exe てのがでてきますが.
MS社で作った Ring0 アクセスのサンプルプログラムらしい。
(ソース付き)

http://www.microsoft.com/msj/code1993to1997/MSJMAY93.EXE

試しに Win2000 で実行してみたら、 Ring0 保護違反と言われました。

豊田芳彰  [2002/05/09 Thu 18:11:03]  [211.1.200.150]

Intel の Pentium 互換 CPU で rdpmc 命令を使ってみたいのですが、
Ring3 から使用するには、コントロールレジスタ4のビット8が
1にセットされていなければならない、と
「MMXテクノロジ最適化テクニック」という本に書かれていました。
また、1にするには Ring0 に入って行わなければならない、
とも書かれていました。

結局のところ、rdpmc 命令を使用するには、
まずは Ring0 に入る必要があるのですが、
どうすれば Ring3 から Ring0 に入ることができるのでしょうか。

最終的にやりたいことは、
ユーザが指定したCPUイベントを一定時間 rdpmc で計測し、
その結果をエディタウィンドウなどに表示するという
ウィンドウアプリを Windows0x NT系 対応で作ることです。

よろしくお願いします。

澤口@一升金  [2002/05/09 Thu 10:25:04]  [61.197.17.246]

澤口@一升金です。

to MM-santaさん:

>私なりに「もえ」さんのプログラムを見てみますと、
>「C0.asm」をリンク・実行する必要は無いと思えます。
もえさんが提示されたソースに限ってはその通りです。
実際、エラーなく動作しますから。
ただ、もえさんはおっしゃっていませんでしたが、自分で
スタートアップルーチンを書く目的は、
・ROM化できるコードをつくりたい
・IPLも自作してDOSのない環境でも動作させたい
・とにかくプログラムサイズを小さくしたい
のいずれかになると思います。
このときに自作スタートアップルーチンが標準スタートア
ップルーチンと比較して何ができて何ができていないのか
確定できていないと何かと困るわけです。

>また、「EXE を作るときに勝手にリンクされる」と澤口さんは
>書いていらっしゃいますが、昔、「TurboCとTLINK」でプログラムを
>作成するときは明示的に「C0.asm」をリンクしていました。
これはわたしの書き方がいい加減でした。すみません。
Turbo C の統合環境で一挙に EXE を作るときの話ですね。

>あと、「main()」終了後に、スタートアップルーチン内にある「終了処理の
>ルーチンが実行される筈ですが。
>(割り込みベクタを元に戻すなど)
手元に BC4 の CD-ROM があったので、インストールしてみました。
Win2000 でも統合環境が結構走ります。
で、当該の _main 呼び出しの前後はこういうソースになって
います。

; ExitCode = main(argc,argv,envp);

IF LDATA
push word ptr __C0environ+2
push word ptr __C0environ
push word ptr __C0argv+2
push word ptr __C0argv
ELSE
push word ptr __C0environ
push word ptr __C0argv
ENDIF
push __C0argc
call _main

; Flush and close streams and files

push ax
call _exit

つまり、プログラム終了時の後始末は main の中からスタートアップ
コードを呼び出しているわけではないです。
MM-santa  [2002/05/06 Mon 03:44:34]  [203.141.139.213]

MM-santaといいます。
>澤口@一升金さんへ
澤口さんがおっしゃろうとしている事が解らないので
お聞きしたいのですが。

> スタートアップルーチンはランタイムライブラリではなく、
> main() 実行前に本来無条件に実行されるルーチンで、コンパイラ
> で EXE を作るときに勝手にリンクされるものです。
> main() の実行前に C0.asm は役割を終えていますから、main()
> 以降の実行コードから参照されることはまずありません。
> 例えば、_stklen などでスタックサイズの調整やスタティックデ
> ータの初期化、いくつかの割り込みベクタの変更を行っています。

私なりに「もえ」さんのプログラムを見てみますと、
「C0.asm」をリンク・実行する必要は無いと思えます。
また、「EXE を作るときに勝手にリンクされる」と澤口さんは
書いていらっしゃいますが、昔、「TurboCとTLINK」でプログラムを
作成するときは明示的に「C0.asm」をリンクしていました。
なので、「C0.asm」をリンクせずにプログラムを作成するのは可能
だと思いますが。
あと、「main()」終了後に、スタートアップルーチン内にある「終了処理の
ルーチンが実行される筈ですが。
(割り込みベクタを元に戻すなど)

力卜  [2002/05/05 Sun 23:30:49]  [202.248.55.55]

澤口@一升金さん:

> NASM のマニュアルでは、スタートアップの最初のラインに
> RESB 100h
> を書くのが解決策となっているらしいです。

これですが、私が以前試したときは resb 100h としても先頭から
256バイトに00hの実データが入ってしまったため、できないと
ずっと思い込んでいました。
でも、resb 100h の後に ..start: を書けば、ちゃんとした
COMファイルが作れるobjができました。どうもお騒がせしました。

[RET.ASM]
segment CODE
resb 100h
..start:
ret

実行手順:
nasm16 -f obj ret.asm
link ret.obj;
exe2bin ret.exe ret.com

澤口@一升金  [2002/05/05 Sun 23:05:58]  [61.197.17.27]

澤口@一升金です。

to もえさん:

>逆アセンブラしてもとくにランタイムライブラリなどを呼ぶよう
>なコードは生成されていないので標準のライブラリをリンクする
>ことなくできるのではないかと考えられるのですがいかがでしょ
>うか。(特にリンク時にエラーが表示されることもないようです)
スタートアップルーチンはランタイムライブラリではなく、
main() 実行前に本来無条件に実行されるルーチンで、コンパイラ
で EXE を作るときに勝手にリンクされるものです。
main() の実行前に C0.asm は役割を終えていますから、main()
以降の実行コードから参照されることはまずありません。
(C0.asm がセットした変数値をライブラリルーチンが参照する
ことはあり得る。もえさんはライブラリをリンクしていないので
この際関係ないですが)
例えば、_stklen などでスタックサイズの調整やスタティックデ
ータの初期化、いくつかの割り込みベクタの変更を行っています。

澤口@一升金  [2002/05/05 Sun 22:06:46]  [61.197.17.27]

澤口@一升金です。

>強引に(?)他のアセンブラで org 100h だけを書いて、そのobjとリンクすれば
>一応、nasmを使った複数ソースでの COM形式の作成が実現できます。
NASM のマニュアルでは、スタートアップの最初のラインに
RESB 100h
を書くのが解決策となっているらしいです。

力卜  [2002/05/05 Sun 01:50:43]  [202.248.54.143]

もえさん:

> 最終的にCOMでの生成を目指していたのですが、NASMの制限で
> orgが設定できないようです。(勘違いであればご指摘ください)

nasmには一応 org擬似命令がありますが、これは実は -f binオプション
指定時にしか使えないようなのです。(-f objオプション指定時だと
"parser: instruction expected" のエラーになってしまう)
なので、nasmで生成した複数のobj(OMF形式)ファイルからはCOM形式の
ファイルを作成することはできません。

強引に(?)他のアセンブラで org 100h だけを書いて、そのobjとリンクすれば
一応、nasmを使った複数ソースでの COM形式の作成が実現できます。
以下のソース(LSI C-86に付属の r86の書式)で、もえさんが書かれた
startup codeを一部改変したもの(class名の "CODE" と "DATA" を、
それぞれ CODE と DATA にしたもの)とリンクできました。

[fileの内容: ORG100H.A86]
_TEXT cseg public 'CODE'
rs 0100h ; rs は、r86で org と同等の擬似命令

これを、DOS窓などで lcc -c org100h.a86 とすれば、ORG100H.OBJ
ができますので、リンカで一番先頭にリンクすればよいです。

MM-santa  [2002/05/03 Fri 15:48:30]  [203.141.139.213]

CHS関係の資料を見つけたので、
インターフェース2001年の7月号の60--65Pの記事です。
(因みに私は、Interface誌を毎月欠かさず購入しています)

http://www.cqpub.co.jp/interface/contents/2001/200107.htm


MM-santa  [2002/05/03 Fri 14:05:10]  [203.141.139.213]

>もえさん
遅くなりましたけど、動いて良かったですね。
パーティション内のCHSの見方は、昔、インターネットで
検索した覚えがあります。

NASMは未経験ですけど、「ORG」擬似命令はサポートして
いたような気がしますが。




「城」  [2002/05/02 Thu 16:19:10]  [202.225.33.33]

続き:
PC98xx なら http://www.vector.co.jp/soft/data/hardware/se016321.html
の資料が参考になります
「城」  [2002/05/02 Thu 16:06:16]  [211.13.34.132]

皆さん はじめまして
アセンブラ専門の掲示板があることを知りました(^^;)

もえさんの疑問のディスクアクセスの件ですが、
いわゆるDOS/V機の場合なら
http://www.tkcity.net/~nobusan/boot/boot.html
に詳しく解説されています。
CHSそのものは PC98でも同様ですが、DISK BIOS は別物です
もえ  [2002/05/02 Thu 00:48:01]  [218.228.63.233]

もえです。なんとかできるようになりました。
NASMコードです。

-----------------------------------------------------------
[extern _main]

[segment _TEXT public class="CODE"]

..start:
mov ax ,_DATA
mov ds, ax
mov es, ax

call _main

mov ax, 0x4c00
int 0x21

[segment _DATA public class="DATA"]

[segment stack stack]
resb 0x100
-----------------------------------------------------------

スタートアップコードはこれだけでいいようです。あとはCのコ
ードでvoid main(void)で始まるようにすれば大丈夫です。コマ
ンドライン引数はまったく意識しておりません。そしてリンカー
でリンクしてあげれば大丈夫です。

ただしBC++ 4.0で使う上で注意しなければいけないのは、

・char配列はグローバルにする。それ以外についてはスタック
 フレームを使うので問題はない。
・unsigned longで計算は行わない。

これらを使うとライブラリを要求されるようです。

最終的にCOMでの生成を目指していたのですが、NASMの制限で
orgが設定できないようです。(勘違いであればご指摘ください)

ぜんぜん違う質問で恐縮ですが、MBR(Master Boot Record)におい
てCHS値というのがありますがどのような構成になっているのでし
ょうか?

「00 41 2D」となっていればとりあえずひっくり返して「2D 41
00」としたあと

C(下位8bit) + H(8bit) + C(上位2bit) + S(6bit)

ちなみにC…シリンダ、H…ヘッド、S…セクタです。
とすればいいのかな?とやってみたのですがどうも期待したとこ
ろが取得できません。そもそもセクタが0になるはずがないので
計算違いだと思っておりますが...
デイレル  [2002/05/01 Wed 10:06:17]  [218.223.109.80]

>ふうさん

返事が遅くなってすみません。
そうですよね。要はライブラリに依存する訳ですから、
そこを自作のものに替えればBIOSコードを出力しますね。
ありがとうございました!
それと、よく考えたらC言語に関する質問をしてしまってましたね。
スレ違いで申し訳ありませんでした。

かちゅや  [2002/05/01 Wed 02:27:48]  [210.172.63.105]

雑談です。
8086 マクロアセンブラ入門という本が技術評論社さんからでてますね。
入門にはなかなかの本だと思うのですが、16ビット版link.exeの
入手はどうするつもりなのかな?(僕は立ち読みしただけです。)
まあ、こういう本が出るのは喜ばしいです。これでアセンブラ人口
が増えれば...。



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