如何从ASM堆栈中的C代码访问双指针

我有一个main.c函数,它有以下声明:

 int initarr(int**arr, int n, int (*initfunc)(int)); 

然后我在c调用函数:

 success = initarr(&arr, n, getNum); 

问题是,在汇编代码中,在MODEL SMALL ,上面函数中的第一个参数将作为WORDDWORD存在于内存中?

换句话说,当我编写代码时,这会工作:

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

现在DI将持有arr的地址。

如果是,如果是这样,我怎样才能访问arr [0]的值?

 PUSH BP MOV BP,SP PUSH DI PUSH BX MOV DI, WORD PTR[BP+4] MOV BX, WORD PTR[DI] 

BX会保存数组的地址吗? 我的意思是,第一个细胞的地址?

如果是这样,我现在如何访问arr [0]?

也许MOV DX, WORD PTR[BX]

小型模型中 ,地址大小为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].