【问题标题】:How do I access double pointer from C code in ASM's stack如何从 ASM 堆栈中的 C 代码访问双指针
【发布时间】:2016-05-21 17:08:04
【问题描述】:

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

【问题讨论】:

  • 用C写,编译,用调试器看看生成了什么。
  • @PaulOgilvie 这是个好主意。我回家后会检查一下并更新!

标签: c assembly x86-16 dos


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多