2016-12-21 15 views
-4

(CS)= 1075H、(IP)= 0300H、次の命令を実行する前に:アセンブリ言語のCALL命令

のCALL 1000H

何アドレスプログラム制御が渡されるために? 命令が実行された後のCSとIPの新しい値は何ですか?

+2

(CS)= 1075H、(IP)= 1000H – Tommylee2k

+0

caあなたはIPが1000Hになる方法を説明しますか? –

+1

コールは現在のIP(そこに戻ることができる)をプッシュし、指定されたアドレスにジャンプします。だから "1000を呼び出す" 1000にジャンプし、IPがある1000 – Tommylee2k

答えて

2

この質問に答えるには、callの説明が何であるかを考えてください。
あなたがわからない場合は、その後、look it up

実アドレスまたは仮想8086モードで遠くの呼び出しを実行すると、プロセッサは、CSとEIPの両方の電流値をとして使用するためにスタックに登録するプッシュリターン命令ポインタ。次に、プロセッサは、呼び出されたプロシージャのターゲットオペランドで指定されたコードセグメントおよびオフセットに対して「遠い分岐」を実行する。

ここで、ターゲットオペランドは、ポインタ(ptr16:16またはptr16:32)またはメモリ位置(m16:16またはm16:32)を使って間接的に絶対アドレスを指定します。ポインタメソッドでは、呼び出されたプロシージャのセグメントとオフセットは、4バイト(16ビットオペランドサイズ)または6バイト(32ビットオペランドサイズ)のファーストアドレス即値を使用して、命令でエンコードされます。間接的な方法では、ターゲットオペランドは、4バイト(16ビットオペランドサイズ)または6バイト(32ビットオペランドサイズ)のファーアドレスを含むメモリロケーションを指定します。 operand-size属性は、遠いアドレスのオフセット(16または32ビット)のサイズを決定します。遠いアドレスは、CSおよびEIPレジスタに直接ロードされます。 operand-size属性が16の場合、EIPレジスタの上位2バイトがクリアされます。

はあなたがIP(命令ポインタ)が300Hであること、そしてCS(コードセグメント)が1075Hであることを告げています。ドキュメンテーションでは何が起こるのでしょうか?

  1. 呼び出しから戻ったときにまず、CSIPは後で使用するためにスタックにプッシュされます。

  2. プロセッサは、指定されたコードセグメントに分岐し、オフセットします。
    この場合、1000Hになります。

    どのように影響しますかCSおよびIP?さて、CSはセグメントを変更していないため同じですが、IPが変更されるためです。 IPがなぜ変更されますか? IPであることを考えてください:実行しようとしている命令へのポインタです。実行が1000Hにジャンプする場合、実行される命令は明らかに1000Hにあるので、IP1000Hになります。 retcallからあなたの後に何が起こる

?古いCSIP(スタックにcallでプッシュされたもの)がポップされます。 CSは変更されませんが、IPは今度は300Hになります。

(これはないは無限ループを作成することに注意してください。なぜ?のでIP作品は。実行されるようにの命令を指すように命令デコード中に内部で設定されている方法の。このため、 call命令が呼び出し後の命令に、IPポイントを実行されている。そのため、あなたが戻ってIPをポップするとき、あなたはcallの実行を開始します。)

+0

'push'を実行している ''現在の '' ip''が実際に次の命令を指しているのは( 'call'命令がすでにデコードされ、' ip'が内部的に更新されているので) 1つを呼ぶ。 ...文字通りあなたの説明で(IPは300hです)、 'ret'は無限ループを作ります。 :) – Ped7g

+0

「IP」はあなたが記述する方法で動作するため、無限ループを作成しません。私は答えに明示的に含めるべきだと思う。 –

+0

ええと...私は本当に*(OP)の*を実行する前に、* "(IP)= 0300Hを意味するのでしょうか?"これはちょっと相反していて、 'org 300h'と*(デコード後)を実行する前の*として理解でき、' call'は02FDです( 'call rel16'の場合)。私はこれがCPUの内部処理と実行とデコードの違いの知識がない人にとって混乱するかもしれないと思う。 – Ped7g

関連する問題