最近在看 code 時,發現有位朋友在傳遞結構時,並不是傳遞該結構位址,而是直接將該結構當成參數直接丟給呼叫的函式。
對於慣用指標的我,一時之間不太能夠說清楚這種傳遞方式跟傳指標的方式有什麼差異,因此可以在這裡好好研究一下。
以下列程式為例:
PCI_DEV是一個結構:
以下這段 code 跑起來會變成:
其中,SI 會是 C code 中的 Bus,BX 會是 C code 中的 Device,而 DI 會是 C code 中的 Function。
將記憶體 dump 出來後會是:
紅色箭頭處是RSP+58h,而藍色箭頭處則是RSP+60h。
也就是說,stack 中會有一個 PciDev (RSP+58h 的地方),Bus/Device 的值會填入,再將它複製到 stack 中的另一處 (RSP+60h)。
但這邊看到的是 Function 的值則是直接填到 RSP+60h。
而 RSP+60h 的位址則會透過 RCX 傳遞給 CreatePciDeviceNode()。
接著,當我們改成下面的傳遞方式時:
此時跑起來則會變成:
這應該就非常好懂了。
Stack 中有一個 PciDev (RSP+58h),SI/BX/DI,也就是 Bus/Device/Function 分別被填到相對應的 offset,而 RSP+58h 的位址則是透過 RCX 傳給了 CreatePciDeviceNode()。
以上其實就是 call by value 及 call by address 的差別,即使是傳遞的資料型態是結構也是一樣的概念。
全站熱搜
留言列表