2016-11-28 3 views
1

を使用した場合、アドレスのサイズを決定するためにBYTE PTRの使用:で起こる私はMBRコードを把握しようとしています(リアルモードでの16ビットアセンブリコード)と私はこれらの行を持つデータセグメント

mov si,0x7cd8 
lods al,BYTE PTR ds:[si] 

何リアルタイムでは、物理アドレスは「D8」です - どのように知っていますか?これは、文字列を読み込んで文字列に出力するために使用されるためです。それがこのプログラムを実行するときに私が見ることができる最初のことであり、これらはコードの最初の行です。

私の質問は、物理アドレス(セグメント* 16 +オフセット)を取得するために計算が行われたか、またはBYTE PTRがSIアドレスがバイト型であり、読み込むデータの型はバイト型ですか?

+2

タイプは関係ありません、それは 'segment * 16 + offset'のためです。物理アドレスは 'ds = 0 'の' 0x7cd8'です。それ以外の場合は動作しません; – Jester

+0

'BYTE PTR'は、ターゲットサイズが明白でない場合にのみ必要です。あなたの 'lods ...'は 'lodsb'と書かれています。最後に、 'ds'はとにかく' lodsxx'のデフォルトセグメントレジスタなので、セグメントのオーバーライドは不要です。 –

答えて

3

セカンドライン

lods al,BYTE PTR ds:[si] 

単に命令LODSB(アドレスDS:SIINC SIからバイトをロードする)の逆アセンブラ出力です。アセンブラで

あなた

負荷を意味し、単純な書き込みLODSBアドレスDSからのバイトになります。バイトにSIがその後ALとインクリメントSIを登録

DSのセグメントの問題については:もちろんアクセスされたアドレスは数式(segment * 16 + offset)によって計算されますが、DSを任意の値に設定することができ、のみSIがinstrucによってインクリメント(ポストリード)されますそれにもかかわらず、

DSは任意の値をとります。

+0

私は今理解しています。 DSは手動ですべてのプログラムを変更しているわけではないので、常に0(デフォルト)のままですか? – sitoNz

+3

@sitoNz:私は(真剣に)知らない。 'DS'の値は、これら二つの行が実行される前のどこかで定義されます。デフォルト値がMBRの(非常に)悪い習慣になると仮定します。 – zx485

関連する問題