如何从 ASM 堆栈中的 C 代码访问双指针
How do I access double pointer from C code in ASM's stack
我有一个 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].
我有一个 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].