![]() |
Message Log 41 | Return to Parent Menu |
Last Updated by 07/01/05(Fri) |
| |||
ログ整理の自動化できたらいいなっ!? |
| |||
| |||
: poen [2003/12/25 Thu 23:13:15] [220.145.120.117] >しろさん 分かりやすい説明を有り難うございました。 納得できましたー。 これからは英語もアセンブラの勉強と平行させようと思います(w しろ [2003/12/21 Sun 07:48:46] [221.184.84.108] 『階乗』ではなく『べき(または累乗)』ですね。まちがえました。 しろ [2003/12/21 Sun 07:42:33] [221.184.84.108] > poenさん > この(=segment _DATA align=4)場合、16の倍数アドレスを... いいえ、align=X は、Xの倍数を そのオブジェクトファイル内のそのセクションの開始アドレスとするようにリンカ に要求するものです。ただしXには2の階乗のごく一部の値しか指定できません(OMF (いわゆる.obj形式)の場合) NASM Manual §6.2.1はこの制限を考慮して書かれた ものでしょう。 http://nasm.sourceforge.net/doc/html/nasmdoc6.html#section-6.2.1 align=4 なら4の倍数という事になります。 ちなみにMASM互換アセンブラで指定できるalignment属性は byte, word, dword, para, page の5種で、それぞれ align=1, 2, 4, 16, 256 に相当します。 かよ [2003/12/19 Fri 09:21:42] [202.33.240.232] Yasさん、レスありがとうございます。 Yasさんの方法でうまく動作しました。 本当に、ありがとうございますm(_ _)m! MSCの場合、セグメントを意識したコーディングが必要なんですね。 とても勉強になりました。 <ご参考> MSCのほうを調べてみた結果、 FP_SEGというマクロを使ってセグメント指定が できることもわかりました。(dos.hをインクルード) poen [2003/12/17 Wed 03:19:10] [220.145.120.117] >しろさん こんにちは。 早速のご返答、有り難うございます。 お教え頂いた通りにやってみたところ、見事にリンクできました。 classオプションでセグメントクラスをリンカに指定しなくてはいけないのですね。 勉強になりましたー。有り難うございました。 ところで align=4 という部分なのですが、本家のFAQによると 「alignはセグメントの最初のアドレスの下位何ビットが0になるかを決める」 らしいので、この(=segment _DATA align=4)場合、16の倍数アドレスを、 データセグメントの(セグメント)ベースにするという意味で宜しいのでしょうか…? しろ [2003/12/14 Sun 23:23:59] [221.188.23.20] > poenさん、こんにちは。 (手元の ilink32 5.00 では segment _data USE32 だけでも問題なくリンクできて しまうのですが...) nasm はほとんど使っていないので勝手がちょっとわかりませんが、bcc32 を -S オプションで起動したときにできる .asm ファイルから見て segment _TEXT align=4 public use32 class=CODE flat segment _DATA align=4 public use32 class=DATA flat あたりになると思います。 (GROUPまわりはフラットメモリモデルならあまり気にしなくともよいはずですが、 調べ切れませんでした) 以下はbcc32 の出力の一部 model flat _TEXT segment dword public use32 'CODE' _TEXT ends _DATA segment dword public use32 'DATA' _DATA ends _BSS segment dword public use32 'BSS' _BSS ends DGROUP group _BSS,_DATA Yas [2003/12/14 Sun 09:57:47] [133.24.88.90] はじめまして、こんにちは >再びアセンブラさん Mersenne Twisterという方法があります。 http://www.math.keio.ac.jp/~matumoto/mt.html ただしFAQにあるとおり、そのままでは暗号用の乱数として適切ではありません。 暗号用の乱数として使いたい場合はgenrand()を実行した後の配列mt[0]の下位31bits以外 (mt[1...623]の全bitsとmt[0]のbit31)をSHA(Secure Hash Algorithm)にかけたものを用いるとよいようです。 >かよさん プロテクトモードでのes(というか、セグメントレジスタ)はセレクタ値というものを指すものであって 論理/物理アドレスを直接指すものではありません。 本筋から逸れる詳細は割愛しますが、かよさんが求めているものとは違うものになります。 本題に入ります。 (USHORT _far*)の部分でデータポインタをfar指定していますが、farポインタは32bitで表現され、 上位16bitがセグメントレジスタへ、下位16bitがオフセットレジスタへ格納されます。 つまり、0x12345に0xaaaaを書き込みたいときには *((USHORT _far*)(0x12345)) = (USHORT)0xaaaa; ではなく、 *((USHORT _far*)(0x10002345)) = (USHORT)0xaaaa; としなくてはなりません。 このときセグメントレジスタは0x1000、オフセットレジスタは0x2345になります。 なぜこのような面倒くさいことをしなくてはならないかというと、ある特定のアドレスを指す セグメントレジスタとオフセットレジスタの組は無数に存在するため、人間が明示的に セグメントとオフセットを特定しないとにコンパイラが勝手にこれらを割り振ることになるためだと思われます。 poen [2003/12/14 Sun 01:18:02] [220.145.120.117] こんにちは。 これからさせて頂く質問があまりに低レベル過ぎる気がしまして、 お恥ずかしい限りですが、宜しければどなたかお教え願えませんでしょうか? Borland C++ 5.5 と nasm で次のようなコードを組んでみました。 --------(main.c)---------------------------------------- #include <stdio.h> extern void bit_swap(void); extern char *print_str; int main(void) { bit_swap(); return 0; } ---------(bswap.asm)--------------------------------------- extern _printf global _bit_swap,_print_str segment _code USE32 _bit_swap: push ebp mov ebp,esp push eax push edi mov eax,12345678h mov edi,_print_str push eax push edi call _printf add esp,4 pop eax bswap eax push eax push edi call _printf add esp,8 pop edi pop eax pop ebp ret segment _data USE32 _print_str: db '%xh',0 ------------------------------------------------ 特に意味はないプログラムでして、 eaxに12345678hを代入したのち、Cのライブラリ関数printfを呼び出してeaxを表示し、 その後eaxにbswapをしたのち、またprintfでeaxを表示する というだけのモノです。(bswap命令の挙動を確かめたくて作ったものです…) 以上のプログラムを nasm -f obj bswap.asm bcc32 main.c bswap.obj としますと、 「Fatal: 'bswap.asm' : Additional segments need to be defined in a .def file」 というエラーが出てリンクできません。 しかし、_print_str以下をコードセグメントに置くと問題なくリンクされ、動作もしました。 この場合一体どうすれば、printfで使うフォーマット文をデータセグメント上に置けるのでしょうか…? 再びアセンブラ [2003/12/12 Fri 17:19:50] [210.63.108.10] 何方か32bit乱数発生の方法知りませんか ? 使用言語は、勿論アセンブラです。 宜しくお願いします。 かよ [2003/12/12 Fri 09:41:12] [202.33.240.232] bonさん、レスありがとうございます。 環境についてです。 Windows2000のコマンドプロンプトを使ってコンパイルしています。 作りたいのは、8086/8088プロセッサ用の命令セットを使ったアセンブラコードです。 プロテクトモードだと、esレジスタの値が変わってしまうのでしょうか? bon [2003/12/12 Fri 03:52:07] [218.222.84.140] かよさん、動作環境不明。 プロテクトモードでないの? かよ [2003/12/11 Thu 11:10:02] [202.33.240.232] 初めて投稿させていただきます。 (アセンブラの掲示板があって、とてもうれしいです) 私は今、MSC(Ver.7)とMASMを使ってC言語とアセンブラの勉強をしています。はじめたばかりで、わからない点が多いのですが・・・。 C言語がアセンブラになったファイル(CODファイル)を見ていて不思議に思うことがありました。よかったら教えてください。 よろしくお願いしますm(_ _)m。 C言語で、アドレス4AAAAhにAAAAhのデータを書くソースを書きました。 *((USHORT _far*)(0x4AAAA)) = (USHORT)0xAAAA; これをコンパイルしたところ、 mov bx,4 mov es,bx mov bx,-21846 ;aaaaH mov WORD PTR es:[bx],-21846 ;aaaaH となっていました。 私の予想では、esレジスタは、4000hになってくれるのかと思っていたのですが、実際には4hに設定されています。 これだと、AAAAh+40h=AAEAhへの書き込みとなってしまう気がします。 esレジスタは、4hで正しいのでしょうか? (初歩的な質問ですみません・・・) Xeno [2003/12/09 Tue 10:03:32] [220.110.19.138] Bonさんレスありがとうございます。 ORG 100H START: ORG 0H にしてコンパイルしたところ256バイトのCOMファイルが出来上がりました。 0バイトからコードになってました。 確かにEXE2BINを使う必要まったくありませんね。(^^;) bon [2003/12/08 Mon 19:15:58] [218.222.44.39] こんにちは 超初心者のbonがレスします。 Xenoさんの過去発言を詠んでないので、外していたらゴメンね > ブートコード用にコードの部分だけ取り出すにはどうしたらいいのでしょうか? 私、ディスクブートコードは、大昔にフッロピー用を書いた事あるだけですが、 ブートコードはプログラムのスタート番地が、ゼロだったはず。 ORG 0 の実行ファイルを生成するには、ソースを以下のようにして、COMファイルを生成します。それがそのままブートコードになり、ディスクの所定の位置にそのまま書きこめばOKのはず。Masm6.xでは、EXE2BINは不要です。 --[Start]----- code segment byte assume cs:code,ds:code,es:code,ss:code org 100h start: org 0h なんとか かんとか code ends end start --[End]----- EXE2BINは、COMファイルか可能なEXEファイルのみを変換するものだったはず。 だから、ソースは、COMファイルを前提に書かれていなければいけません。 >なぜこんな古いものがWindows 2000のシステムディレクトリ内にある? >しかも更新日時 1999/12/07...why? 単に、過去の遺産の継承でしょう。 Xeno [2003/12/08 Mon 09:55:31] [220.110.19.138] 解決しました。 4.ブートコードを書いたのはいいのですが、普通にコンパイル等をすると当然、exe,obj形式のファイルしかできません。 ブートコード用にコードの部分だけ取り出すにはどうしたらいいのでしょうか? 実行ファイルをプログラムのメモリイメージに変換し出力する ツールEXE2BIN。 他の人から貰ったEXE2BIN(更新日時 1994/12/08)はうまく使えなかった のですが... なぜこんな古いものがWindows 2000のシステムディレクトリ内にある? しかも更新日時 1999/12/07...why? Xeno [2003/12/08 Mon 09:17:53] [220.110.19.138] ぐりぽんさん、しろさん、 どうもありがとうございます。 週末はFATに苦戦してました。(^^;) とりあえずNTFSフォーマット構造に関してはLinuxのソースコードを解析してみます。 ハードディスクのパーティション構造はMBRSCANのドキュメントに 確かに書いてあるようです。 私も作者に習って解析してみます。 しろ [2003/12/08 Mon 07:27:39] [220.96.34.5] しろ > Xeno さん > 3.NTFSフォーマット構造の仕様書等 残念ながら詳細な仕様書は見つからなかったのですが、概要だけなら "Linux-NTFS Project" 内の "NTFS documentation" が参考になると思います。 http://linux-ntfs.sourceforge.net/ntfs/index.html # あとは "Linux-NTFS Project" 内のソースを読むとか 日本語で書かれたNTFSの概要としては『Inside Windows NTファイルシステム』 (ISBN:4-7561-0302-2) という書籍が存在したのですが、'95年発行ですので入手は 難しいでしょう。(この書籍も概要だけなのでこれを読んだだけでNTFSを読むプロ グラムが書けるということはありません) 初心者 [2003/12/06 Sat 15:10:10] [218.142.56.56] ぐりぽんさんへ MASMの文法への変換ができ、無事動作を確認しました! ありがとうございます〜! 初心者 [2003/12/06 Sat 14:35:09] [218.142.56.56] わぉ。 おかしいなーと思いMASMの形式に手作業で変換しながらやっていたら・・・w ご丁寧にありがとうございます! ぐりぽん [2003/12/06 Sat 13:42:01] [210.249.5.39] 私MASMの文法がよくわからずFASMで書いていたので、アセンブル できないと思います。以下にソースとバイナリを置いておきます。 http://guriponn.at.infoseek.co.jp/new.lzh 初心者 [2003/12/06 Sat 08:01:34] [218.142.56.56] ぐりぽんさんへ ありゃ。。 すごい簡単にまとまってしまいましたね。 うーん。まだまだ勉強しないといけないなぁ^^; アセンブル&実行してみますねー! ありがとうございました! ぐりぽん [2003/12/05 Fri 21:39:38] [210.249.5.142] >Xenoさん 答えられるところだけ答えます。 ハードディスクのパーティションの仕様書というものは知りませんが、 MBRSCANというソフトのドキュメントが詳しいような気がします。 >初心者さん 興味があったので書き直してみました。動くはずです。 ---- org 0x7c00 xor ax,ax mov ds,ax mov ss,ax mov sp,0x7c00 cli mov word [0x0020],int_timer mov word [0x0022],0 mov al,0x36 out 0x43,al mov al,0x52 out 0x40,al mov al,0x09 out 0x40,al sti jmp $ int_timer: cli xor bx,bx mov ah,0x0e mov si,message i1: lodsb int 0x10 cmp al,0x20 jne i1 out 0x20,al sti iret message db "(^-^) " times 0x7dfe-$ db 0 dw 0xaa55 初心者 [2003/12/05 Fri 16:06:37] [218.142.56.56] すみません。 また伺いに来ました。。 前の資料等を参考にして、タイマー割り込みをテストするプログラムを作ったのですが、なぜか動きません。。 IPLのテストプログラムなのですが。 ソースは以下のようになっています。 ---------- ;タイマー割り込みテストプログラム .486 START = 7c00h TEXT segment byte public use16 jmp short BootProg org 0030h ;メインコード BootProg: cld cli xor ax, ax mov ds, ax mov ss, ax mov sp, 7c00h mov ax, 0003h int 10h ;ここまで、VGAの設定 call SetTimer sti MainLoop: jmp short MainLoop PrintStr: lodsb or al, al ; AL = 0 ? je short Return int 10h jmp short PrintStr Return: ret SetTimer: mov ds:[0032h], offset Interrupt mov ds:[0034h], word ptr 0000h ;タイマーカウンタの初期化 mov ah, 00h mov ds:[8000h], ah ;タイマー モード3 mov al, 36h out 43h, al ;0x952 = 2ms mov al, 52h out 40h, al mov al, 09h out 40h, al ;PICを設定 in al, 21h and al, 0FEh out 21h, al ret Interrupt: cli pusha mov ah, ds:[8000h] .if ah == 30 mov ah, 0Eh mov al, '*' mov bh, 0h mov bl, 0h xor bx, bx lea si, Message2 + START mov ah, 0eh call PrintStr ; 文字列表示 mov ah, 0h mov ds:[8000h], ah .else inc ah mov ds:[8000h], ah .endif ;EOI発行 mov al, 20h out 20h, al popa sti iret org 0100h Message1 db "Timer Test Program ver0.1", 0dh, 0ah, 0 Message2 db "---!Timer Interrupt!---", 0dh, 0ah, 0 org 0200h - 2 dw 0aa55h TEXT ends end Xeno [2003/12/01 Mon 21:02:21] [220.110.19.138] MASM6.11を使用して自分専用?のOSを作成しようと四苦八苦しています。(準備中) 今現在、ハードディスクの解析を進めています。 そこで皆様にお聞きしたいことが...た・く・さ・ん(^_^;;) 1.ハードディスクのパーティションの仕様書?みたいなものはないで しょうか?(FDISK/ハードディスク抹消ソフトみたなことがしたい のです) 2.Int 13だとドライブ単位でしかアクセスできないようなのですが、 ディスク単位でアクセスするにはどうすればいいのでしょうか?(もしかしてInt 13Hで出来るのか?) 3.NTFSフォーマット構造の仕様書等 4.ブートコードを書いたのはいいのですが、普通にコンパイル等をすると当然、exe,obj形式のファイルしかできません。 ブートコード用にコードの部分だけ取り出すにはどうしたらいいのでしょうか? 以上4点についてなにとぞよろしくお願いします。 初心者 [2003/12/01 Mon 12:40:18] [218.142.56.56] ぐりぽんさんへ ありがとうございます! なるほど。頑張って資料等を読んでみますね。 これからも、機会があれば質問させてもらうのでよろしくです。 ぐりぽん [2003/11/30 Sun 22:27:16] [210.249.5.26] >初心者さん ご紹介した「パソコンのレガシィI/O〜」のサイトで大体のことは 判ると思いますが、参考までに手元のソースを掲載します。 cli mov al,0x11 ; icw1 - initialize (no setting icw4) out 0x20,al out 0xa0,al mov al,0x18 ; icw2 - interrupt base address out 0x21,al ; start at 0x18 mov al,0x20 out 0xa1,al mov al,0x04 ; icw3 - it has slave pic out 0x21,al mov al,0x02 out 0xa1,al mov al,0x01 ; icw4 - option but must set out 0x21,al out 0xa1,al 本来なら0x20以降にハードウェア割り込みを移すのが良いです。 この後、CLI状態のままで必要な割り込みハンドラをベクタに設定し、 それからSTIするのが定石のようです。 初心者 [2003/11/30 Sun 17:50:42] [218.142.56.56] ぐりぽんさんへ ご回答ありがとうございます。 ええとですね、フロッピーディスクの割り込みと、 486のページフォルトの割り込みと区別ができるかどうかが知りたいんですよ。 ソフトウェア的に区別できるのか、割り込みコントローラの設定で区別するか・・。 で、私が聞いた話では、割り込みコントローラで設定するらしいんですよ。 ですから、その、どのように割り込み番号を変えるのかな・・・と。。 >で、情報提供をしてばかりでは回答者も気分が悪うございます。 はい。その気持ちはわかります。 私もGoogle等で調べたのですが、ピンとくるものがなかったのです。 解説の文だけですと理解ができず、今ココにて質問したわけです。 >http://www.cqpub.co.jp/column/books/2001a/34331PC_Legacy/default.htm なるほど。あとでゆっくり読ませてもらいます。 >http://www.asahi-net.or.jp/~WR7S-NKMR/BeOS/Documents/IRQ.html これはGoogleで検索した際、ヒットしました。 ディスクに保存してあるのですが、上に書いたとおり読解できずさっぱりです。。 よろしくお願いします。 ぐりぽん [2003/11/30 Sun 14:39:34] [210.249.5.200] http://book.mycom.co.jp/user/preview/4-8399-1202-5/index.shtml ここに載せられている本は悪書であると各サイトで書き込みが。。 それはともかく。閑話休題。 >初心者さん その考え方はそもそも間違っていません。普通の考えです。 私としてはどのような理由でそれを変える必要があるのかが 知りたいです。宜しければ教えてください。 で、情報提供をしてばかりでは回答者も気分が悪うございます。 http://www.google.co.jp/ のような優秀なサーチエンヂンで 「割り込みコントローラ」と入力すれば、適当なサイトが見つかり ますので、またそれで調べて回れば良いでしょう。。 私が見たところ、良いサイトが2つほど。 http://www.cqpub.co.jp/column/books/2001a/34331PC_Legacy/default.htm http://www.asahi-net.or.jp/~WR7S-NKMR/BeOS/Documents/IRQ.html 情報収集能力は大事なものでございます。 自分でも是非そのような能力を磨かれることをお勧めします。 初心者 [2003/11/24 Mon 19:38:04] [218.142.56.56] ええと、たとえば フロッピーディスクの割り込み番号の0Ehは 486のページフォルトの0Ehと重なりますよね? 例外割り込みのほうは変更できなくて、ハードウェア割り込みは独自で選べると聞いているんですが・・・。 そもそも考え方が違うのでしょうか。 澤口@一升金 [2003/11/23 Sun 20:51:50] [221.184.146.46] 澤口@一升金です。 to 初心者さん: 誰から聞いたのか知りませんが、ぶつかるように設定すれば ぶつかるし、そうでなければぶつかりません。 通常のPCでは電源ONでBIOSが設定するのですが、わ ざわざ変更しなければならない理由は何でしょう。 どういう不具合があって、何を解決したいのかよく分からな いのですが。 初心者 [2003/11/23 Sun 09:44:12] [218.142.56.127] はじめまして。早速質問させていただきます。 486系CPUでは、例外割り込みと ハードウェア割り込みの番号が衝突してしまいますよね? なので、ハードウェア割り込みの割り込み番号を変更したいのですが。 割り込みコントローラに設定するというのは分かったんですが、 どのようなポートで、どのように設定するのか、まったく分かりません。 Masmで開発を行っています どなたか、ご伝授ください! 澤口@一升金 [2003/11/22 Sat 12:31:17] [221.184.149.22] 澤口@一升金です。 to 質問者さん: eor は exclusive or、すなわち 1 eor 1 = 0; 0 eor 0 = 0; 1 eor 0 = 1; となる論理処理です。 従って、同じデータを eor すれば、データが何であっても 全ビットが 0 になります。 moveq とどう違うのかと言えば、機械語になったときのバイ ト数と実行速度が違うわけです。(CISC CPU の場合は) eor は 1 byte かせいぜい 2 byte 長の命令、moveq は 5 byte 以上ですから。 澤口@一升金 [2003/11/22 Sat 12:23:16] [221.184.149.22] 澤口@一升金です。 to yuki さん: 何が、どううまくいかないのでしょう。 ・汎用レジスタに書き込めない ・書き込んだけど読み出せない ・通信速度の設定の仕方がわからない エントリポイントとは、要するに何かの処理をするときに コールするかジャンプすることが予め決めているアドレス のことです。 C言語では関数の先頭番地のことなのですが、アセンブラで は関数単位の先頭番地でなくても呼び出せてしまうので、 「関数」とは言えないわけです。 質問者 [2003/11/20 Thu 10:57:42] [219.127.232.253] 質問が1点ありますので、回答よろしくお願い致します。 (1)以下の2つの命令の結果は同じように思えるのですが(共に32bitを0に設定) その認識で間違いないのでしょうか?違いがあるのでしょうか? ・eor.l D1,D1 ・moveq #0 , D1 yuki [2003/11/20 Thu 09:24:05] [210.81.92.130] 皆さんおはようございます。 私はH8_3687Tinyでアセンブラの勉強をしております。 質問があります 1.テーブルの使い方 例えば、汎用レジスタに格納されている情報(H'1C)を読んで、通信速度を変更したりする事は可能でしょうか? H'1C = 9600bps H'11 = 19200bps H'05 = 38400bps のような感じをテーブルを使ってみたいのです。 色々試してみましたが、うまくいきません・・・。 2.エントリーポイント($)とは何ですか? ど素人ですので、仕様書を読んでも専門用語が出てきてチンプンカンプンです。どなたかよろしくお願いします。 yuki 質問者 [2003/11/19 Wed 10:32:07] [219.127.232.253] 澤口さんへ 回答ありがとうございました。 今回も丁寧な回答で大変わかりやすかったです! 質問(4)については私のほうでもうちょっと調べてみて再度質問させて 頂くかもしれません。 よろしくお願い致します。 澤口@一升金 [2003/11/19 Wed 01:34:47] [221.184.148.116] 澤口@一升金です。 to 質問者さん: (1)MOVEQ #0 , D0 MOVEQ はQUAD BYTE,すなわち32bit 移動命令です。 D0 は 0 になります。 ちなみに、MOBVB で byte の 0 を書き込んでも D0 の 32bit はすべて 0 になります。 (2)MOVEQ #0 , D0 move.l #$00000000 ,D0 同じものですが、書式が混在するのはあまり感心しま せん。どちらかに統一するべきですね。 (3)・MOVEC ・movec アセンブラは普通、大文字と小文字を区別しませんから、 同じものです。現代的には小文字表記が普通です。 ラベルやマクロ定義を大文字で書いて地のニーモニックは 小文字で書けば、少しはソースが見やすくなります。 (4)_stack_top: move.l #_stack_top , SP 本当にこれしか書いていないとすれば、間違いであろうと 思います。_stack_top: はラベル、すなわちアドレス値 であって、命令でも何でもないですから、メモリ確保はさ れていません。 _stack_top: の前には何も書かれていないのですか? 質問者 [2003/11/17 Mon 15:24:36] [219.127.232.253] #CPUはMC68020です。 既存のソースファイルの意味を解析中なのですが、 下記4点質問がありますので、回答よろしくお願い致します。 (1)MOVEQ #0 , D0 上記の命令はD0を0で初期化している意味なのでしょうか? また、この命令後のD0は32bitすべて0になっているのでしょうか? (2)下記2つの命令は同値と考えても問題ないのでしょうか? ・MOVEQ #0 , D0 ・move.l #$00000000 ,D0 (3)下記2つの命令は同値なのでしょうか?(大文字と小文字の違いです。) ・MOVEC ・movec (4)下記の書式は問題ないのでしょうか? また、問題ないようでしたら、意味も教えてもらえますでしょうか? (スタックポインタの初期化をしているとコメントには記載されているのですが _stack_top:としただけでメモリ領域は確保されるのでしょうか?) _stack_top: move.l #_stack_top , SP 初心者なもので質問の意図がご理解頂けないかもしれませんが、(的外れな質問をしているような。。) 回答よろしくお願い致します。 質問者 [2003/11/17 Mon 10:42:03] [219.127.232.253] 澤口さんへ 回答ありがとうございました! $は16進数値である事の意味なんですね!? 初心者なもので、今後たびたび基本的な質問をしてしまうかもしれませんが、 回答をよろしくお願い致します! 澤口@一升金 [2003/11/16 Sun 03:54:47] [221.184.152.86] 澤口@一升金です。 to 質問者さん: CPUとアセンブラが何なのかわかりませんが、常識的には # ... イミディエイト値であることを宣言 $ ... 16進数値であることを宣言 ですから、 #$ .. 16進のイミディエイト値であることを宣言 となります。 0..9 までは10進表記でも16進表記でも数値表記と値は一致 しますから、どちらでも同じです。 澤口@一升金 [2003/11/16 Sun 03:48:57] [221.184.152.86] 澤口@一升金です。 gccにアセンブラを吐かせてみました。 printsに渡されるアドレスは str: ds 相対のオフセット a[]: ss 相対のオフセット です。 LC0: .ascii "ABCDEFG\12\0" .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp subl $72, %esp andl $-16, %esp movl $0, %eax movl %eax, -44(%ebp) movl -44(%ebp), %eax call __alloca call ___main movl $LC0, -12(%ebp) movb $97, -40(%ebp) movb $98, -39(%ebp) movb $99, -38(%ebp) movb $100, -37(%ebp) movb $101, -36(%ebp) movb $10, -35(%ebp) movb $0, -34(%ebp) movl -12(%ebp), %eax movl %eax, (%esp) call _prints leal -40(%ebp), %eax movl %eax, (%esp) call _prints leave ret 質問者 [2003/11/14 Fri 14:16:53] [219.127.232.253] 以下の件教えて頂けないでしょうか? <質問> (1)move.w #$0 , D0 (2)move.w #0 , D0 (1)と(2)って何が違うのですか?? 質問者 [2003/11/14 Fri 14:16:39] [219.127.232.253] 以下の件教えて頂けないでしょうか? <質問> (1)move.w #$0 , D0 (2)move.w #0 , D0 (1)と(2)って何が違うのですか?? 帰ってきた通りすがり [2003/11/13 Thu 19:58:11] [208.181.21.195] なんか変な間違いしてました。 aは定数だが、a[]はスタック上に存在。中身は{'a','b','c','d','e', '\n', 0}のコピー。 prints(a);で呼ばれたとき、stringはスタックに存在。中身はa[]のアドレス、つまりa でした。 >ただ、とくにコンパイルオプションを指定していないので、 >スタック操作(a[]の初期化)と、データの操作(str="ABCDEFG\n") >では使用するセグメントが違うはずたから、prints()を呼び出し >た時におかしくなるのでは、と思っているのですが 多分そうでしょう。 FARデータアドレッシングできるメモリモデルを選択すればいいとおもいます。 それがなければ、フラットメモリモデルを選ぶしかないです。 gccを使ったことがないので具体的な方法は不明ですが。 ビックバン [2003/11/12 Wed 23:28:16] [219.179.224.59] 澤口@一升金さん、通りすがりさん、ありがとうございます。 # といっても、まだ頭はビッグバン状態です。 # 二重投稿すみませんでした。 OSは既存のではなく、自前でブートから作っている実験的な コードです。gccを利用してプロテクトモード、ベージング機能 なしの状態です。 プロテクトモードに移行して、dsとssが異なっていると、 prints(str)かprints(a)のどちらかがうまく表示されてくれな いので、なんでかなぁと思い投稿しました。dsとssを同じにして おけばもちろん両方とも表示されます。linuxなんかでは全ての セグメントレジスタはベース0x0にしているので、そういうもの なのかなぁと思いました。 ただ、とくにコンパイルオプションを指定していないので、 スタック操作(a[]の初期化)と、データの操作(str="ABCDEFG\n") では使用するセグメントが違うはずたから、prints()を呼び出し た時におかしくなるのでは、と思っているのですが... 通りすがり [2003/11/11 Tue 19:20:23] [208.181.21.195] 修正 >stringはスタックに存在。中身は"ABCDEFG\n"のアドレス。 prints(str);で呼ばれたとき、>stringはスタックに存在。中身は"ABCDEFG\n"のアドレス。 prints(a);で呼ばれたとき、>stringはスタックに存在。中身は{'a','b','c','d','e', '\n', 0}のアドレス。 通りすがり [2003/11/11 Tue 19:15:01] [208.181.21.195] >ビックバンさん 普通に考えれば strはスタックに存在。中身は"ABCDEFG\n"のアドレス。 "ABCDEFG\n"はデータセグメント上に存在。 aは変数ではなく、ただのアドレス(定数)なのでどこにも存在しない。強いて言えばコード上にある。 {'a','b','c','d','e', '\n', 0}ははデータセグメント上に存在。 stringはスタックに存在。中身は"ABCDEFG\n"のアドレス。 となると思います。 別にdsとssが同じでも違っても関係ないです。 澤口@一升金 [2003/11/11 Tue 01:53:59] [221.184.146.79] 澤口@一升金です。 to ビッグバンさん: これは、コンパイラとメモリモデル、OSを特定していただかないと、答える方法がありません。 たしかに、かつての Turbo C などは、 auto 変数のアドレスを関 数の引数にすると ss の代わりに無関係な ds を渡すなどと言うバ グがありましたが、当然 .COM 実行ファイルなら問題ないわけです し、コンパイラオプションで強制的に ds=ss とすることもできます。 また、コンパイラによっては main 関数内の変数はスタックに割り 付けずにデータ領域に割り付ける(要するに static 宣言した変数 と同じ扱い)ものもあった気がします。 ま、実際にコンパイラをお持ちで実行できる環境があるのでしたら、 コンパイルにアセンブラソースを吐かせてそれを見るのが早いと思 いますが。 ビックバン [2003/11/09 Sun 17:08:10] [219.179.224.59] よく分からなくなったので質問します。 下のコードなんですが、 ------------------------------- void prints (char *string) { while (*string) putchar(*string++); // (a) } int main() { char *str = "ABCDEFG\n"; // (b) char a[] = {'a','b','c','d','e', '\n', 0}; // (c) prints(str); prints(a); } ------------------------------- まず確認項目として、 (a) *stringは<ds:strのアドレス>でメモリにアクセスするのか? (b) strはデータセグメント上に置かれるのか? (c) aはスタックセグメント上に置かれるのか? で、質問というのは、 このコードを正しく動くようにするには、dsとssは等しくなけら ばいけないのですか?dsとssが等しくなくても正しく動くように するには何かテクニックがあるのですか? 以上よろしくお願いします。 ビックバン [2003/11/09 Sun 17:08:06] [219.179.224.59] よく分からなくなったので質問します。 下のコードなんですが、 ------------------------------- void prints (char *string) { while (*string) putchar(*string++); // (a) } int main() { char *str = "ABCDEFG\n"; // (b) char a[] = {'a','b','c','d','e', '\n', 0}; // (c) prints(str); prints(a); } ------------------------------- まず確認項目として、 (a) *stringは<ds:strのアドレス>でメモリにアクセスするのか? (b) strはデータセグメント上に置かれるのか? (c) aはスタックセグメント上に置かれるのか? で、質問というのは、 このコードを正しく動くようにするには、dsとssは等しくなけら ばいけないのですか?dsとssが等しくなくても正しく動くように するには何かテクニックがあるのですか? 以上よろしくお願いします。 力卜 [2003/11/06 Thu 23:11:43] [192.51.44.48] To: kasiwaさん 外していたらごめんなさい。 「DiskBasic版」というのは、その本に付属してきた「Disk BASICで 実装されたアセンブラ」だと解釈しました。 また、そのBASICで書かれたアセンブラが、アセンブリソース プログラムを読み込んでアセンブルしようとするときに、 おっしゃっているエラーメッセージが表示されるということ と解釈しました。 そのアセンブラは、アセンブリソースプログラムとして以下のような BASICプログラムファイルを読み込むものなのではないのでしょうか。 10 ' mov ax,1234h 20 ' mov bx,4321h アセンブリソースとなるBASICプログラムがバイナリ形式でSAVE されているために、アセンブラはASCII形式でファイルをオープン して読み込んだが ' (REM文) が見つからない…ということに なっている気がします。 だとしたら、BASICで書かれたアセンブリソースプログラムを一旦 LOADし、ASCII形式でSAVEしなおしてからアセンブラにかければ 問題が解決しそうな気がします。 N88-BASICは知らないのですが、SAVE "aaa.bas",A とか、 LIST "aaa.bas" とかすればASCII形式でSAVEできるのでは ないかと思います。 kasiwa [2003/11/02 Sun 01:07:28] [220.96.6.170] 98ユーザーのための86アセンブリ言語入門 工学社 木原 伊都志 著 というのを買ったのですが DiskBasic版をアセンブリしようとすると Falt Rem Mark とでてしまいます。 これを回避する方法どなたかわからないでしょうか。 DiskBasicのVerは6.1です。 まつもと [2003/11/01 Sat 15:15:30] [61.203.92.78] こんにちは 松本です。 皆さんありがとうございました。時間はかかりましたが、なんとかFDDの読み込みに成功しました。 カトさん 貴重なアドバイスありがとうございます。 今はブードディスクを書いているので、とりあえず自作のAT互換機で動けば良いかと思っていますが、不具合等でましたらBIOSコールを使って互換のあるプログラムを組みたいと思います。 : |
e-mail: mist@e-net.or.jp | Structured Anchor Tree Return to Menu Return to Parent Menu |
Powered by Unit Missing Link. |