![]() |
Message Log 35 | Return to Parent Menu |
Last Updated by 07/01/05(Fri) |
| |||
やっぱり 2002 年もアセンブラッ!!だねっ・・・て、こればっかり (^^; |
| |||
| |||
: rx78 [2002/04/29 Mon 10:43:57] [218.47.45.45] 澤口@一升金さん、URLありがとうございます。 欲しかった情報そのものズバリです。 さあ、逆汗がんばるぞー! もえ [2002/04/28 Sun 19:31:55] [218.228.63.224] もえです。 MM-santaさん、澤口@一升金さんレスありがとうございます。 MM-santaさん: すぐに確認できないので後でご報告いたします。 アドバイスありがとうございました。 澤口@一升金さん: ライブラリに関してですが、たとえば次のコードをコンパイルした んですが void main() { test(); } 逆アセンブラしてもとくにランタイムライブラリなどを呼ぶよう なコードは生成されていないので標準のライブラリをリンクする ことなくできるのではないかと考えられるのですがいかがでしょ うか。(特にリンク時にエラーが表示されることもないようです) 澤口@一升金 [2002/04/28 Sun 14:35:00] [61.197.17.91] 澤口@一升金です。 to rx78さん: x86 のハンドアセンブル用のニーモニック表はわたしも見たこと ありません。 強いて言えば、これかな。 ↓ http://www.sandpile.org/ia32/index.htm MASM やその互換品(Arrowsoft Assemblerなど)はフリーのものが入 手できますから、そちらを使用した方が早いと思うのですが。 MASM のダウンロード ↓ http://www.easystreet.com/~jkirwan/pctools.html 澤口@一升金 [2002/04/28 Sun 13:59:00] [61.197.17.91] 澤口@一升金です。 to もえさん: C言語の main ルーチンはアセンブラから直接呼び出しても 正常動作しません。 意識することは少ないのですが、実際には main ルーチンの 前に C言語用のスタートアップルーチンがリンクされて実行 されています。 LIB ディレクトリにある C0*.OBJ がそれにあたります。 ソースは C0.ASM で、これはたぶん LIB\STARTUP にあると 思います。(Turbo C++ 4.0 で確認しました) ソースを読むとこの中でヒープポインタの設定やスタックポ インタの調整、数値演算プロセッサの検出などを行っている のがわかると思います。 いきなり main を呼び出すとここらの設定がされないままに なりますので、不具合がでます。 どうしても呼び出したければスタートアップルーチンを書き 換えるか、 DOS の Child Process を使って間接的にC言語 の EXE を実行させることになります。 MM-santa [2002/04/28 Sun 11:33:38] [203.141.139.213] >もえさんへ 下のカキコミだけでは不十分かなと思ったので追加書込みです。 もし、時間があるようでしたら、次の2点のチェックも やって見てほしいのですが。 (1) 「hello: db 'Trial and Error.', 0x0d, 0x0a, '$'」の '$'を16進(0x24?)で定義し直してみる。 (2) start: ; Init registers mov ax, data mov ds, ax mov es, ax <−追加 mov ax, stack mov ss, ax MM-santa [2002/04/28 Sun 10:12:50] [203.141.139.213] >もえさん > _test: > ; Show 'A' > mov ax, 0x0e41 > int 0x10 > ret を以下のように修正してテストしてみるのも 1つのデバッグ方法かなと。 _test: ; Show 'A' mov ax, 0x0e41 mov ax, 1234h ret MS-DOSやBIOSの割込みで、registerの値が 壊れる場合があった気がするのですが。 他人が作成した関数・機能を呼出す前に、 壊されて欲しくないregister・変数は、 退避するように習慣付けて置くのも必要だと 思います。 rx78 [2002/04/28 Sun 09:57:45] [218.47.44.223] PC/AT互換機、Win95のDOSモードで動作するジョイスティック読み取りのための常駐COMがあるのですが、これを改造して自分のジョイスティックに対応させたいので、ハンドアセンブルして直接書き換えたいのです。 ソースコードも公開されてはいますが、MASMも紛失してしまったので、直接書きかえるしかありません。 ハンドアセンブルのためのニーモニック表を検索したのですが、なかなか見つかりません。どなたかURLをご存じの方、教えてください。 rx78@hyper.cx もえ [2002/04/28 Sun 08:26:56] [218.228.63.251] もえです。 kattyoさん、MM-santaさんレスありがとうございます。 >このEXEモジュールは、エラー無しで正常に作成されている >のでしょうか? >それとも、EXEプログラムが上手く動作しないということ >なのでしょうか? 下に書き込んだものは結構いろいろ弄ったあとなので状況が変わ っていますが、BIOSコール・MS-DOSコールが正常に動作しなかっ たりします。たとえば call _main のあとでint 0x21, ah=0x09 のMS-DOSファンクションを実行すると$文字で表示が停止しなか ったりします。 ランタイムライブラリは使っていないのでlibのリンクをせずに NASMとBCCだけで挑戦していますが...うまくいっていません。 よく見たら4/25のふうさんの内容につながっていますね。(^^; MM-santa [2002/04/28 Sun 06:58:57] [203.141.139.213] > NASMのスタートアップコードを書き、Cのmain()を呼び出すDOS > EXEをALINKで生成したいと考えておりますがうまくできません。 はじめまして、もえさん このEXEモジュールは、エラー無しで正常に作成されている のでしょうか? それとも、EXEプログラムが上手く動作しないということ なのでしょうか? kattyo [2002/04/28 Sun 02:24:29] [61.198.126.150] >あと、main() で実は引数として argc,argv,env を仮定して >コンパイルされていて、call _main の次に add sp,xxx が必要だとか。 すいません馬鹿なこと書いてました。忘れてください。 kattyo [2002/04/28 Sun 00:38:08] [61.198.126.150] どちらの処理系もいじっていないので詳しいことは わからないですが・・・。(特にBCC) コンバインクラスを同じ名前にしていないとか、 その辺ではないでしょうか。 あと、main() で実は引数として argc,argv,env を仮定して コンパイルされていて、call _main の次に add sp,xxx が必要だとか。 もえ [2002/04/27 Sat 23:38:18] [218.228.63.240] はじめまして。 Borland C++ 4.0J + NASM + ALINKで試行錯誤しているんですが、 うまくいかずご意見をお伺いしたいと思っております。 NASMのスタートアップコードを書き、Cのmain()を呼び出すDOS EXEをALINKで生成したいと考えておりますがうまくできません。 main.c ---------------------------------------------------------- void main(); extern void test(); void main() { test(); } ---------------------------------------------------------- start.asm ---------------------------------------------------------- [extern _main] [segment code] global _test ..start: ; Init registers mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, stacktop call _main ; Show string mov dx, hello mov ah, 09h int 0x21 ; Exit mov ax, 0x4c00 int 0x21 _test: ; Show 'A' mov ax, 0x0e41 int 0x10 ret [segment data] hello: db 'Trial and Error.', 0x0d, 0x0a, '$' [segment stack stack] resb 0x100 stacktop: ---------------------------------------------------------- 考え違いをしているかもしれませんがなにかアドバイスをいただ ければありがたいです。 tanu [2002/04/26 Fri 23:05:49] [218.218.33.211] 澤口@一升金さま アドバイスありがとうございます。 アセンブラに精通されている方からのアドバイスですので、 きっと間違いないと思います。 教えていただいた本を購入したいと思います。 tanu [2002/04/26 Fri 23:05:43] [218.218.33.211] 澤口@一升金さま アドバイスありがとうございます。 アセンブラに精通されている方からのアドバイスですので、 きっと間違いないと思います。 教えていただいた本を購入したいと思います。 澤口@一升金 [2002/04/26 Fri 13:14:23] [61.197.17.166] 澤口@一升金です。 to tanuさん: こちらの参考書がまだ取り寄せ可能です。 ↓ http://www.cqpub.co.jp/hanbai/books/32411.htm あとは、まぁ Web 検索で見つけるとか。 ↓ http://www.geocities.com/SiliconValley/Peaks/3938/z80_home.htm tanu [2002/04/25 Thu 22:54:55] [218.218.33.211] はじめまして。 こちらに書いていいものかどうか迷ったのですが、 もし不適切であれば、管理人さん、削除お願いいたします。 このたび、仕事でZ80アセンブラを覚えないといけなくなりましたが、 本屋さんで探しても、わかりやすそうな本がなく、 インターネットで検索しても、ほとんどが絶版とか。。。 あるHPで、”Z80ファミリハンドブック”というのが、 初心者にはよい!とかいてあったのですが、 どなたか譲って下さる方はいませんでしょうか? できれば2000円以内でと思っているのですが、 もし譲ってくださる方がいらっしゃれば、 ぜひメールをいただけたらと思います。 よろしくお願いいたします。 ふう [2002/04/25 Thu 20:37:06] [210.230.102.81] >デイレルさん それは標準ライブラリもROM_BIOSを使うということでしょうか。 たぶん無いような気がします。 ただ、Cコンパイラが使えればいい、ライブラリは自分で作ると いうことなら、Cへ繋ぐスタートアップを自分でつくれば、non-OS のCプログラムも作れますが。 とうます [2002/04/19 Fri 23:19:08] [61.122.47.229] はじめましていろいろ面白い話を読ませて頂きました。 インスピレーション(というほどではないが)を感じたので、 ちょっと遊んでみました。 linuxでアセンブラで"hello\n"出してみました。 下記hello.Sをas -o hello.o hello.S ; ld -o hello hello.oで アセンブルリンクして実行してみたところうまくいきました。 実行ファイルのサイズは834byte、stripすると492byte、 ELFヘッダ以外にもいろいろくっついてしまうみたいです。 それでも十分に小さいのですが。 hello.S: .section .rodata hello: .string "hello\n" .section .text .globl _start _start: lea hello, %ecx mov $6, %edx mov $4, %eax int $0x80 xor %ebx, %ebx mov $1, %eax int $0x80 ret むふふ [2002/04/17 Wed 16:20:07] [202.214.235.134] IBM大型汎用機のアセンブラなら詳しいのですが・・・用はないですね KaoriMochida [2002/04/11 Thu 13:15:45] [61.122.184.147] 返事が遅くなりまして申し訳有りません。 > (多分)動きますよ。それが一番安全でしょう。べつに98エミュでもなんでもいいで > しょう。 > ただし、エミュレーター上でアセンブルするのが普通だと思いますが……。 ご回答ありがとうございました。 dosemuで試してみたいと思います。 デイレル [2002/04/03 Wed 15:40:13] [218.223.109.16] 初めて書き込ませていただきます。 現在AT互換機で作動するnon-OSのプログラムを作成中ですが、 OSのシステムコールが利用できないためROM-BIOSに頼っています。 そこで質問なのですが、 Windows上(またはDOS上)で作動するCコンパイラで、 DOSのシステムコールを利用せずROM-BIOSのコールのみの 実行ファイルを作成してくれるものはありますでしょうか? 現在はTurboC++Ver5.0からTASMを利用して、 オールアセンブラで作成しています。 有り得ない話しかもしれませんが、ご存知の方いらっしゃいましたら よろしくお願いします。 力卜 [2002/03/26 Tue 08:18:53] [202.248.54.152] 私はDDKを使ったことないんですが、以下のページ(掲示板)では 主にデバイスドライバについて議論しています。 電脳職人フォーラム http://www.ouk.co.jp/ogawa/sforum/oldlog.html お仕事でしたら書籍、雑誌などを買われればと思うのですが。 NATOラー [2002/03/18 Mon 17:13:18] [210.143.35.18] (初書)数年ぶりにプログラム開発に復帰したが、入出力ポートへのI/O命令が実行されない。 調べてみたら、WindowsNT、Windows2000ではDDKを使わないとダメだとか... あっちこっち、調べているけど、Microsoftの文献は英語だし、よくわからない。 開発費用がないため、自分がやるしかない。誰かDDKを教えて〜。 かちゅや [2002/03/15 Fri 22:09:44] [131.206.4.132] >力卜さん ありがとうございます。おっしゃるとおりでした。 このバグに4日ほど悩んでおりましたが、おかげで解決です。 なぜ、ローカル変数の領域が4の倍数にならなかったかといいますと、 BITMAPFILEHEADER構造体をスタック上に確保したために起こってい たようです。この構造体の大きさが14Byteでした。 高級言語はこんなところにも気を配っていたんですね。 力卜 [2002/03/15 Fri 12:36:45] [192.51.44.18] ESPの値が一時的に 4の倍数ではなく、2の倍数になりますね。> sub/add esp,043ah 動作確認はしてませんしハズレかも知れませんし想像ですが、Windows2000が この状態を意識的に検出しているんじゃないでしょうか。 043Ah の値の由来/目的がわからないですが、4の倍数の 043Chとかではどうでしょうか? 「インテル・アーキテクチャ・ソフトウェア・ディベロッパーズ・マニュアル 上巻:基本アーキテクチャ」の「スタックのアライメント」の節に関連しそうな ことが載っていました。適当に解釈して書き直すと、 ● ESP(またはSP)によるスタックのアクセス(push/popなど)は、ダブルワード (4バイト)境界に(またはワード(2バイト)境界に)揃えなくてはならない。 具体的には、スタックセグメントのディスクリプタの Dフラグが幅32ビットを 示すのならダブルワード境界に、幅16ビットを示すならワード境界にすべき。 ↑「スタックのアライメント」の次節の「スタック・アクセスにおけるアドレス・ サイズ属性」をよく読むとわかりますが、スタックポインタにESPを使っている Win32では、ディスクリプタの定義は32ビット幅となっているハズです。 ● しかし、CPUは境界チェックを行わないので、境界を適切に維持するには システム(ソフト)側でチェックを行う必要がある。 ↑このチェックを、パフォーマンス優先(checkせず)の Win9xではしてなくて、 安定性優先の Win2000ではしていると想像しました。 多分、Win32APIの先(OS内部)でチェックしているんじゃないでしょうか。 ● 境界があっていないと、処理能力の低下ばかりでなく、場合によっては プログラムの動作に問題が起きる恐れがある。 正確な説明は上記の文書の該当節をご参照くださいませ。以上です。 かちゅや [2002/03/14 Thu 20:34:32] [131.206.4.132] すみません。不思議なエラーで困っています。 以下のソースをアセンブルして実行すると、 「メモリ ロケーションへのアクセスが無効です。」 というエラーが発生します。スタックオーバーフローかと思ったのです が、不思議なことにLOCVALを0や1000hにするとエラーになりません。 さらに、Windows95では正常終了しWindows2000では上記のエラーが発 生します。 ; MASM : ml fe.asm /link /SUBSYSTEM:WINDOWS ; TASM : tasm32 fe & ilink32 -aa fe .386 .model flat, stdcall ifdef ??version ; for TASM includelib import32.lib else ; for MASM ; パスは各環境に合わせて書き換えてください includelib "C:\Program Files\Microsoft Visual Studio.NET\Vc7\lib\kernel32.lib" includelib "C:\Program Files\Microsoft Visual Studio.NET\Vc7\lib\user32.lib" CreateFileA equ CreateFileA@28 GetLastError equ GetLastError@0 FormatMessageA equ FormatMessageA@28 MessageBoxA equ MessageBoxA@16 LocalFree equ LocalFree@4 endif extrn CreateFileA:near extrn GetLastError:near extrn FormatMessageA:near extrn MessageBoxA:near extrn LocalFree:near GENERIC_READ = 80000000h OPEN_EXISTING = 3 FILE_ATTRIBUTE_NORMAL = 000000080h FORMAT_MESSAGE_ALLOCATE_BUFFER = 00000100h FORMAT_MESSAGE_IGNORE_INSERTS = 00000200h FORMAT_MESSAGE_FROM_SYSTEM = 00001000h MB_OK = 0 SUBLANG_DEFAULT = 001h LANG_NEUTRAL = 0 .data AppTitle db 'test application',0 szBitmap db 'test.bmp',0 lpMsgBuf dd ? .code LOCVAL = 043ah ;1000h start: sub esp,LOCVAL ; ファイルを開く push 0 push FILE_ATTRIBUTE_NORMAL push OPEN_EXISTING push 0 push 0 push GENERIC_READ push offset szBitmap call CreateFileA add esp,LOCVAL ; エラーコードを得る call GetLastError ; エラーコードからエラーメッセージを得る push 0 push 0 push offset lpMsgBuf push (SUBLANG_DEFAULT shl 10) or LANG_NEUTRAL push eax push 0 push FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS call FormatMessageA ; エラーメッセージの表示 push MB_OK push offset AppTitle push [lpMsgBuf] push 0 call MessageBoxA push [lpMsgBuf] call LocalFree ret end start どなたか原因を教えてください。 1B62h [2002/03/10 Sun 16:43:43] [61.209.221.56] アセンブラの危険性の話になっていますが、私は、古い98パソコンをアセンブラ用に割り当てています。で、javaやVC++などはwindowsでしています。アセンブラ専用のマシンをつくれば、ハードを叩き壊すぐらいのつもりで安心していじれると思います。デュアルブートでも、起動フロッピーでも、ハードディスク破壊しちゃったらやっぱりだめになってしまうでしょうし。 >kattyoさん 秋葉原はかなり遠いです。あと10年早く生まれていたらもっと情報もたくさん得られただろうに、と思います。 >かちゅやさん 理由はよくわからないけど、retで終わるより、mov ax=4c00 int 21 で終わるようにしたほうがよさそうなので、やっぱりそうします。 Tsuyoshi [2002/03/10 Sun 08:13:38] [61.123.219.125] Tsuyoshiです。 でしゃばり過ぎて、ヘンな事書いてました・・・。 > > (アセンブルって結構危険な行為なのでしょうか) > > 結構言えてるかもしれません。 ↑何か、この返答は間違ってたようです。 後から、なべちゃんさんが指摘してくださって、 はたと気づきました。ありがとうございます。 ・・・ええと、ここの部分を訂正しますと、 『自分でマシン語を書いて、 それを "実行させる行為" は、 実行するハードウェアに結構危険が伴う行為』、というのは、 結構言えてるかもしれません・・・です。 でも、そんなの恐れてたんじゃ、 アセンブラはできないんですね。->なべちゃんさん C言語も、結局はこれと同じですね。 なべちゃん [2002/03/09 Sat 15:15:23] [202.236.152.84] >diskcopyコマンド、dumpコマンド等のディスクアクセスのコマンドを使用しない限り >ただ単にアセンブリ言語のプログラミングの学習をするだけなら余程の事が無い限り大丈夫という事ですね。 はて????? dumpコマンドとアセンブラがどう繋がるのか意味がよく分からないのですが。 アセンブラを使う分には、どんなことをしても(程度の差はあれ)適当に危険です。 プログラムがバグにより暴走すれば、メモリ上の何だとも分からないデータをプログラムとして 実行しますからどんなことでも起こりえます(可能性として)。 >素人考えでスイマセン。douemu上ならDOSのプログラムが動くかも… (多分)動きますよ。それが一番安全でしょう。べつに98エミュでもなんでもいいでしょう。 ただし、エミュレーター上でアセンブルするのが普通だと思いますが……。 KaoriMochida [2002/03/09 Sat 00:33:19] [61.122.184.246] > アセンブル行為自体はどんな状況でやろうとも害はないのでは? すいません。トンチンカンな事を申してたかもしれません。 diskcopyコマンド、dumpコマンド等のディスクアクセスのコマンドを使用しない限り ただ単にアセンブリ言語のプログラミングの学習をするだけなら余程の事が無い限り大丈夫という事ですね。 > 意味が分からないです。DOSのプログラムをUNIX上で実行??? > もしそうなら不可能な気が…… 素人考えでスイマセン。douemu上ならDOSのプログラムが動くかも… と思いました(都合良すぎ!?)。 なべ@abk [2002/03/08 Fri 17:48:33] [202.236.152.84] >Unix系のOSで一般ユーザ権限でアセンブルするとは >大丈夫なんですよね。 アセンブル行為自体はどんな状況でやろうとも害はないのでは? 意味が分からないです。DOSのプログラムをUNIX上で実行??? もしそうなら不可能な気が…… KaoriMochida [2002/03/08 Fri 05:27:12] [61.122.184.246] しつこくて申し訳有りません。 Unix系のOSで一般ユーザ権限でアセンブルするとは大丈夫なんですよね。 (nasmかdosemu+masmになるのでしょうが…) もし、Unixとかでも再起不能の可能性があるならWindows2000かWindows98で覚悟してアセンブルするようにします。 かちゅや [2002/03/05 Tue 15:23:29] [131.206.4.132] > なべ@abkさん >>retで終了できるのはMicrosoftの粋な計らい(?) >たしかCP/M互換なだけではなかったかな? なるほど、そうだったんですか。勉強になります。 > 1B62hさん jmp $+2についてですが、トランジスタ技術スペシャルを読んでみたところ、 EPSONの一部機種を除いて必要ないようです。 Tsuyoshi [2002/03/05 Tue 13:54:51] [61.123.219.125] 僕は、実のところ、 なべちゃんさんがおっしゃるような事が起こるのが恐いので、 ディスク操作には、手を出してないです。 それにしても、アセンブラによるプログラミングって、 > >アクセスランプが点灯したままでフリーズしたことが > そんなことしょっちゅうしょっちゅう(笑) > ディスクを飛ばしたことはないけどディスクが飛ぶ事ぐらい > 覚悟してます。 ・・・大いなる覚悟が必要になる行為なんですねえ。 僕は、単なる卓上の計算くらいしかさせませんから、 全然知りませんでした・・・・。 ----- > 皆様はデゥアルブートとかにしていて > アセンブル行なう時にはアセンブル専用のOSに > 切り替えて学習しているのでしょうか? 僕の場合は、一番自由度が高いからという理由で、 アセンブル・実行は Windows95のスタートアップメニューにある "Command prompt only"モードで行っております。 でも、こんな話を聞くと、ディスク操作には、 やはり覚悟が必要のようです。 MS-DOSはWindowsみたいにプロテクトしてくれないし・・・。 kattyo [2002/03/05 Tue 04:45:51] [202.18.170.10] http://www.abk.nu/~kattyo/ >>1B62h さん 最近では 98 の本も減ってきてますね。 関東近辺にお住まいでしたら、秋葉原の ・LAOX The Book 館 ・書泉ブックタワー (秋葉原駅昭和口方面南の交差点) ・大き目の電気屋の本屋 ・ラジヲデパート ・とにかく大き目の本屋 などには 98 の資料などがまだある場合があります。 あとは、地方でも電気屋に付属している本屋や大き目の本屋に行けば おいてある場合もあります。 あとは、詳しい解説が少ないですがトランジスタ技術スペシャル にも98の BIOS や I/O 等についてかかれているものがあります。 例:トラ技スペシャルNo.45 PC98シリーズのハードとソフト KaoriMochida [2002/03/05 Tue 03:55:59] [61.122.184.146] 皆様、ご回答ありがとうございます。 通常、C言語とかの学習をする時にはそれ専用のOSで起動し直して学習するような事はせず日常に使用しているOSにコンパイラをインストールしてプログラミング学習していますよね。C言語で余程の事が無い限りOSが再起不能になる事は無いと思いますので… > 通常アセンブラを行うときには・・・なんですが、 > 僕が学習するときは、ディスクの直接操作等を : > もしそれでOSが立ち上がらなくなったら、 > 再インストールするべし。 そうしますとアセンブラを使用する為には起動不能になってもいいようなOS(Win98、Win2k)をわざわざ用意するしかないのですね。 といいますのは 万一、再起不能になったらWin2kの再インストール・セッティング(office、visualC++、秀丸、等々のアプリのインストール・カスタマイズ作業)が非常に面倒なので… 皆様はデゥアルブートとかにしていてアセンブル行なう時にはアセンブル専用のOSに切り替えて学習しているのでしょうか? なべ@abk [2002/03/05 Tue 03:12:58] [61.201.88.81] あと一個。 >retで終了できるのはMicrosoftの粋な計らい(?) たしかCP/M互換なだけではなかったかな? プログラマーズリファレンスなどでretやjmp 0での終了ではなく 「int 21h/ah=4ch使用するべである」とされていますので。 なべ@abk [2002/03/05 Tue 03:09:06] [61.201.88.81] >アクセスランプが点灯したままでフリーズしたことが そんなことしょっちゅうしょっちゅう(笑) ディスクを飛ばしたことはないけどディスクが飛ぶ事ぐらい覚悟してます。 FDで実行しようが、HDDを認識してる限り無意味なので 本気で心配ならディスクを引っこ抜きましょう。 かちゅや [2002/03/05 Tue 01:18:25] [131.206.4.132] 50000ゲットスザー..... 卑怯くさい方法で、50000ゲットしちゃいました。 かちゅや [2002/03/05 Tue 01:13:35] [131.206.4.132] > KaoriMochidaさん > アセンブルって結構危険な行為なのでしょうか 脅かすわけではないのですが、初めて読む486という本のコードを実行させたときに、ソースの入力ミ スでプログラムが暴走したのですが、ディスクアクセスしないプログラムのはずなのにハードディスク のアクセスランプが点灯したままでフリーズしたことが何度もあります。当時、現役のマシンだったの で冷や汗たらたらです。(その後のscandiskでは何の異常も見つかりませんでしたが...) > 1B62hさん > モード0のカウント終了時での割り込みというほうが... 最初はそれで作っていたんですが、カウンタに設定できる値が16Bitなので割り込み発生までの時間が 最大約26mS(10MHz系)にしか設定できず、あっという間にコマンドラインに戻ってしまったため、レー トジェネレータの設定に変えて割り込み処理ルーチンでカウントさせるようにしました。 (割り込み処理ルーチンでタイマの再設定をするのがめんどくさかっただけです。) > 方形波ジェネレータやソフトウェアトリガードストローブ... 詳しいことは知らないのですが、モード3はBEEP音の発生に使われているのではないでしょうか。モー ド4は98ではモード2と全く同じ動作になるようです。使い方については、使いやすそうなのを使えば いいと思います。 > ラッチ(latch=掛け金?)ってどういう意味ですか? > カウンタの値なんかを動かなくするということなのかな? 一般的にはそのとおりです。出力が変化しなくなると考えていいでしょう。 > .comや.exeなどをCALLしている、という解釈で... そういう風に考えたことは無かったです。でも、確かにint main();をcallしているのと同等の動作です。 個人的なことですが、retで終了できるのはMicrosoftの粋な計らい(?)と思っていました。 > jmp$+2というのはnear扱い=3バイトになってうまく動作しないようです。 やっとアセンブラ関係のレス(^^;) 結論から言うと、距離指定のshortを使って"jmp short $+2"でちゃんとアセンブルされます。僕が使っ ている某ランドのTurboAssemblerはできるだけ短い命令を生成しようとするので、何も指定していませ んでした。 1B62h [2002/03/04 Mon 19:49:27] [211.8.49.4] タイマ割り込みの件ですけど、割り込みモードの設定のところ、77hに00110100bを出力している所についてちょっと疑問があります。 bit7〜4,0については意味も効果もわかるのですが、bit3〜1のモード設定がモード2のレートジェネレータになっているんですけど、モード0のカウント終了時での割り込みというほうが、名前からすると目的に近そうに思えます。 ほかの、方形波ジェネレータやソフトウェアトリガードストローブというのも含めて、どういういうものでどういうときに使うのかということについて教えていただけないでしょうか? あと、ラッチ(latch=掛け金?)ってどういう意味ですか?カウンタの値なんかを動かなくするということなのかな?という風に考えていますが・・・アセンブラの話でなくてすみません。 >かちゅやさん DOSのコマンドラインインタプリタも実行中のプログラムですから、.comや.exeなどをCALLしている、という解釈でよろしいでしょうか?それと、プログラムをnasm用に書き換えてアセンブルしてみて気がついたんですが、jmp$+2というのはnear扱い=3バイトになってうまく動作しないようです。 Tsuyoshi [2002/03/04 Mon 18:44:50] [61.123.219.125] Tsuyoshiです。 通常アセンブラを行うときには・・・なんですが、 僕が学習するときは、ディスクの直接操作等を 扱うプログラムは作らないので、 何にも気にせず、やっています。 気にするのは、コードミスくらいです。 >「この章ではメモリの内容を直接に書換えたり、 > ディスクへの書き込みを行なったりしますので > 必ずバックアップを取ったディスクを使用してください。」 しかしこういう場合は注意が必要です。 > (アセンブルって結構危険な行為なのでしょうか) 結構言えてるかもしれません。 ミスったとき、取り返しがつかなくなる、 つまり、ディスク上のデータ構造が壊れてしまいます。 メモリに関しても同じ事が言えます。 メモリはよく分かりませんが、 ディスクのデータが壊れると誰が考えても 危険なことですので、 "自分のデータだけ"をバックアップするのがいいと思います。 要するに、自分のプライベートなデーターだけを 保護しておけばよいということです。 もしそれでOSが立ち上がらなくなったら、 再インストールするべし。 ------ > (ちゃんと収まるかわかりませんが…) 再インストールの方が楽に終わります。 > C:> A: > A:> notepad.exe ex1.txt > とAドライブに移動してそこでエディタを立ち上げ、 > コーディングしてアセンブル・リンクしていけば > Cドライブのシステムを壊す事は無いのでしょうか? それは・・・勘違いです。 操作する対象になるディスクは、 プログラム自身に書かれてありますから、 プログラムの保存場所の移動とは、 関係ないんです。 → プログラムが"正確"で、かつ"正当なもの"なら、 データを破壊するようなことはないでしょう。 恐いのは、人の手なんです。 KaoriMochida [2002/03/03 Sun 14:24:12] [61.122.184.161] 度々 初心者的質問で申し有りません。。 アセンブリ言語の学習法についてお伺い致します。 はじめて読む8086を拝見しながらWindows2000を使用してアセンブラを学んでいます。 この本に 「この章ではメモリの内容を直接に書換えたり、ディスクへの書き込みを行なったり しますので必ずバックアップを取ったディスクを使用してください。」 と書いてあるのを見てちょっと不安になりました。 (アセンブルって結構危険な行為なのでしょうか) 通常アセンブラの学習を行なう時にはフロッピーに C:\WINNT\system32の*.exe、*.comファイルをコピーするのでしょうか? (ちゃんと収まるかわかりませんが…) その後、フロッピードライブがAドライブだとすると C:> A: A:> notepad.exe ex1.txt とAドライブに移動してそこでエディタを立ち上げ、コーディングしてアセンブル・リンクしていけばCドライブのシステムを壊す事は無いのでしょうか? 分からない事ばかりで申し訳有りません。 かちゅや [2002/03/02 Sat 00:44:13] [131.206.4.132] >1B62hさん >プログラムってretで終わることもできるんでしょうか? com実行ファイルはretで終わることができるんです。ただしCSレジスタ が実行時のままであることが条件です。この時、スタックのトップに 0000hが積まれていて実行がCS:0000に移るんですが、そこにはOSによ ってint20hの機械語が書き込まれているんです。だからちゃんとプロ グラムは終了します。もちろんMS-DOSの話です。 関係ありませんが、Win32のプログラムもretで終了できます。 > jmp $+2 この場合は必要なかったりします。(ぉぃ 周辺LSIがCPUのスピードについてこれない事が無いようにウエイトを 入れるためにあるのですが、jmp$+2を使わなくて困ったことは一度も 無いです。でも、なんとなく入れています。 1B62h [2002/03/01 Fri 20:28:38] [211.8.49.4] >kattyoさん リンク先を見てみました。なかなかわかりやすいです。ありがとうございます。ただ、本はどんなのがあるかということは少し知っているのですが、どこにあるのかがさっぱりわからないのです。 >かちゅやさん ソースまでわざわざありがとうございます。まだ吟味していないのですが、眺めてみたら大体どんなことをすればよいのかわかりました。 ところで、プログラムってretで終わることもできるんでしょうか?(このソース、retで終わっているんですよね?違うかな?)それと、jmp $+2って何のためにあるんですか?一応これからじっくり考えてみます。 とりあえずはお礼まで。お二人ともありがとうございました。 : |
e-mail: mist@e-net.or.jp | Structured Anchor Tree Return to Menu Return to Parent Menu |
Powered by Unit Missing Link. |