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