2017-12-28 35 views
-4

私はx86リアルモードで動作するオプションROM(拡張ROM)のINT 13Hディスクサービスルーチンを開発中です。 DS(DS = CS)にあるグローバル変数にアクセスする必要がありますが、ルーチンは実行されていますが、グローバル変数は読み取り専用になります。 SS(SS!= DS)に位置するローカル変数だけが正常にアクセスできますが、スタックのサイズは十分ではありません。 必要なサイズはルーチンで約2KBです。私の質問は以下の通りです:x86リアルモードでグローバル変数にデータを格納する方法ISR?

  1. ルーチン内のグローバル変数にデータを保存することはできますか?
  2. ルーチンで2KBの使用可能なメモリを見つけて見つける方法は?

ありがとうございます。オプションROM(拡張ROM) の

int global_var; 

void __far int13h_isr(void) 
{ 
    int local_var; 

    __asm 
    { 
     push ds 
     push es 
     mov  bx, cs 
     mov  ds, bx 
     mov  es, bx 
    }; 


    global_var = 0x22; // global variable can NOT store 0x22 in the routine. 
    local_var = 0x22; // local variable can store 0x22 correctly. 

    __asm 
    { 
     pop es 
     pop ds 
    };  
} 
+0

ここで「できない」とは何ですか?それはいけません?コンパイルエラーまたはランタイムエラーが発生しますか?このようにCとアセンブリを混在させることはできますか?生成されたアセンブラコードを確認しましたか? – usr2564301

+0

@ usr2564301:メモリアクセスは別の場所に移動します。 – Joshua

+0

ここにデバッグヘルプを表示するには[mcve]を投稿する必要があります。質問自体に問題を再現するすべてのコード、コードをビルドするために行った手順、コードの実行方法、予想された動作、実際にどのような動作を含める必要があります。 –

答えて

0

INT 13Hディスクサービスルーチンは、それがルーチンでグローバル変数にデータを保存することは可能ですか?

データをROMに格納することはできません。拡張カードは、デバイスドライバをロードする前にメモリが必要な場合は、それ自身のメモリを必要とします。

ルーチンで2KBの使用可能なメモリを見つける/見つけ出す方法は?

デバイスドライバはISRと共にメモリを割り当てることができますが、拡張固有のINT 13Hコールを使用する前に、MSDOSまたは他のオペレーティングシステムがブートしてデバイスドライバをロードできる必要があります。

+0

にrcgldr: 1. ISRで2KBの安全なRAMを見つける方法を教えてください。 2.私は、MSDOSやその他のオペレーティングシステムが、拡張固有のINT 13H呼び出しを使用する前に、デバイスドライバを起動して読み込むことができなければならないということをよく理解していません。私はISRのメモリを見つけるべきではないのですか? – marky1

+0

@ marky1 - 例としてMSDOSを使用して、デバイスドライバがロードされている場合(通常はconfig.sysの間)、 "safe ram"を保持するために、INT 21H経由で終了するときにそのRAMをイメージの一部として含める必要があります、AX = 03100H、DX =ドライバーの末尾のアドレス。ドライバーはメモリに残ります。私の答えで述べたように、デバイスドライバがロードされるまで、2KのRAMを必要とする拡張固有の呼び出しは使用できませんでした。 – rcgldr

関連する問題