最近在看 code 時,發現有位朋友在傳遞結構時,並不是傳遞該結構位址,而是直接將該結構當成參數直接丟給呼叫的函式。

對於慣用指標的我,一時之間不太能夠說清楚這種傳遞方式跟傳指標的方式有什麼差異,因此可以在這裡好好研究一下。

 

以下列程式為例:

PCI_DEV是一個結構:

image

以下這段 code 跑起來會變成:

image

image

image

其中,SI 會是 C code 中的 Bus,BX 會是 C code 中的 Device,而 DI 會是 C code 中的 Function。

將記憶體 dump 出來後會是:

image

紅色箭頭處是RSP+58h,而藍色箭頭處則是RSP+60h。

也就是說,stack 中會有一個 PciDev (RSP+58h 的地方),Bus/Device 的值會填入,再將它複製到 stack 中的另一處 (RSP+60h)。

但這邊看到的是 Function 的值則是直接填到 RSP+60h。

而 RSP+60h 的位址則會透過 RCX 傳遞給 CreatePciDeviceNode()。

 

接著,當我們改成下面的傳遞方式時:

image

此時跑起來則會變成:

image

這應該就非常好懂了。

Stack 中有一個 PciDev (RSP+58h),SI/BX/DI,也就是 Bus/Device/Function 分別被填到相對應的 offset,而 RSP+58h 的位址則是透過 RCX 傳給了 CreatePciDeviceNode()。

 

以上其實就是 call by value 及 call by address 的差別,即使是傳遞的資料型態是結構也是一樣的概念。

 

 

arrow
arrow
    全站熱搜

    zxlin 發表在 痞客邦 留言(0) 人氣()