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

 
Tips
 

 ログ整理に苦しむ人


 
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 12/01/0203/31/03
 




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.