![]() |
Message Log 38 | Return to Parent Menu |
Last Updated by 07/01/05(Fri) |
| |||
ログ整理に苦しむ人 |
| |||
| |||
: IA-32に苦しむ人 [2003/03/31 Mon 16:29:44] [202.32.8.233] はじめまして。 早速ですが質問させてください。 IA-32で、プロテクトモードで、ページ機構がONのとき、 ・セグメントは仮想アドレス空間にあり、 複数のセグメントが合わさってリニアアドレス空間となる。 ・リニアアドレス空間は対応する物理メモリに ページ単位でアクセスする。 という認識で良いのでしょうか? IA-32に苦しむ人 [2003/03/31 Mon 16:29:05] [210.143.35.12] はじめまして。 早速ですが質問させてください。 IA-32で、プロテクトモードで、ページ機構がONのとき、 ・セグメントは仮想アドレス空間にあり、 複数のセグメントが合わさってリニアアドレス空間となる。 ・リニアアドレス空間は対応する物理メモリに ページ単位でアクセスする。 という認識で良いのでしょうか? ぐりぽん [2003/03/31 Mon 07:52:55] [211.134.134.244] >Forthさん プログラムを示すのは簡単ですが、概念から入らないと その先に進めないと思うので、控えさせていただきます。 海外で検索するか、大きな図書館で探すかすれば、 だいたい資料が見つかるはずなんで、そこからどうぞ。 Rastiv [2003/03/30 Sun 21:20:03] [211.8.106.9] Rastivです。 ↓このサイトで、参考になるソースコードを探してはいかがでしょうか? http://www.programmersheaven.com/ Forth [2003/03/16 Sun 14:07:13] [218.142.57.168] BIOSファンクションコールのInt 13h(ディスクBIOS)についてですが、使い方がいまいちわかりません。 FDのセクタ番号「1」からデータを読み込みたいのですが、シリンダ番号・ヘッダなどいろいろな値をセットしなければいけないので理解しづらいのですが・・・。 FDのセクタ番号「1」からデータを読み込むプログラムを教えていただけないでしょうか。 よろしくお願いします。 Rastiv [2003/03/01 Sat 21:57:40] [211.8.106.9] Rastivです。 Load of Minior さんへ。 アセンブラ言語の使用用途は、色色です。 アセンブラ言語は、機械語に直結する言語だから、 その言語を使って動かそうとするマシンすべてが、 その「用途」となり得ます。 そして、アセンブラ言語は機械語に直結する言語であり、 C言語は、それが持つ文法とアセンブラ(アセンブラ言語を 扱うソフトのこと)をつかって、プログラムのコードを より人間に分かりやすくする言語で、機械語をある まとまった束で扱う言語なのです。 これらを踏まえると、Cでコーディング中アセンブラ言語を 使用する、という場面が考えられて、その処理が 必要になる場合は、よく知りませんが、例えば、C言語が 用意してくれてるコードより、よりマシンに最適な コードを部分的に書きたい場合などがあると思いますよ。 habu [2003/02/27 Thu 11:28:22] [133.68.126.131] はじめまして.私は某工業大学に通うものですが,私の研究にどうしてもディスクバージョンのN88BASICが必要になりました. もしどなたかお持ちであれば譲っていただけないでしょうか. 勝手で申し訳ないですがもしそのような方がいたらお願いします. habu1696@sirius.ocn.ne.jpまでお願いします. Load of Minor [2003/02/23 Sun 19:56:50] [210.146.135.129] 始めまして。 最近アセンブラ言語について調べ始めたのですが、 アセンブラ言語の使用用途がよくわからなくて、萎えています。 現在における、アセンブラ言語の使用用途には、一体どういったものが あるのでしょうか? また、C言語とアセンブラ言語の連携ができるという話を聞いたのですが、具体的にどのような場合にその処理が必要になるのでしょうか? どなたか ご教授いただけないでしょうか。 Load of Minor [2003/02/23 Sun 19:56:05] [210.146.135.129] 始めまして。 最近アセンブラ言語について調べ始めたのですが、 アセンブラ言語の使用用途がよくわからなくて、萎えています。 現在における、アセンブラ言語の使用用途には、一体どういったものが あるのでしょうか? また、C言語とアセンブラ言語の連携ができるという話を聞いたのですが、具体的にどのような場合にその処理が必要になるのでしょうか? どなたか ご教授いただけないでしょうか。 井上 [2003/01/23 Thu 22:36:32] [219.112.49.17] 早速のご返事ありがとうございます。で、 >ファイル名のサフィックスを、「.S」ではなく「.s」に変更したらどうなりますか。ウチの方ではご指摘の問題が解消しました。 確かにそれですとファイル名は正確に報告されるのですが、今度はCプリプロセッサ機能が使えない状態に…(^^; # gccにとっての.Sと.sの違いはそれ(CPP使用/非使用)のようです。 多分、.Sファイルは一旦cppの出力をテンポラリファイルにリダイレクトするところを.sファイルはそのままasに渡してるんじゃないかと。 うーん、ソースから改造でもしてみましょうか… 力卜 [2003/01/23 Thu 12:28:25] [192.51.44.47] 井上さん、こんにちは。 ファイル名のサフィックスを、「.S」ではなく「.s」に変更したらどうなりますか。ウチの方ではご指摘の問題が解消しました。 これまでgccをドライバとしたgasの使用の際、「.S」や「.s」を使っていましたが、こんな問題があるなんて全然気づきませんでしたねぇ。 井上 [2003/01/21 Tue 22:39:58] [219.112.49.17] はじめまして。 GAS(むしろGCCかも)について質問がありまして、どなたかご存知の方ご教授願います。 環境はTurboLinux Workstation 7 on Celeron, GCC 3.2.1, Binutils 2.13.1です。(多分プロセッサとかは関係ない質問ですけど(^^;) GASにCプリプロセッサを組み合わせて使うとき、大抵の場合は拡張子を.Sにしてgccに喰わせたりすると思いますが、そのとき喰わせたソースに文法エラーがあった場合、GCCの出力が次のようになってしまいます。 /tmp/ccEH52X6.s: Assermbler messages: /tmp/ccEH52X6.s:60: (略) これはおそらくGASがテンポラリファイルを喰わされるからでしょうが、これではどのファイルの話なのか分かりにくいですよね。ヘッダファイルでもインクルードしてようものなら報告される行番号もアテになりませんし。さらにVIやVIMで編集していると:makeが使えなくて自分でエラー位置を探す羽目になる始末…。 `.file'はどうやらDeprecateの方向のようで、as 2.13.1では無視されました。 gcc -E file.S > file.s && as -o file.o file.s みたいなことをしても結局は自分でエラー位置を探す羽目になることに変わりは無いわけで… 誰か何か回避方法ご存知でしたら是非教えてください。お願いします。 倉葉 [2003/01/08 Wed 04:38:15] [63.51.173.159] http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html をみると 以下のような記述がありました。 Addressing what a register points to: AT&T: (%eax) Intel: [eax] "what a register points to" より、 レジスタが指しているものにアドレッシング する場合に括弧で囲むっていうことなので、 レジスタでなければ単なる式ってことで いいみたいですね。 Addressing a variable offset by a value in a register: AT&T: _variable(%eax) Intel: [eax + _variable] Addressing a value in an array of integers (scaling up by 4): AT&T: _array(,%eax,4) Intel: [eax*4 + array] You can also do offsets with the immediate value: C code: *(p+1) where p is a char * AT&T: 1(%eax) where eax has the value of p Intel: [eax + 1] 倉葉 [2003/01/07 Tue 19:13:02] [202.32.46.12] ・・・優先度に関する記述はなかったです。 力卜 [2003/01/07 Tue 17:55:38] [192.51.44.53] 倉葉さん、こんにちは。 > C言語の"優先順位"のようなものが存在するんですね。 はい。しかしそれはあくまでアセンブリソースの記述上の話です。機械語レベルになると式とか優先順位とかの概念はありません。 アセンブラとリンカが出力する機械語は、ソース上の「式」の部分が、その式を計算した結果の「数値」になったものです。 これは、アセンブラがラベルなどを含む式を計算して数値を求めるからです。これはアセンブラの主要な機能の一つです。(外部シンボルを含む式はアセンブラでは直接計算できませんので、リンカがその部分を解決(計算)して数値にします。) もしアセンブラで、数値がくるべきところに式やラベルが書けなかったら、とても大変です。常に人間が式を計算して数値にしたものをソース上に書かねばなりません。jmp命令の飛び先なども数値で書くとしたら地獄ですよね(8bitの頃はハンドアセンブルは普通にやっていましたが)。 ちなみに、式がサポートする演算子の種類や優先順位については、(これもまた調査していませんが) gasはC言語のサブセットだと考えてよいかと思います。 ということで、 > Intelマニュアルをじっくり読んでみることにします。 アセンブラとリンカは作業分担して、ラベルや式、ラベルを含んだ式を数値にするということを踏まえてマニュアルを読むと、アセンブり言語と機械語の対応がはっきりとすると思います。 インテルのマニュアルでは、gasのAT&T記法(「inst src,dest」)ではなく、masmやnasmと同じインテル記法(「inst dest,src」)だと思うので注意してください。 倉葉 [2003/01/07 Tue 03:13:06] [63.51.171.109] カトさん、無理をいって申し訳ないです。 >この括弧は、無視されているというよりも「式の一部」だと考えてみ>てください。 >式なので、演算の優先度を変更または明示する場合には括弧を付けますよね C言語の"優先順位"のようなものが存在するんですね。 *と 括弧()だったら、*の方が優先度が高いみたいな。 Intelマニュアルをじっくり読んでみることにします。 回答どうもありがとうございました。 力卜 [2003/01/06 Mon 20:56:11] [192.51.44.51] 最初に「gasは使ったことがなかったのですが」と書いたのですが、読みとばされてしまいましたかね。(^_^;) あまり神経質にならず、いろいろとCソースを書いてアセンブリ出力を眺めることをお勧めします。 わからない部分はフィーリングで想像して読むというテもあると思いますよ。(今回、gasの仕様を知らない私はそうしていますがそれで十分です) >のは存じてますが、.section .rodataというのは初耳です。 >すみませんが、よかったら教えていただけませんか?HPで検索しても 以下はどうでしょうか。 http://ap.fukushima-iri.go.jp/WEB/CROSS/cross.html >「括弧( )は、レジスタを介さない場合は >無視されている」と考えていいのでしょうか? この括弧は、無視されているというよりも「式の一部」だと考えてみてください。 式なので、演算の優先度を変更または明示する場合には括弧を付けますよね。 以下は、式だということを暗に示すつもりで書いたのでした。($があってもなくても式としては一緒) >例:「mov $string,%eax」、「mov $(string),%eax」、「mov $string+(1-1),%eax」、「mov $(string+1)-1,%eax」。 アドレスを示すラベルは、その値をそのまま掛け算するみたいな変な式は作れませんが、以下のように両者の差を求めることなんかもできます。 .data data1: .string "abc" data2: .string "xyz" .text mov $data2-data1,%eax mov $(data2-data1)*4,%ebx mov %eax,data2 mov %eax,data1+(data2-data1) # いろいろ書いてあるけど、結局前の行と同じ意味。 倉葉 [2003/01/06 Mon 20:15:07] [202.32.46.12] 今、カトさんが書かれた内容をもう一度読み返し、 実験をやってるんですが、 string: .ascii "abcde"のとき、 stringと(string)は同義である。 このときの()なんですが、 「括弧( )は、レジスタを介さない場合は 無視されている」と考えていいのでしょうか? また、 変数名or配列名 ± 変位 ex) string +2 or array+2 のとき、 アドレス値が 「変数または配列の先頭アドレス± 変位」 であるメモリの内容 を意味する と定義しても問題ないですか? 倉葉 [2003/01/06 Mon 19:53:22] [202.32.46.12] >「.data」と「.section .rodata」を .dataは"これ以降のデータをデータセグメントに置く"という のは存じてますが、.section .rodataというのは初耳です。 すみませんが、よかったら教えていただけませんか?HPで検索しても よくわかりませんでした。 力卜 [2003/01/06 Mon 19:36:05] [192.51.44.48] 倉葉さん、こんばんは。 以下をお試しください。アセンブリ言語でどう書いた場合にどうなるかを考えるよりも、C言語で目的の記述を試してみる方が話が早いです。 一応、注目すべきキーワードとして、疑似命令の「.data」と「.section .rodata」を挙げておきます。 出力されたアセンブリソース中の不要部分(と思われるもの)をどんどん削る実験をしてみるのも面白そうです。 ソース: a.c char global_char[] = "global"; int main (void) { static char static_char[] = "static"; char *p="literal"; } コマンドライン: gcc -S a.c vi a.s 倉葉 [2003/01/06 Mon 17:34:41] [202.32.46.12] string .ascii "abc" は C言語的には char *string="abc"; ですか? char *string="abc"; の場合、 string 書き込み読み込み可の領域 ---------------------------------- a 読み込みonlyの領域 -- b -- c ですが、 string .ascii "abc"の場合、どのようにとられるんでしょう? stringは変数なので、 メモリ上に置かれるんでしょうか? それともラベル(アドレス値)としてしか存在 していないのでしょうか? 倉葉 [2003/01/06 Mon 16:50:10] [202.32.46.12] カトさん、ご親切にどうもありがとうございます!! 解説がとてもわかりやすく、今までぼんやりとしか わかっていなかったところがすっきりとしました。 気分爽快です!! masmやnasmの経験はまったくありません。 C言語を一通り学習し終えたのですが、 ポインタの理解が徹底してないように思われ、 ただで勉強できる(笑)gasに手をそめました。 >>(レジスタ名に)括弧を付けて間接アドレッシングとする」のは、レジ>>スタをベースとした間接アドレッシングの場合です この説明で、いままでもやもやしていたものが 氷解しまいた。 gasを知っている人は少なく、本も手元に一冊しかない状態で ほんと助かりました。 これからもご指導よろしくお願いします。 力卜 [2003/01/06 Mon 12:33:57] [192.51.44.47] 倉葉さん、こんにちは。 masm(tasm)やnasmなどの他のアセンブラで、mov命令の各アドレッシングをどう書き分けるかはご存じでしょうか。 今回の件は、gasの文法上どうやったらmov命令が持つの各アドレッシングの書き分けができるかに尽きると思います。 gasは使ったことがなかったのですが、実験の結果も踏まえてわかることを書いてみます。 (どこかにgasの文法の記述があればよいと思うのですが、これについては今回ぜんぜん調査していません。) まず「レジスタ間転送」はご存じですよね。例:「mov %ebx,%eax # eaxレジスタにebxレジスタの値を入れる。」これは特に疑問もないと思います。 次に「即値の転送」ですが、「左辺の最初に$を書くと即値の転送になる」ということです。よって、以下の例は「string」のアドレス値が即値としてレジスタに入ります。 例:「mov $string,%eax」、「mov $(string),%eax」、「mov $string+(1-1),%eax」、「mov $(string+1)-1,%eax」。 この(↑)例を見ればわかると思いますが、「括弧を付けるから間接アドレッシングになる」と決まるわけではありません。 そして、ここまでに挙げた例以外は、すべて間接アドレッシングになると思えばよいと思います。よって、「mov string,%eax」と「mov (string),%eax」は同義で、stringが指すメモリの4バイトの値をeaxに入れ、「mov %eax,string」と「mov %eax,(string)」は同義で、stringが指すメモリ4バイトにeaxの値を入れるということです。 括弧のあるなしを気にされていましたが、「(レジスタ名に)括弧を付けて間接アドレッシングとする」のは、レジスタをベースとした間接アドレッシングの場合です。これは文法上、「(ベースレジスタ[,インデックスレジスタ[,スケイルファクタ(1 or 2 or 4 or 8)]]」と記述するようです。さらに数値の変位を書く場合は括弧で囲んだレジスタの左側に書きます。以下に間接アドレッシングの例を書きます。 例1: nasm: mov eax,[ebx] → gas: mov (%ebx),%eax 例2: nasm: mov eax,[ebx+1] → gas: mov 1(%ebx),%eax; movl (1)(%ebx),%eax # 前者と後者は同一 例3: nasm: mov eax,[ebx+string+1] → gas: mov string+1(%ebx),%eax; movl (string+1)(%ebx),%eax # 前者と後者は同一 例4: nasm: mov eax,[ebx+ecx*4+string+1] → gas: mov string+1(%ebx,%ecx,4),%eax; movl (string+1)(%ebx,%ecx,4),%eax # 前者と後者は同一 例5: nasm: mov byte [ebx],0x12 → gas: movb $0x12,(%ebx) 例6: nasm: mov word [ebx],0x1234 → gas: movw $0x1234,(%ebx) 例7: nasm: mov dword [ebx],0x12345678 → gas: movl $0x12345678,(%ebx) これらを踏まえると、「movl $4,array+2」については、「array+2」が指すメモリ(間接アドレッシング)に「4(0x00000004)」という4バイト(movl文なので)の即値を格納することもわかるのではないかと思います。 以下は簡単な実験のログです。 [someone@notepc1 asm]$ cat a.S .data string: .ascii "abcdefgh" .text .globl main main: movl $string+4,%eax movl $string+4,(%eax) movl $(string+4),%eax movl $(string+4),(%eax) movl string+4,%eax movl (string+4),%eax movl $0x12345678,string+4 movl $0x12345678,(string+4) ret [someone@notepc1 asm]$ gcc a.S -oa.exe [someone@notepc1 asm]$ gdb ./a.exe GNU gdb Red Hat Linux 7.x (5.0rh-15) (MI_OUT) ...<<略>>... (gdb) break main Breakpoint 1 at 0x8048430 (gdb) run Starting program: /home/someone/asm/a.exe Breakpoint 1, 0x08048430 in main () (gdb) x/9i $eip 0x8048430 <main>: mov $0x80494ec,%eax 0x8048435 <main+5>: movl $0x80494ec,(%eax) 0x804843b <main+11>: mov $0x80494ec,%eax 0x8048440 <main+16>: movl $0x80494ec,(%eax) 0x8048446 <main+22>: mov 0x80494ec,%eax 0x804844b <main+27>: mov 0x80494ec,%eax 0x8048450 <main+32>: movl $0x12345678,0x80494ec 0x804845a <main+42>: movl $0x12345678,0x80494ec 0x8048464 <main+52>: ret (gdb) quit The program is running. Exit anyway? (y or n) y [someone@notepc1 asm]$ 倉葉 [2003/01/04 Sat 19:41:22] [61.210.232.209] はじめまして。 GNUアセンブラを勉強中です。 教えてください。お願いします。 Intelマシンなんですが、 .data string: .ascii "abcdef" movl string,%eax・・・@ movl $string,%ebx・・A movl (string),%ecx・・・B movl (string+1),%edx・・・C @は、変数名になにもついていないので、 アドレス$string、すなわち変数stringの先頭アドレスの メモリの内容を転送している。 で、 Aは、変数の先頭に$がついているので、これは 変数stringのアドレス値を転送している。 さて、問題はB、Cなんです。 (string)のstringはなんですか? 変数名の先頭になにもついてないので、 メモリの内容ということになってしまいます。 ()はポインタをあらわすんですよね? (%ebx)だったら、%ebxがさすメモリの内容を意味するんです よね。 そうやって考えていくと、stringっていうのは いったいなに?みたいな。 どうやらアドレスのようなんですが。。 でもアドレスならば$stringと書くはず。 ここで、もうこんがらがってしまって・・・ で、さらに 今みている教科書には、 共通領域arrayがメモリ上に12バイトとられているとすると movl $4,array+2 のようなことができるとあるんですが、 arrayはメモリ内容ですよね。 とすると、array+2という表現はおかしいようにおもうんです。 これって、($array+2)と解釈されているんですかね? このへんのところをぴしゃりと明確に 説明してくれている本がないのでこまっています。 すみませんが、わかる方がおられましたら、 ご教授下さい。 Forest [2003/01/02 Thu 11:40:18] [218.142.57.168] 「城」さん、ぐ さん すばやいレスありがとうございました。 >RBILのoverview.lstから眺めることをお勧めします。 こつこつと勉強していきます! ぐ [2003/01/02 Thu 01:05:39] [211.134.134.247] >Forestさん RBILのoverview.lstから眺めることをお勧めします。 「城」 [2003/01/01 Wed 23:33:50] [219.110.89.90] Forestさん ソフトウェア割り込みは過去分([2002/11/14 Thu 22:43:56])を参照してください 死体処理第17精鋭部隊隊長 [2003/01/01 Wed 18:49:52] [219.103.246.155] 皆さんはじめまして! 自分はTHEBBSの住民ですが、ココを時々覗かせてもらってます! 分からないことがあったら、皆さんのお力を借りに来たいと思います! Forest [2003/01/01 Wed 12:34:03] [218.142.57.168] BIOSファンクションコールがわかりません。 一覧みたいなものを持っておられる方、教えてください。 可音 [2002/12/28 Sat 11:21:10] [219.167.30.122] けんぼぉさん、どうもありがとうございます。 早速試してみようと思います。 けんぼぉ [2002/12/28 Sat 09:58:07] [218.219.132.147] ども、けんぼぉです。 ♪可音さん はじめまして。 > SSE2に対応した逆アセンブラを探しているのですが たしか、これが対応していたと思います。 BIEW http://biew.sourceforge.net/en/biew.html 可音 [2002/12/25 Wed 19:39:09] [219.164.133.97] はじめまして。 いきなりで恐縮ですが、お尋ねしたいことがあります。 SSE2に対応した逆アセンブラを探しているのですが、 なかなか見つけられなくて困っています。 なにか良いものはないでしょうか? けんぼぉ [2002/12/21 Sat 10:50:54] [218.219.132.147] ども、けんぼぉです。 既にご存知かと思いますが、CQ出版 TRY!PC 冬号、特集「アセン ブラがわかればハードがわかる」というのが出ています。これは 以前に紹介したCQ出版 Interface の「開発技術者のためのアセ ンブラ入門」を途中までまとめた本のようです。 TRY!PC http://www.cqpub.co.jp/try/ 興味のある方はどうぞ。(って最近本の紹介ばかりですね。(^^;) 電 [2002/12/17 Tue 22:44:23] [203.141.156.195] カトさん、こんばんは^^ たしかに、MASMをはじめてからWINを使うことが多くなりましたね^^ NASMがLINUXでも使えるのでしたら、そっちを覚えたほうがよさそうです^^どうもありがとうございます〜^^ 力卜 [2002/12/17 Tue 00:37:51] [202.248.55.75] 電さん、こんばんは。 ddebは、Windows9xのMS-DOSモードでも、WindowsNT/2000/XPのコマンドプロンプトでも動作しますよ。 あと、MASMを理解したいのならいいですが、LinuxやDOSでも使いたいとか、楽してプログラミングしたいのなら、私ならNASMをお勧めします。 MASMより覚えることが少なくて、簡単だと思います。 電 [2002/12/17 Tue 00:12:47] [203.141.156.195] カトさん、こんばんは^^ 早速DDEBを試してみました。見た感じとても興味をそそられますね でもDDEBってDOSモードでしか起動できないのですか? DOSモードでやろうとしたら、今度はMASMが「DOSでは動きません」 って出たんです(笑 とりあえず、NASMはMASMを理解してからやろうと考えています。 いろいろありがとうございました〜 Qosicu [2002/12/16 Mon 23:33:10] [219.106.6.164] はじめまして。聞きたいことがあるのですが・・・。 私はWindowsではなくx86版のSolarisを使っているのですが、 システムコールの発行がLinuxともFreeBSDとも やり方が異なって調べています。 LinuxではEAXにシステムコール番号、 EBX、ECXにそれぞれ第2、第3引数と代入していき、 int $0x80で発行します。 FreeBSDではEAXにシステムコール番号、 それに最後の引数からpushしていき int $0x80のルーチンをcallします。 Solarisの場合、どのようにすればいいのでしょうか。 教えてください。 力卜 [2002/12/16 Mon 20:38:19] [192.51.44.11] hideさん、こんばんは。 A1: DOS の int 21h AH=09h の文字列出力での、文字列の終端文字です。 詳細は、HERO'S Download Index http://gd4-082139.gd.icnet.ne.jp/~hero/hero.htm から、DOS.CHM をダウンロードし、「3.2.1 コンソール、プリンタ、RS-232C関係」→「09H 文字列表示 ([^C,^N,^P,^S]処理有)」を読んだり、入門用のアセンブリソース(Hello,worldみたいなもの)を参考にしてください。 A2: そのアセンブリソースはMASMのものではありません。 hideさんの書き込みの前に私が書いた、"NASM" のソースです。だから、NASMのドキュメントを参照すると答えが書いてあります。 NASMのドキュメントは英語です。頑張ってください。 hide [2002/12/16 Mon 16:06:24] [211.17.132.50] はじめまして。アセンブラの初心者です。 文字列操作で文字列の最後になぜ '$' が必要なのかがわかり ません。 ext) FirstBootMes db "Loading OS-AGE...",10,13,'$' また、文中で使う $ , $$ の意味がわかりません。 times 0x01FE-$+$$ db '$' ”初めて読む8086”、”初めて読むMASM”をみたのですが それらしきものがありませんでした。 教えてください。 力卜 [2002/12/14 Sat 10:19:22] [202.248.55.53] 電さん、こんにちは。 私が使っているのは NASM (The Netwide Assembler)です。これのDOS版と、Win32版を使っています。 http://nasm.sf.net/ http://sf.net/project/nasm/ マニュアルの日本語訳ものは、以下がありました。 http://www.bekkoame.ne.jp/~bero/faqj.htm MASMは高級言語のように、定義したラベルに型が付いてしまい、その型に合わない記述をする場合、キャストの必要があったりして、私にはとても不便です。 NASMだと、定義したラベルはただの値を示すものでしかなく、それをアドレスに使おうが即値に使おうが自由なのが好きです。 ちなみに、リンカーは、普段は LSI C-86 試食版コンパイラに付属の LLD.EXE を使っています。 ALINKというものと、VALというものがフリーのリンカーとして有名です。 またデバッガは、過去の書き込み: [2002/11/15 Fri 17:35:41] にあるように DDEB.EXE を使っています。 電 [2002/12/13 Fri 23:17:30] [203.141.156.195] カトさん、こんばんは^^。 すばやい返答ありがとうございます。 >今回 mov cx,DAT とした際、assume (ds:code)がないと、 >デバッガで見たら命令は mov cx,CS:[0080h] となっていました。 なるほど!たしかに読みたいのはDSの80hですものね^^ DS:[80h]としたらうまく動いてくれているようです やはりデバッガが使えないとこの先つらいかもしれませんね なにはともあれ、ありがとうございました(ペコリ >(やっぱmasmは使いづらい…。) カトさんはなんと言うアセンブラを使っているのですか? 力卜 [2002/12/13 Fri 20:48:29] [192.51.44.16] 電さん。こんばんは。いくつかわかる範囲で。 PSP:0080h の1バイトだけがコマンドラインパラメタ長になります。これが示す長さは最大で127(0x7F)です。 実際は、コマンドライン全体の入力文字数の制限で127までいくことはないと思います (Win9xのコマンドラインで127以上の長さのコマンドラインが使えるらしいですが、そちらの仕組みは知りません) オリジナルの mov cx,es:[80h] は、CLにES:[0080h]が入り、CHにES:[0081h]が入ることになります。 ES:[0081h]以降は、コマンドラインパラメタの実体の先頭ですので、CHにゴミが入っていると思います。 あと、今回 mov cx,DAT とした際、assume (ds:code)がないと、デバッガで見たら命令は mov cx,CS:[0080h] となっていました。 (やっぱmasmは使いづらい…。) この問題がなかったら assume疑似命令は書きませんでした。 最後に些細なことですが、DTAというのはディスク転送アドレスの略で、デフォルト位置がコマンドラインパラメタと同じであるだけで、DTAとコマンドラインパラメタは別モノだと思います。 電 [2002/12/13 Fri 19:29:07] [203.141.156.195] カトさん、ありがとうございます^^ ソースを書いて下さってありがとうございます!! いろいろ原因があったようです(笑)。まず第一に assume命令を行っていませんでした。私もPSPに関して 調べまして、DSとESは初期値がPSPの先頭を指すと知ったので、 変更したらまずいだろうと実行していませんでした(^^; でも擬似命令がここまで影響を及ぼすものなのでしょうか?? maincode segment org 5ch FCB db 36 dup(?) DTALEN db 1 dup(?) DTA db 127 dup(?) start: mov cx,200H ;原因究明のため(笑)ここが問題!? mov bx,1 mov dx,OFFSET DTA mov ah,40h int 21h mov ah,4ch int 21h maincode ends end start CXに即値を入れるのもマズい気がします^^ 力卜 [2002/12/13 Fri 17:35:22] [192.51.44.10] 電さん、こんにちは。 コピーされたソース片がそのままではアセンブルできる形式では なかったので、何が原因で問題が起きているのかわかりません。 とりあえず、以下だとうまく動作します。 ちなみに、DOSアプリ(EXEとCOMの両方)において、 DSとESは、両方とも初期値としてPSPを指します。 [ソース: parm.asm] assume cs:code, ds:code, es:code, ss:code code segment org 005Ch FCB db 36 dup (?) CMDLLEN db 1 dup (?) CMDLDAT db 127 dup (?) start: mov ch,0 mov cl,CMDLLEN mov bx,1 mov dx,offset CMDLDAT mov ah,40h int 21h mov ax,4C00h int 21h code ends end start ;EOF ビルド&テスト手順: ml.exe -c parm.asm link.exe parm.obj; ← 16ビットリンカーを使用のこと。 parm.exe any command line parameters... 余談ですが、MASMってソースの書き方が面倒くさいですね…。 電 [2002/12/12 Thu 18:12:52] [203.141.156.195] こんにちは、電です。 どうしても納得がいかないことがありまして 質問させてください^^ 私、以前からパラメータをDTAから読み出して表示するプログラムを 作ろうとしていたのですが、どうしてもうまくいかないんです。 org 5ch FCB db 36 dup(?) DTA db 128 dup(?) .startup push es pop ds mov cx,es:[80]h mov bx,1 mov dx,81h mov ah,40h int 21h 以下のようなのをここのLOGで見つけましたが、そのままコピーでも不可でした。いろいろ試してわかったことは、パラメータを沢山書けば 表示されるということです。よろしくお願いします〜^^ : |
e-mail: mist@e-net.or.jp | Structured Anchor Tree Return to Menu Return to Parent Menu |
Powered by Unit Missing Link. |