VCでのアセンブラについて

[戻る]
むせん 2002/11/27(水) 16:25:41
アセンブラコードをVCに取り入れるのは、_asmを使えばできるのですが、JMP0000:0600という
コードがエラーになってしまいます。
ラベルつきのジャンプはできるのですが、直接メモリのアドレスにジャンプすることは可能なの
でしょうか?
よろしくお願いします。

環境 VC++6.0 Win98SE 

2002/11/27(水) 16:45:49
うろ覚えですが、VC のインラインアッセンブラーの元になったと思われる MASM は
インテルのマクロアッセンブラーに準拠しているのでジャンプはラベルにしか出来
ないかと思います

それに、Win32 でしかも 32bit コードしかはけない(生成しない)VC++6.0 で
セグメント間ジャンプする意図は何でしょうか?

YuO [E-Mail] 2002/11/27(水) 16:47:16
jmp 即値
はMASM 6(6.00AD for NEC PC-9800series)でも無効でした。
というわけで,
mov eax, 即値
jmp eax
なら受け付けてくれます。ただし……。

0000:00000600
なんてアドレスへのジャンプ,
ヌルセグメントアクセスに特権違反でまず止まりますね。
即値へのjmp命令なんてWindowsのユーザープログラムじゃ絶対使わないですよ。

むせん 2002/11/27(水) 17:38:22
島さん、YuOさん、ご回答ありがとうございます。
直接アドレスにジャンプするのでなく、レジスタを介してなら一応エラーはなくなりました。
ただおっしゃるとおりWindowsでは不正な処理って言われました。
DOSではないのですが、正しく動いていないようです。
今、フロッピーからHDDのブートセクタの情報を読んで、それをメモリにいれてHDDをブートさ
せるプログラムを作っているのですが、なかなかうまくいかない状況です。
要するにフロッピーからHDDをブートさせるってものです。
そもそも根本的に無理のかもしれないって思い始めましてきました。

アイススケーター 2002/11/27(水) 19:50:16
インターフェース7月号にlinuxを利用したFDブートの方法が載っていました。
参考になれば幸いです。
ソースは、CQ出版のHPからダウンロードできます。

2002/11/27(水) 23:00:20
DEBUG などが手に入って、使い方も判るのなら身近なプログラムを書いて

動作試験をすることは不可能ではないかもしれません

(DEBUG なら COM (リロケーションが必要でない)実行形式はファイルに
保存することも読み込むことも可能だったと思う)

アイススケーター 2002/11/28(木) 08:08:32
>インターフェース7月号にlinuxを利用したFDブートの方法が載っていました。

続き

デバッグを行う場合には、x86シミュレーター(Bochs)の説明もあり、デバッガも利用
できるようです。
x86シミュレーター(Bochs)は、pC/ATの環境をシミュレートするフリーのソフト
でデバッグするにはとっても便利ではないかと・・・

むせん 2002/11/29(金) 15:06:48
アイススケーターさん、島さん、アドバイスありがとうございます。
LINUXは扱ったことないんですが、ソースを見てみてみます。
何か参考になればなっと思ってます。
島さんがおっしゃってたDEBUGは何なのでしょうか?
DOSコマンドのDEBUGではないような気がするのですが・・・。

アイススケーター 2002/11/29(金) 21:52:41
むせんさんへ

フロッピーブートの内容は、LINUXとは関係なくブートする(自作のプログラムをロ
ード)までのことを記述してあります。その後で、LINUXのシステムブートの記述が
ありますので、その部分をむせんさんの作りたい部分へ改造すればOKではないかと思い
ます。

2002/11/30(土) 00:12:07
DEBUG とは MSDOS や PCDOS に付属していた DEBUG.COM/.EXE? のことです
Ver. 5.0 以降には標準では付属していないと思います

MSDOS で動作するプログラムですから当然 16bit アプリケーションです

むせん 2002/12/02(月) 09:42:10
島さん、アイススケーターさん、アドバイスありがとうございます。

アイススケーターさんへ
2002年の7月号ですよね?
ブートに関係するプログラムを参考にもう少し考えてみます。
島さんへ
やはりMSDOSにはいってあるDEBUGコマンドのことですね。
DEBUGコマンドでの手打ちではブートすることはできました。
それをなんとかCのプログラムで実現できたらって思っています。

ご親切なアドバイス、とても感謝しております。

古いスレッドには追加発言できません。