2016-05-21 6 views
0

にCコードからダブルポインタにアクセスしない私は、次の文を持っているmain.c機能を持っています質問は、アセンブリコードでは、MODEL SMALLで、上記の関数の最初の引数はWORDまたはDWORDのようにメモリにありますか?言い換えればがどのように私はASMのスタック

、私はコードを書く、意志この作品:

PUSH BP 
MOV BP,SP 

PUSH DI 
MOV DI, WORD PTR[BP+4] ; DI will hold &arr. 

そして今DIは、ARRのアドレスを保持します。

trueの場合、どうすればarr [0]の値にアクセスできますか?

BXはアレイのアドレスを保持しますか?つまり、最初のセルのアドレスですか?

もしそうなら、今すぐarr [0]にアクセスできますか?

おそらくMOV DX, WORD PTR[BX]

+1

書き込みそれをC言語でコンパイルし、生成されたものをデバッガで探します。 –

+0

@PaulOgilvieこれは素晴らしい考えです。私が家に帰って更新するとき、これをチェックします! –

答えて

1

モデル小では、アドレスのサイズは2バイトです。二重ポインタはまだアドレスです!

ARRにアクセスするために[0]は、次のように記述します。

MOV DI, [BP+4] ; no need casting, DI register is sized 2 bytes. 
MOV SI, [DI] ; get what DI is pointing to, and put it to SI. 
       ; you could say: DI=arr[][], SI = arr[] 
MOV AX, [SI] ; now AX = arr[0] 

我々はARRにアクセスしたい場合は、[i]は、我々は次の操作を行います:

MOV DI, [BP+4] 
MOV SI, [DI]  
MOV AX, i 
SHL AX, 1 ; because arr[] contains int numbers which are sized 2 bytes. 
ADD SI, AX 
MOV AX, [SI] ; now AX = arr[i]. SI = &arr[i]. 
関連する問題