![]() |
Message Log 37 | Return to Parent Menu |
Last Updated by 07/01/05(Fri) |
| |||
やっぱり 2002 年もアセンブラッ!!だねっ・・・て、こればっかり (^^; |
| |||
| |||
: Xeno [2002/11/25 Mon 22:37:25] [61.196.124.63] Rastivさん、カトさん、素早いレスありがとうございます。 昨日の夜中にRealTimeClockInterruptに関するサンプル(それらしいものを片っ端からダウンロードしました)を見つけ、 今日一日中没頭していました。 一番参考になりそうなのはつぎのサンプル?(英語で細かく説明してあって重宝しそうです) http://www.albe.bbk.org/hardware/pctim003.zip 結局はまだ出来てないんですけどね。(^_^;) なぜか55msで動いてしまう...??(976usの予定なのに) カトさんへ ソースコードを載せていただいてありがとうございます。 2msなら全然問題ありません! NASMでもMASM,TASMとほとんど 違いはないので十分読めます。 おもいっきり参考にさせていただきます。 Rastivさんへ そのサイトは知りませんでした。 なんかこまめに更新されているみたいですね。 RTC,PICのことも書いてありました!(ほかにもいろいろと...) The Art of Assembly Languageみたいな感じですね。 ありがとうございます。 役に立ちそうです。 本格的にアセンブラを使うのは久しぶりです。 たまにインラインアセンブラを使うぐらいでフルアセンブラは ここ数年書いたことなかったです。(Windows95が出たあたりからWinアプリばっかで...) 5年ほど前に購入したTASM5.0が活躍中です。(なぜかMASMも使っているんですけどね。) やっぱりアセンブラはおもしろい!(でもDOSしか出番が無い! アセンブラでWinアプリを作る気には到底なれないし) 当分没頭しそうです。(没頭=当然寝不足に...(;_;) ) Rastiv [2002/11/25 Mon 18:05:02] [211.8.106.9] Rastiv です。 Xenoさんへ。 AT互換機のことについてのサイトがあるので紹介しておきます。 皆さんもご存知かもしれませんが・・・。 ”OS resource center ” http://www.nondot.org/~sabre/os/articles 英語で書かれてて読みにくいのですが、 互換機について知りたいものは何でも置いてそう・・・。 力卜 [2002/11/25 Mon 12:25:33] [192.51.44.13] Xenoさん、こんにちは。自作のソフトに 55ms のシステムタイマを 約2ms に変更する ものがありますので、そのソースから抜粋しました (例によってnasmソースです)。 割り込みベクタの設定などに DOS call を使っていますが、DS = 0 として直接割り込み ベクタをアクセスしてもよいと思います。英語のコメントはいいかげんに書いてあります。 過去に見たソースには、律儀にPICでタイマ割り込みを一時的に無効にしておいてから PITカウンタを設定し、またPICでタイマ割り込みを有効にするというものがありましたが、 私のアプリでははしょってあります。でもちゃんと動作しているので問題ないのかな? そのDOSアプリは、Windows9x、Windows2000などでもうまく動作しています。 不明な点は質問してください。 ; PC/AT system timer example PICCTL equ 20h ; master 8259A control port PICDTA equ 02h ; master 8259A data port PITCTL equ 43h ; 8253 control port PITDTA0 equ 40h ; 8253 data port PICMSK equ 01h ; master IRQ0 interrupt mask EOI equ 20h ; end of interrupt ; segment DATASEG ; ワークエリア用のセグメント align 2 PITCNT dw 0 ; PITカウント値の累積カウンタ ; segment CODESEG ; コード用のセグメント align 4 OLDTMRV dd 0 ; 旧ベクタ値の保存用ワークエリア ; SETTMR: ; PITのタイマーを2[ms]に設定 ; PITカウント用ワークエリアを初期化。最初は累積カウントをゼロとする。 mov word [PITCNT],0 ; 旧ベクタの退避 mov ah,35h ; - MS-DOS - get interrupt vector: 0x35 mov al,08h ; AL = vector: 0x08 (system timer interrupt) int 21h ; OUTPUT es:bx ... address of interrupt mov [cs:OLDTMRV+0],bx mov [cs:OLDTMRV+2],es ; save original timer interrupt vector ; 新ベクタの設定 push ds push cs pop ds mov dx,NEWTMRV mov ah,25h ; - MS-DOS - set interrupt vector: 0x25 mov al,08h ; AL = vector: 0x08 (system timer interrupt) int 21h ; INPUT ds:dx ... address of interrupt pop ds ; PITのカウント値の設定 cli mov al,36h ; pulse wave (mode3) out PITCTL,al mov ax,2386 ; 1,193,180[Hz] * 0.002[s] = 2386.36[cnt] out PITDTA0,al mov al,ah out PITDTA0,al sti ret ; RESETTMR: ; PITのタイマーを既定値 (0x0000 ==> 65536) に設定 ; PITのカウント値の設定 cli mov al,36h ; pulse wave (mode3) out PITCTL,al xor ax,ax ; 1,193,180[Hz] * 0.05492[s] = 65536[cnt] out PITDTA0,al mov al,ah out PITDTA0,al sti ; 旧ベクタを復元 push ds lds dx,[cs:OLDTMRV+0] mov ah,25h ; - MS-DOS - set interrupt vector: 0x25 mov al,08h ; AL = vector: 0x08 (system timer interrupt) int 21h ; INPUT ds:dx ... address of interrupt pop ds ret ; 割り込み処理ルーチン NEWTMRV: pushf sti ; 割り込み許可 (割り込み禁止ではないよ) push ax push ds mov ax,DATASEG mov ds,ax ; ワークエリア用データセグメントの設定 ;; ;; !!! 処理を記述する。フラグを立てるだけなど、できるだけ、軽い処理とする。!!! ;; mov ax,[PITCNT] add ax,2386 ; PITに設定したカウント値を加算 mov [PITCNT],ax jc NEWTMRV1 ; 累積したPITカウント値が65536を超えないので、自分で割り込み処理を終了する。 pop ds mov al,EOI out PICCTL,al pop ax popf iret NEWTMRV1: ; 累積したPITカウント値が65536以上になった(約55ms経過)ので、 ; 55ms毎に実行されるべき、オリジナルの割り込み処理ルーチンに制御を移す。 pop ds pop ax popf jmp far [cs:OLDTMRV] ;[EOF] Xeno [2002/11/25 Mon 01:49:40] [61.196.124.63] おせわになっております。 現在、タイマー割り込みを使用してみようかと思っています。 調べたところINT 08Hファンクションというのが存在することがわかりました。 しかし、このタイマーは55msインターバルで遅くて使い物になりません。 過去ログで引っかかったのですが、このインターバル値を変更する方法があるというのですが その方法がわかりません。 どこかにサンプルソースコードはないでしょうか? あとINT 70H(リアルタイムクロック割り込み)というのも見つけました。 インターバルが976microsecondでおおすごい!なんて思いましたが いかんせん詳細資料、サンプルソースなどがみつからず う〜んてな状況です。 どなたかご存じないでしょうか? Rastiv [2002/11/21 Thu 19:31:22] [211.8.106.9] Rastivです。 --- Xenoさんへ --- 何か、ハード的にアクセスするのかな、と想像してましたが、 OSとはまた別に、PCI BIOSというのがって、それを使って アクセスするんですね。 お返事ありがとうございました。 ---- 下のほうで(2002/10/22 Tue 18:45:12)、ハードディスクの CHS関係のことが曖昧なところで終わってたのが気になるので、 紹介しておきます。 ホームページ 「NOBUSAN'S SQUARE」 の中にあります。 ”ブートとハードディスクのすべて” http://nobumasa-web.hp.infoseek.co.jp/boot_hdd.html 力卜 [2002/11/21 Thu 14:01:38] [202.248.54.101] sakaさん、こんにちは。 アセンブリソース上のjmp(or call)命令に「ラベル」ではなく「定数」を記述 したい、ということですね? masmには疎いのですが「MASM擬似命令ハンドブック」という本の巻末付録で、 jmp命令とcall命令の記述形式には jmp(or call) label と書いてあるだけなので、 jmp(or call)命令に定数は記述できない、というのが結論だと思います。 しかし、一体なぜそうしたいのでしょうか? 目的がわかれば他の解決策が 提示できそうな気がするのですが…。 あと、sakaさんの質問には「絶対アドレス」とありますが、jmp(or call)の 直接アドレッシングで絶対アドレス指定が可能なのは 「城」さんが書かれて いるもののうち、以下の2つだけですが、認識はあっていますか? jmp xxxxH:xxxxH ;far jmp xxxxH:xxxxxxxxH ;far 32bit address mode 他のはIP(EIP)レジスタ相対となる「相対アドレス」指定となります。 認識があっているとすると、以下はどうでしょうか? とりあえず回避できます。 うまく展開するマクロを組む方が見栄えがよいかもしれません。 ;; far(セグメント指定あり) jmp または call jmpf equ 0eah callf equ 09ah ;; 16ビット時: jmp (または call) db jmpf ; または callf を記述。 dw offset16,segment16 ; 分岐先の segment16:offset16 ;; 32ビット時: jmp (または call) db jmpf ; または callf を記述。 dd offset32 ; 分岐先の selector16:offset32 dw selector16 Xeno [2002/11/21 Thu 08:52:40] [61.196.124.63] >Rastivさんへ プロテクトモード関係以外はたいしたことはしていませんが... ・PCI BIOS Functionを使用して目的のPCIボードのベースアドレス(私の場合、E4300000H)を取得します。 ・一度プロテクトモードにしてセグメントディスクリプタを64KLimitに戻さずにリアルモードに戻る。(FlatRealMode) ・後はダイレクトにアクセスする。 XOR AX,AX PUSH DS MOV DS,AX MOV ESI, 0E4300000H MOV DL, 書き込むデータ MOV DS:[ESI], DL POP DS みたいな感じです。 PCI BIOSの資料はPCISIGからダウンロードしました。 こんなんでよろしいでしょうか? saka [2002/11/21 Thu 07:18:28] [218.138.128.11] sakaです。 「城」さん、ご回答して頂きありがとうございます。 わたしの説明不足ですみませんでした。 MASM6でラベル無しで直接16進数アドレスを指定してアセンブル しますと、 error A2076: jump destination must specify a label というエラーが出てobjファイルの作成まで進まないのです。 お手数ですが、よろしくお願いします。 「城」 [2002/11/20 Wed 19:20:47] [210.148.114.180] sakaさん jmp 先のアドレス指定ですが、80系CPU では jmp xxH ;short jmp xxxxH ;near jmp xxxxxxxxH ;near 32bit address mode jmp xxxxH:xxxxH ;far jmp xxxxH:xxxxxxxxH ;far 32bit address mode があります。 ラベル先への jmp でもアセンブルされてしまえば、絶対アドレス指定と同じになってしまうでしょう。 Rastiv (以前はTsuyoshi) [2002/11/19 Tue 18:41:22] [211.8.106.9] Rastivです。 Xenoさんの、PCIボードに対する読み書きに関する件についてなんですが・・・。 互換機の仕様には、基本的にISAバスがシステムバスとして使われていて、 PCIバスはローカルバスという位置づけになっています。 そのISAバスとPCIバスとの間には、バスブリッジデバイスがあって、 バスとバスとを橋渡ししています。 僕は、ずーーーーっと、このPCIバスには、バスブリッジデバイスの デバイスドライバ抜きではアクセスできないんだな、と思い込んで いたんですが、DOS上からでもできるなんて聞いて仰天しています。 メモリ上で動くプログラムは、どんな風にそのPCIバスにアクセス しているんでしょうか。 そのちょっとした原理だけで良いですので、教えていください。 Xeno [2002/11/19 Tue 17:17:21] [61.196.124.63] カトさんへ レスありがとうございます。 やってみましたが、駄目でした。 どうしてかはさっぱりわかりませんね。 うーん(−−;) 今はとりあえずまともに動いてるので良しとしています。 saka [2002/11/19 Tue 11:56:46] [218.138.128.11] 皆様はじめまして、sakaと申します。 さっそく質問で恐縮なのですが、MASM6でオペランドにラベル無し で16進アドレスを直接に指定出来ないのですか? jmp 123456h call 123456h という感じです。 やはりレジスタで間接アドレス指定でなければ無理なのでしょうか? お願いします。 電 [2002/11/18 Mon 20:24:03] [203.141.156.195] E5さん、はじめまして^^ とりあえず、手元にいろいろな資料が手に入ったので あとはそれをまとめて、腕を磨いて・・・ってかんじです^^ >「キーボードのハードウェアを操作したい」とのことですが、 >CQ出版社 「パソコンのレガシィI/O活用大全」でバッチリです。 >割り込み、タイマ、FDのハードウェアでお困りのかたも是非。 それはぜひとも購入したいですね^^電子工作もやったことが ないのでタイマのチップとかさっぱりですから・・ いろいろと親切なアドバイスありがとうございます!! ちなみに今は、キーボードのランプがチカチカする プログラムを作ってます(笑 E5 [2002/11/18 Mon 04:17:34] [211.135.219.180] はじめまして >電さん もう解決したのかな? 「キーボードのハードウェアを操作したい」とのことですが、 CQ出版社 「パソコンのレガシィI/O活用大全」でバッチリです。 割り込み、タイマ、FDのハードウェアでお困りのかたも是非。 わりと最近の物なので(2000年10月発行)ご存知でないかたも 多いでしょうが、とても良質な本なのでおすすめします。 簡潔ながらも他の書物に比べ一歩踏み込んだ解説がされています。 キーボードのスキャンコードについて参考になりそうなのは、 ソフトバンク「DOS/Vプログラミング・リファレンス」(誤植あり、サンプルコードにバグあり) 「プログラマーのためのPCソースブック」 といった程度しか知りません。ネット上で探すのが良いと思います。 H.U [2002/11/17 Sun 17:04:04] [61.211.112.22] >カトさん ありがとうございます。 前回のHello !が出力されなかった件もカトさんが言っていた通りでした 標準入出力をDosからリダイレクトしてファイルに出力したら ちゃんと出ていました。 これからもよろしくお願いします。 電 [2002/11/17 Sun 10:40:10] [203.141.156.195] 「OADGテクニカルリファレンス」というものも参考書の中に あったので調べてみたら、ただでダウンロードできました^^ 興奮です〜 電 [2002/11/17 Sun 10:29:44] [203.141.156.195] あ、かいてありました、、 「PS/55ハードウェア・インターフェース技術解析書」 とありますね。一方私の借りてきたのは 「PS/55ハードウェア・インターフェース技術解説書」 です。ニアピンですね^^ これで問題無いでしょうか。 力卜 [2002/11/16 Sat 22:29:29] [202.248.54.170] H.Uさん、こんばんは。 Win32用のソースとDOS用のソースの違いについてということですよね? 擬似命令の記述の仕方は気を付けた方がよさそうな気がします。 VC++があるのなら、Cで翻訳してアセンブリソースを採ってみれば 参考になると思います。 どっちかというと、命令の書き方より、システムの呼び出し方の 違いの方が大きいように思います。 masmを使ったWin32アプリの開発は以下(英語)が参考になると思います。 http://win32asm.cjb.net/ 力卜 [2002/11/16 Sat 22:27:54] [202.248.54.170] Xenoさん、こんばんは。うちでは、リアルモードで 4GB limit にする、 いわゆる flat real mode にするのに、以下のコード(nasm用です)を 使っています。PC/ATのPCI用ではなく、FM-TOWNSのVRAMアクセス用として 使っているだけですので、そちらでうまく動作するかはわかりませんが。 (TABでインデントしていますので、HTMLソースから見てください。) FLATREAL: pushf xor ecx,ecx ;; mov cx,cs ;; shl ecx,4 ;; calculate GDTs linear address add [cs:GDTSPTR],ecx ;; cli ; interrupt disable lgdt [cs:LGDTR] ; update GDTR push ds push es push fs push gs mov eax,cr0 ;; or al,0x01 ;; switch to protected mode mov cr0,eax ;; jmp short $+2 ; clear instruction cache mov bx,0x0008 ; GDT entry #8 mov ds,bx ; change DS's offset limit mov es,bx ; change ES's offset limit mov fs,bx ; change FS's offset limit mov gs,bx ; change GS's offset limit and al,0xFE ;; mov cr0,eax ;; switch to real mode jmp short $+2 ; clear instruction cache pop gs pop fs pop es pop ds popf ret align 8 dw 0 LGDTR: GDTSLEN dw 0x000F ; last offset from top of GDTs linear address GDTSPTR dd GDTS ; linear address to GDTs GDTS db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; GDT entry 0x0000 db 0xFF,0xFF,0x00,0x00,0x00,0x92,0x8F,0x00 ; GDT entry 0x0008 ;EOF 「城」 [2002/11/16 Sat 14:12:01] [210.148.114.49] >IBMから出ていたという資料 発行は、DOSが元気な時代だったような気がします(^^;) 「DOS/Vプログラマーズハンドブック」の末尾に参考資料とかで 書いてありませんか 電 [2002/11/16 Sat 11:34:59] [133.25.253.183] 城さん> ありがとうございます。早速飛んでみました^^ これがあれば割り込み関係は問題なさそうです^^ あ、あとIBMから出ていたという資料はOS/2の時代の ものでしょうか?先日図書館に行きまして探したのですが、 PCIバスの寸法やら、回路やらが載っている資料を 見つけました。役に立ちそうです。あ、あとついでに DOS/Vプログラマーズハンドブックというものも 借りてきました〜。ありがとうございましたm(_ _)m den [2002/11/16 Sat 11:28:50] [133.25.253.183] すたくす [2002/11/16 Sat 11:07:32] [150.37.251.15] >Xenoさん たしかに E4300000H に対してアクセスされているようなので、 A20bitマスクは関係してきますけど・・・ デフォルトでは、ユーザプログラムにはA20マスクされている ということだとすれば、正しい結果なのでしょうけれど・・・ A20_ONをコールしなくても、正常に読み込みができることは 確認されているんですよね。 う〜ん、知識不足ですいません。 H.U [2002/11/15 Fri 19:27:51] [61.211.112.22] >カトさんへ 何度もありがとうございます。 もしかしたら、そうかもしれません。 というのも、一度実行したら画面が変になって (具体的には コンパイルしたあとすぐに実行をかけたときに コンパイル結果の表示と実行が重なっていた) 画面をクリア(cls)しました。 あと、もうひとつ質問があるのですが 16bit アセンブラ と 32bitアセンブラではコード(ソース) の書き方(命令)が違うのでしょうか? 32bitリンカーでリンクするとエラーが出ました。 LINK : warning LNK4044: オプション "z2" は無効です; 無視されます LINK : error : Segment reference in fixup record Hello.obj : fatal error LNK1123: COFF への変換中に障害が発生しました: ファイルが無効 であるか、 または壊れています。 力卜 [2002/11/15 Fri 17:35:41] [192.51.44.10] H.Uさん、こんにちは。 今日(?)、その表示されない問題が発生してから、まだOSの再起動をしていませんよね? OSの再起動をしてみることをおすすめします。今はひょっとしたら、他のDOSアプリでも 標準コンソール出力の結果が表示されないんじゃないでしょうか。 過去の個人的経験ですが、WinNT4.0だったかWin2000だったか忘れましたが、 NT系のOS上で、バグ持ち(開発途中版でメモリ破壊をするなど)の16ビットDOS アプリを実行したことがあったのですが、やはりDOSからの標準出力がなされ なくなったことがありました。 こういうときは、DOSのファイラーのmielとかfilmtnとかを起動したり、OSを 再起動したりすると、現象は起きなくなりました。 (でも、また実行してバグると表示しなくなったりはありますが) これで直る問題だとすると、a.exe >a.txt とかしてファイルにリダイレクト すると、画面に出ないときでもファイルにはしっかり出たりします。 ちなみに、私のおすすめDOS用デバッガは、DDEB(↓)です。これはDOS汎用です ので、FM-TOWNSでも問題なく動きます。i386以降の拡張命令や32ビットレジスタ もしっかりデバッグできます。 http://www.vector.co.jp/soft/dos/prog/se014328.html EXDEB(↓)というのもあります。が、ダンプ時の範囲指定の結果が変な気が する(例1: d 1000 1020 例2: d 1000 100F)ので、最近は使っていません。 http://www.vector.co.jp/soft/dos/prog/se008450.html H.U [2002/11/15 Fri 16:14:28] [211.15.63.146] >カトさんへ わざわざすみません 自分でも何が悪いのかさっぱりわかりません。 >城 さんへ アセンブラデバッガは何がお勧めなんでしょうか? なにか良いものがありましたらお教えください。 ちなみに コンパイルのときに /Fl オプションを付加して .lstファイルを吐き出させて参照しても自分でも間違っているところは 見当たらないようなきがしました。 ちなみに OSはWinNTです 「城」 [2002/11/15 Fri 13:05:12] [210.148.114.37] H.Uさん これからレベルアップしていくためにも、ぜひデバッガを入手して、使いこなせるようになることをお勧めします。 力卜 [2002/11/15 Fri 12:26:43] [192.51.44.15] H.Uさん、こんにちは。 私のところで、ソースをa.asmとして、以下のようにコマンドを入力 しましたが(リンカは32ビットのものとの競合を避けるためlink16.exe にリネームしてあります)、無事にアセンブル/リンクできましたよ。 何がおかしいのでしょうね…。 D:\WIN2K>ml /c a.asm Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: a.asm D:\WIN2K>link16 a.obj,a.exe; Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994 Copyright (C) Microsoft Corp 1984-1993. All rights reserved. D:\WIN2K>a Hello ! H.U [2002/11/15 Fri 10:25:42] [211.15.63.146] はじめまして H.Uといいます 最近アセンブラを始めた者ですが Hello !の表示が DOS画面で表示されなくて困っています。 コンパイルとリンクはエラーが無く通って exeができあがるのですが 実行しても何も起こりません。 コンパイラは Microsoft (R) Macro Assembler Version 6.14.8444 リンカ Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994 を使っています。 ソースは assume cs:cseg,ds:dseg,ss:sseg cseg segment start: mov ax, dseg mov ds, ax mov dx, offset msg mov ah, 09h int 21h mov ax, 4C00h int 21h cseg ends dseg segment byte msg db 'Hello !',0Dh,0Ah,'$' dseg ends sseg segment stack db 100h dup(?) sseg ends end start という記述です ぜんぜんわからなくてここに書き込みさせていただきました。 どなたかご教授よろしくお願いします。 「城」 [2002/11/14 Thu 22:48:12] [210.148.114.151] 書き忘れましたが、ハード寄りのことも一部書いてあったと思います。 「城」 [2002/11/14 Thu 22:43:56] [210.148.114.151] IBMの本の名前はもう忘れて判りません。 でも、システム・コール(ソフトウェア割り込み)に関する資料は、こにありますので、役に立つかもしれません http://www-2.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html Xeno [2002/11/14 Thu 09:53:53] [61.207.97.16] >すたくすさん Interfaceという雑誌に付いてきたMemory.asm(4GBメモリエディタ)を参考にしています。 ソースコードをここにコピペして書き込もうとするとサーバが見つかりませんといわれて書き込めないので書きたくても書けない状況です。 ちなみにLimit4GBのリアルモードでPCIのベースアドレスに書き込めなかった件ですが、A20_ONというルーチン(Memory.asmから引っ張ってきました。) をプロテクトモード前に呼び出したところ書き込めるようになりました。 なぜだ? 電 [2002/11/13 Wed 23:26:18] [203.141.156.195] 城さん> はじめまして^^ IBMの本ですか!それはぜひとも読んでみたいものですね 本のタイトルとかはご存知ないでしょうか? 「城」 [2002/11/12 Tue 08:19:06] [210.148.114.73] >IBM互換機のテクニカルデータブック 昔IBMからその手の本が出てたそうですが、今は古本屋で探すしかないかもしれませんね 「城」 [2002/11/12 Tue 08:18:43] [210.148.114.73] >IBM互換機のテクニカルデータブック 昔IBMからその手の本が出てたそうですが、今は古本屋で探すしかないかもしれませんね 電 [2002/11/11 Mon 22:25:48] [203.141.156.195] こんにちは、現在キーボード入力をシステムコール無しで 作ろうと考えているのですが(無理!?)、どうにも ハードウェアの情報が見当たりません。。 PC9800テクニカルデータブックというのを本屋で見かけましたが、 これと同じようなIBM互換機のテクニカルデータブックは 販売していないのでしょうか? すたくす [2002/11/11 Mon 21:39:30] [150.37.251.15] こんばんは >Xenoさん プロテクトモードでは、アクセス可能なわけですね。 よくわかりませんが、モード切替を間断なく行うと そういった不具合が置きやすくなるのでしょうか? と、いうことはファンクションコールがウェイト代わりに なってる、もしくはコール内容がリアルモード復帰後の 安定要素になっている? SetProtectMode、SetRealModeの内容がわからないので はっきりしたことは解りませんが・・・ (「初めて読む486」のサンプルみたいなものでしょうか) Xeno [2002/11/11 Mon 10:21:35] [61.214.32.160] リアル→プロテクト→リアルで4GB空間のメモリにアクセスしています。 繰り返して行っているとフリーズ及び、リブートします。 しかし、不思議なことに CALL SetProtectMode MOV DL, DS:[ESI] CALL SetRealMode をループするとフリーズ、リブートが何かのタイミングで起こるのですが CALL SetProtectMode MOV DL, DS:[ESI] CALL SetRealMode MOV AH, 02H MOV DL, 41H INT 21H をループすると何時間たっても正常に動いています。 なぜなんでしょか? Xeno [2002/11/10 Sun 12:39:15] [218.43.38.103] PCIアドレスアクセスの件は 結局、毎回リアル→プロテクト→リアルを毎回繰り返すことにしたんですけどね。 解決というよりは標準の方法でカバーしたってことです。 あんまり時間がないもので... !!あっ、固まった! ピーンチ 電 [2002/11/10 Sun 09:01:08] [203.141.156.195] はじめまして>Xenoさん たしか二ヶ月ほど前にダウンロードした記憶が ありますが、なるほどプロテクトモードのことまでも しっかりと書いてあるのですね^^ありがとうございます。 皆さんレベルがお高い^^;私なんてまだファイルの入出力 ですよ〜(笑 すたくす [2002/11/10 Sun 02:48:02] [150.37.251.15] Xenoさん、こんばんは PCIアドレスアクセスの件、原因は何だったのでしょうか? できましたら、お教えいただけると嬉しいのですが。気になります。 PCIアドレスのページエントリで書き込み禁止になってるとか? なわけないですね、リアルモードなのに...ハード的なもの? Xeno [2002/11/09 Sat 13:45:57] [61.214.29.245] 前回の件は無事解決しました。 電さんへ プロテクトモード(保護モード)を使うにあたって次のサイトからINTELのマニュアルをダウンロードして参考にしてみてください。 下巻に細かく書いてあります。 もしすでに持っているのであれば失礼。 http://www.intel.co.jp/jp/developer/design/pentiumiii/manuals/ 電 [2002/11/08 Fri 22:15:37] [203.141.156.195] はじめまして、私、電といいます。 実は、アセンブリ言語に興味を持ち始めたのは最近なので、 皆様のお力にはなれそうにはありませんが、プロテクトモード までをなんとか使えるようにしたいと思っているので よろしくお願いします^^ PSここの掲示板のログはめちゃめちゃ参考になりますねっ^^ BIOSもん [2002/11/08 Fri 12:41:35] [218.45.239.13] x86アセンブラ言語で下記のような宣言があった場合には、どちらのオフセットがaxに入るんでしょうか? 下記の記述はストロングウイーク(英語綴り不明)と聞きましたが、そうなんでしょうか。 〜ソース1〜 EXTERN AAA(BBB):NEAR mov ax, OFFSET AAA : BBB PROC NEAR PUBLIC : BBB ENDP 〜ソース2〜 AAA PROC NEAR PUBLIC : AAA ENDP Xeno [2002/11/08 Fri 12:09:49] [220.96.27.25] MSDOS6.2/V上でプロテクトモードにしてセグメントリミットを4GBにしてからリアルモードに戻って リアルモードでの4GB空間のアクセスに成功したのですが、 物理メモリの存在するアドレス10000000Hに対して読み書きできるのですが、なぜかPCIボード(E4300000H)に対しては読み込みだけでき、書き込みが出来ません。 エディタツールを使うと書き込めるので書き込めない理由がわかりません。 書き込みだけが出来ない理由として何が考えられるでしょうか? なにとぞよろしくお願いします。 Xeno [2002/11/08 Fri 10:13:41] [220.96.27.25] Test a.out氏 [2002/11/04 Mon 16:56:44] [43.239.62.21] 倉羽 さん はじめまして。 それほど詳しくないのですが。 >$varはアドレス値$0x8049418ですよね? それでいいと思います。 >わからないのは、CODE領域におけるmainのアドレスです。 Breakpoint 1, 0x80483a0 in main () 2: /x $eax = 0xbffff9f4 1: x/i $eip 0x80483a0 <main>: mov $0x8049418,%eax 上の 1: をみれば eip は <main> をポイントしているのだから、 つまり、現在、main からのオフセット 0 にいるということだから main のアドレス = 0x80483a0 だと思います。 これで分かりましたでしょうか? 倉羽 [2002/10/29 Tue 17:02:09] [202.32.46.12] はじめまして。 GASを勉強しています。 で、わからないところがでてきたので分かる方が おられれば ぜひおしえていただきたいのです。 [@/raid//test]cat immaddr.s .file "immaddr.s" .data var: .word 0 .text .globl main main: movl $var,%eax addw $0x1234,%ax addw $0x5678,%ax ret [@/raid//test]cat comfile break main display/i $pc display/x $eax (gdb) run Starting program: /raid//test/immaddr Breakpoint 1, 0x80483a0 in main () 2: /x $eax = 0xbffff9f4 1: x/i $eip 0x80483a0 <main>: mov $0x8049418,%eax (gdb) si 0x80483a5 in main () 2: /x $eax = 0x8049418 1: x/i $eip 0x80483a5 <main+5>: add $0x1234,%ax (gdb) x/w $eip 0x80483a5 <main+5>: 0x12340566 (gdb) si 0x80483a9 in main () 2: /x $eax = 0x804a64c 1: x/i $eip 0x80483a9 <main+9>: add $0x5678,%ax (gdb) x/w $eip 0x80483a9 <main+9>: 0x56780566 (gdb) si 0x80483ad in main () 2: /x $eax = 0x804fcc4 1: x/i $eip 0x80483ad <main+13>: ret $varはアドレス値$0x8049418ですよね? わからないのは、CODE領域におけるmainのアドレスです。 Embedded ATA [2002/10/22 Tue 18:45:12] [168.10.22.10] 土野明日香さんのご質問への回答です。 PC/AT DISK BIOSでは、約1GB までは BIOS CHSの head/sector は 64/32 それ以上 約8GBまでは255/63、それ以上約32GBまでは 255/255です。しかし実際には255/255というCHSパラメータでアプリケーションまたはOSがBIOSコールすることはありませんで、Extended Int13h call(function 42h,43h, LBA)が使われます。これを実装している場合、8GB未満においても用いられます。以上APIレベルです。 ご質問の様子からすると、BIOS APIレベルのCHSと、ATAディスクドライブファームウェアレベルのCHSとを完全に混同して理解なさっていますね。旧DOSや旧DISKアプリケーションからBIOSがCHSでコールするとしても、(いまどきのマシンBIOSならば)実際にはドライブにはLBAでアクセスします。Disk parameter translationがBIOS内部で介在しています。だから 255headsなどという値があっても構わないのです。もし8GB未対応マシンでドライブにCHSでアクセスしているとしても、translationを施したうえで シリンダ数16bit/ヘッド数4bit/セクタ数8bitでアクセスします。なおPC-9821シリーズの場合はBIOS translationではなくInitialize device parameterコマンドによる設定でカバーします。 ところで PC-9821のATA DISK BIOSをお書きになると言うことですが、ご自身でお造りになったATA応用ソフトウェア製品があるというのに、このような質問が出てくるとは不思議です。10年後の完成を期待しております。 土野明日香 [2002/10/13 Sun 01:04:35] [61.124.192.43] もえさん お返事ありがとうございます。土野明日香です。 》ドライブによりけりですが、最近のはほとんど HEAD 255 SECTOR 63 》ですね。 ま、マジですか(^^;;。 ヘッド16以上はIDEのレジスタを叩けないような...。 BIOS側はそのパラメータで動くとして、ドライブへのSET DRIVER PARAMETER コマンドではその数値は送れませんよね。 そもそも、何故これが気になったのかというと、「BIOSでのイニシャライ ズ時にダミーでもCHSパラメータを一応送ってやらないと、LBAアクセスでも 正しく動かないドライブがある」ということを聞いたもので。 あとはこの辺の処理をVxDやWDMなどが行っているかどうかを知りたかった のです。 #何を考えているかというと、AT互換機用のIDEボードをPC-9821で使用する #ためにIDE-BIOSを書くわけですが、もしドライバレベルでAT互換機のフォ #ーマットに依存するようなことをしているとすると、ドライバまで記述し #なければならなくなるからです。 》なお、シリンダ1024以上へのアクセスにはセクタを通し番号 》で指定するLBA(Logical Block Address)でアクセスします。CHSより 》計算が楽なのでこちらのほうが好きですが。(笑) らしいですね。 ですので、8063MBの壁はあまり気にしなくて良いのだと思います。 》#PC-98は標準じゃ8GBオーバーサポートしていなかったんだよなぁ BIOS上は32GBまで(ヘッド16/セクタ63)対応していますが、CHS方式で容 量取得するとドライブが8063MBだと言い張りますからねぇ(笑)。 by [2002/10/09 Wed 12:39:52] [63.30.132.182] cbyd もえ [2002/10/08 Tue 02:35:42] [61.122.137.153] 土野明日香さん >AT互換機の場合はどうなっているのでしょうか? ドライブによりけりですが、最近のはほとんど HEAD 255 SECTOR 63 ですね。なお、シリンダ1024以上へのアクセスにはセクタを通し番号 で指定するLBA(Logical Block Address)でアクセスします。CHSより 計算が楽なのでこちらのほうが好きですが。(笑) #PC-98は標準じゃ8GBオーバーサポートしていなかったんだよなぁ gasp [2002/09/30 Mon 18:47:55] [210.143.35.16] gccでクロスコンパイラを作りたいのですが gccがサポートしているターゲット ("./configure --target=hoge"のhoge部分) 全てを知りたいのです。 紹介されている資料等ありましたら 御教授いただきますようお願いいたします。 土野明日香 [2002/09/28 Sat 23:48:54] [61.124.193.18] 訂正(^^;; 誤)特にCHSを使っていない?8063MB以上の場合ガキになります(苦笑)。 正)特にCHSを使っていない?8063MB以上の場合が気になります(苦笑)。 土野明日香 [2002/09/28 Sat 23:47:32] [61.124.193.18] AFさん早速のお返事ありがとうございます。 》Google で PnP BIOS specification で検索すると幾つか出るようだけど希望の資料は無かったですか? 》確かに出所からミラー(無断コピー?)されたやつが多そうですが... 検索してみたら色々と出てきました。 今まで「PnP-BIOS」だけで検索していたので埋もれていたのですね。 早速落として見てみることに致します。 有用な情報ありがとうございました。 P.S. IDE-HDD関係で面白いツールをお作りのようですね。 PC-9821系ですと、HDDのジオメトリは、 20MB…………ヘッド4、セクタ17 〜4351MB……ヘッド8、セクタ17 〜32GB………ドライブに依存(ヘッド16/セクタ63かヘッド15/セクタ63) 〜127.5GB… ヘッド16、セクタ255(PK98-Mistress9のBIOSパッチのみで存在) となっていますが、AT互換機の場合はどうなっているのでしょうか? 特にCHSを使っていない?8063MB以上の場合ガキになります(苦笑)。 AF [2002/09/27 Fri 23:41:51] [210.233.166.56] http://www.ksky.ne.jp/~afuruta/ 土野明日香さんこんにちは、 > さて、今回はPnP-BIOSについてなのですが、どなたか仕様がわかるようなHPor書籍をご存じないでしょうか? Google で PnP BIOS specification で検索すると幾つか出るようだけど希望の資料は無かったですか? 確かに出所からミラー(無断コピー?)されたやつが多そうですが... 土野明日香 [2002/09/25 Wed 20:40:31] [61.210.76.173] 忘れた頃にやってくる土野明日香です(^^;;。 以前のINT 21h FNC440Dhの件ではお世話になりました。 何とかIO.SYSの書き換えもできてホッとしているところです。 さて、今回はPnP-BIOSについてなのですが、どなたか仕様がわかるようなHPor書籍をご存じないでしょうか? CQ出版社のPCIデバイス設計入門には「http://www.intel.co.jp/ial/wfm/design/smbios/を見ろ」と書いてあるのですが、既にここのツリーは大規模改変されているらしく、見あたらないのです。 あともう一点。 PCIのコンフィグレーションレジスタで「拡張ROMベースアドレス」についてですが。 何枚かの手持ちのVGAカードで調べたところ、60000000h(=C000h)ではなく22000000hや28000000hなどという数値が書き込まれていました。これではVGA-BIOSは起動しないと思うのですが、何か読み換えあるのでしょうか? VCDC [2002/09/25 Wed 20:09:36] [192.218.140.157] カトさん、こんばんわ ありがとうございました。 もっと勉強してからまたきます。 VCDC [2002/09/25 Wed 20:09:32] [192.218.140.157] カトさん、こんばんわ ありがとうございました。 もっと勉強してからまたきます。 VCDC [2002/09/25 Wed 20:09:23] [192.218.140.157] カトさん、こんばんわ ありがとうございました。 もっと勉強してからまたきます。 力卜 [2002/09/25 Wed 19:54:37] [192.51.44.11] VCDCさん、こんばんは。 Win32コンソールアプリからは、DOSのシステムコールを呼び出したり BIOSコールをしたりはできません。 (またVC++6.0では、DOSアプリが作成できません。 DOSアプリが作成できるのはVC++1.52まで) Win32でのキー入力をフックしたいのでしたら、Win32APIでそのような ことを行うことは(私は知りませんが)可能だと思いますので、アプローチを 変えてみることをおすすめします。 Win32関連の開発者向け掲示板などで再度質問すればよいと思います。 (ここの掲示板でもやり方を知っている方がいるかも知れませんが) VCDC [2002/09/25 Wed 17:06:32] [192.218.140.157] _dos_setvect()はWatcomCですか。 あまりわかっていなくてすいません。 VisualC++6.0のWin32 Console Applicationで プロジェクトを作成して作ろうと思っています。 VC++にも_dos_setvect()かそれに変わるAPIはある のでしょうか・・・見つからなかったので、下の用 にしようとしました。 void KeyHandler(void); void SetHandler(void); void main(void) { SetHandler(); } void SetHandler(void) { _asm { ; KEY割り込みベクタ登録 mov ds,????????? mov dx,????????? mov ax,2515h int 21h } } void KeyHandler( void ) { 処理 } AF [2002/09/25 Wed 00:08:55] [210.233.166.46] http://www.ksky.ne.jp/~afuruta/ > 関数アドレスをセグメントとオフセットに分解してやるのでしょうか。もしそうならどのようにするのでしょうか VC なら _FP_SEG, _FP_OFS, TC なら FP_SEG, FP_OFS を使う。 組み込みシステムでライブラリが使えないなら話は別ですが _dos_setvect, _dos_getvect なんかも有ります。これなら、 FP_XXX のお世話にならないでも済みます。 ところで __interrupt or interrupt キーワードはもう押さえ てありますよね。 私は asm {} インラインで書いちゃいますけど... VCDC [2002/09/24 Tue 18:07:42] [192.218.140.157] はじめまして。全くの初心者でいきなり質問は失礼かと思いますが、Cのインラインアセンブルで、Cで作った自作キー割込みハンドラをINT 21h(AX=2515)で登録したいのですが、DS・DXにはどのようにセットしてやればいいのでしょうか。 関数アドレスをセグメントとオフセットに分解してやるのでしょうか。もしそうならどのようにするのでしょうか。 VCDC [2002/09/24 Tue 18:07:26] [192.218.140.157] はじめまして。全くの初心者でいきなり質問は失礼かと思いますが、Cのインラインアセンブルで、Cで作った自作キー割込みハンドラをINT 21h(AX=2515)で登録したいのですが、DS・DXにはどのようにセットしてやればいいのでしょうか。 関数アドレスをセグメントとオフセットに分解してやるのでしょうか。もしそうならどのようにするのでしょうか。 VCDC [2002/09/24 Tue 18:05:08] [192.218.140.157] はじめまして。全くの初心者でいきなり質問は失礼かと思いますが、Cのインラインアセンブルで、Cで作った自作キー割込みハンドラをINT 21h(AX=2515)で登録したいのですが、DS・DXにはどのようにセットしてやればいいのでしょうか。 関数アドレスをセグメントとオフセットに分解してやるのでしょうか。もしそうならどのようにするのでしょうか。 澤口@一升金 [2002/09/20 Fri 00:46:16] [61.197.17.9] 澤口@一升金です。 to apmrさん: Win32API の総合リファレンスはここを参照するか ↓ http://www.microsoft.com/japan/msdn/library/ (あるいはMSDN会員になってCDを入手するか) アスキーから出ているWin32APIオフィシャルリファレンス を購入するしかないのではないかと思います。 いずれにしても日本語版はかなり誤訳などが多いという話 ですし、最新版でもないので、英語版の Platform SDK を ダウンロードしてドキュメントを読むのが正道ではないかと。 ↓ http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ (フルサイズで340MB以上ありますが) 澤口@一升金 [2002/09/19 Thu 23:55:46] [61.197.17.9] 澤口@一升金です。 to sugaさん: ARMはよくわからないですけど、スターターキットを購入すれば 初期化サンプルソースくらいは付いてくるのでは? ↓ http://www.semic.sanyo.co.jp/micon/arm/jp/ apmr [2002/09/10 Tue 02:47:03] [211.12.84.210] WinApi32HELP(Reference)の日本語版を 必死で探しているのですがまったく見つかりません どこかのサイトからDLできるところをどなたかご存知ありませんか? 朗報を心からお待ちしています suga [2002/09/06 Fri 17:38:27] [210.133.103.231] はじめまして、sugaと申します。 現在、ARM7TDMIプロセッサ内臓ハードの組み込みソフトを作ろうとしています。 しかし、プロセッサ周りの初期設定等についてはまったく素人のため、 具体的に、どうアセンブラで記述すればいいのかわからず困っています。 処理内容としては、ハードリセット時にCPU内臓IOの初期化、SDRAMクリア、 キャッシュ初期化、MMU初期化などを行い、 高級言語(C言語)で書かれたルーチンへジャンプするところまで、 アセンブラでコーディングするのでは、と予想しています。 つきましては、これら処理について、具体的なコーディング例など、 参考にできる文献、ホームページ等ご存知の方がいらっしゃったら 御教授ください。 よろしくお願いします。 澤口@一升金 [2002/08/27 Tue 01:28:30] [61.197.17.210] 澤口@一升金です。 canoさん wrote: >スタックが登場したのは1970年代で、おそらく最初に広まったのは >DECのPDP-11からだと思います。 スタックという概念はアラン・チューリングが 1945年に提示していますね。 EDSACのシミュレータというのがここにあるのですが ↓ http://www.dcs.warwick.ac.uk/~edsac/ インストラクションセットを見ると、確かにハードスタックはないですね。 でも、このマシンは設計上ソフトスタックを構成することは可能で、現に 同マシンのインストラクションで構成した「ハノイの塔」プログラムがあり ます。 ↓ http://www.dcs.warwick.ac.uk/~edsac/Programs/Towers.txt 詳細資料は持っていないので推測になりますが、Algol とか Lisp,Forth などのスタック指向言語が1950年代後半には出そろっていますから、1970 年代になってからスタック使用が一般的になったというのは少し違うのでは ないでしょうか。 例えば、DEC では PDP-1(PDP-11ではない)は Lispを実装していたらしいです。 (1964年) ↓ http://www.dbit.com/~greeng3/pdp1/ また、それ以前、1950年代後半にはIBM704あたりで Lisp が動いていますから ↓ http://www8.informatik.uni-erlangen.de/html/lisp/histlit1.html 1970年代までスタックが一般化していなかったようには思えません。 I/O割り込みやサブルーチンコールをインストラクションでサポートした最初 のマシンは 1954年の UNIVAC 1103A ということになっている資料を見ました が、これがハードウェアスタックで実現されていたかどうかはわかりません。 ここに ↓ http://www.cse.nd.edu/~milind/arch/vonNewarc subroutine call instructions (Univac 1103A, 1954) [possibly earlier?] interrupts (Univac 1103A, 1954) と書いてありますね。 cano [2002/08/26 Mon 10:36:10] [202.33.245.218] google検索中に偶然見つけました。 偉い古い話題で恐縮ですが間違いなので訂正しておきます。 全てのログに目を通したわけではないので、すでに指摘されていたらごめんなさい。 >澤口@一升金 [2001/11/22 Thu 01:52:03] [211.2.146.6] で >EDSAC という計算機が「サブルーチン」の始まりなので、おそらくこの機械の設計 >が、スタックの始まりでしょう。 とありますが、違います。 スタックが登場したのは1970年代で、おそらく最初に広まったのは DECのPDP-11からだと思います。 それ以前にもスタックの概念は提案されていたようですが 「本当に正しく戻れるのか」という疑問があり、 あまり使われなかったそうです。 当時、サブルーチンジャンプには BALR(Branch and Link Register)という命令を使いました。 現在も、IBM S/370系のメインフレームなどにはハードウェアスタックは存在しません。 メインフレームでスタックを搭載していたのはバローズ(現UNISYS)のマシンくらいでしょう。 これは、現在のプログラムカウンタの値を指定した レジスタに保存してジャンプするものです。 ジャンプ先ではそのレジスタを適当な場所に保存します。 戻るときは、保存したレジスタ値をアドレスとしてジャンプします。 (リターンという命令は存在しません) 当然、同じサブルーチンを2回呼ぶなどして、保存場所を 上書きしてしまうと正しい場所に戻れません。 FORTRANで再帰呼び出しが出来ないのはこうした理由からです。 けんぼぉ [2002/08/11 Sun 13:24:36] [211.14.102.90] ども、けんぼぉです。 既にご存知かと思いますが、日経ソフトウエア 2002年9月号に、 「かんたん!マシン語入門」という記事が載っています。 興味のある方はどうぞ。 日経ソフトウエア トップページ http://software.nikkeibp.co.jp/software/index.html 日経ソフトウエア 2002年9月号 目次 http://software.nikkeibp.co.jp/software/contents/2002/0209index.html ビギナー [2002/08/06 Tue 11:19:37] [219.164.201.252] 始めまして、ビギナーと申します。お世話になります。 Z80に対応した「C++仕様書工房」のようなCASEツールがあれば 教えて頂けませんか?フリーソフト、シェアウェア、PKGソフト 問いません。 情報をお持ちの方、至急書き込み願います。 澤口@一升金 [2002/08/01 Thu 19:53:15] [61.197.17.244] 澤口@一升金です。 to 瑞樹さん: 何をどうやってアセンブルしようとされているんでしょうか。 具体的に行った操作が見えないと、よくわかりません。 瑞樹 [2002/08/01 Thu 09:28:23] [210.250.88.201] やっとMASM手に入れたことは入れたんですが(QEditerも含めて)、 アセンブルができない…んですね。 んで、メッセージをよく見ると、 バッチファイルがおかしいとか言ってるんです。 バッチファイルって、どれを変更すれば良いんですか? それとも、全部変更するんでしょうか? : |
e-mail: mist@e-net.or.jp | Structured Anchor Tree Return to Menu Return to Parent Menu |
Powered by Unit Missing Link. |