如何从ASM堆栈中的C代码访问双指针
我有一个main.c
函数,它有以下声明:
int initarr(int**arr, int n, int (*initfunc)(int));
然后我在c
调用函数:
success = initarr(&arr, n, getNum);
问题是,在汇编代码中,在MODEL SMALL
,上面函数中的第一个参数将作为WORD
或DWORD
存在于内存中?
换句话说,当我编写代码时,这会工作:
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].