簡體   English   中英

如何從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的地址。

如果為true,那么我將如何訪問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]

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].

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM