gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:08:24 25 4
gpt4 key购买 nike

我有一个 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].

关于c - 如何从 ASM 堆栈中的 C 代码访问双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37365841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com