2009-09-08 72 views
1
; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) 
[email protected] proc near 

var_4= dword ptr -4 
hInstance= dword ptr 4 
hPrevInstance= dword ptr 8 
lpCmdLine= dword ptr 0Ch 
nShowCmd= dword ptr 10h 

從我可以看到,最後4個變量是傳遞給WinMain函數的參數。另外,var_4必須是我在函數體中稍後聲明的int變量。現在,我有幾個問題:簡單的組裝問題

a)在32位Windows程序中,單詞的大小是多少? 4字節?作爲一個dword 8?

b)爲什麼var_4設置爲-4?爲什麼不開始,比方說,0?

C)一種在C定義整數標準程序是雖然

var_x = DWORD PTR Y'

謝謝

回答

2

a。 DWORD是無符號的,32位:參見here(舊名稱,MS在16位時開始使用它)。

b。堆棧頂部(dword ptr 0)被返回地址佔用

c。變量y在這裏不起作用。無論如何,這種系統使用dword ptr是某些彙編器和反彙編器的特點,而不是「標準程序」。

+0

感謝您的回答。但我將我的變量定義爲int。它如何顯示爲無符號的32位變量?或者,這只是意味着它是一個指針(顯然是一個無符號整型?) – 2009-09-08 17:06:04

+0

這些只是宏定義,以幫助使組件清晰。它們是偏移量w.r.t.到幀指針。 – user7116 2009-09-08 17:08:42

+3

@devoured elysium ASM中的有符號和無符號數據沒有區別。他們只是32位。不同之處在於你使用什麼指令來操作它們。 – 2009-09-08 17:12:49

0

(a) A dword實際上是一個普通的詞,它是32位的。

(b)堆棧索引不一定通過堆棧指針完成,而是通過幀指針完成。 (IA-land中的「Base」指針)。將設置幀,err,base,pointer來使堆棧跟蹤成爲可能。內存中的地址和參數可能較低,堆棧中「較高」。

(C)不大可能幾乎所有其他的彙編,該Intel格式實現這個抽象在數據類型有寬度,而不是鍵入的操作指令,所以彙編選擇了8位,16位,或基於您的操作數聲明的32位操作碼。我已經寫了很多ia32程序集,但只有在各種其他彙編程序,所以我不能評論這種休假方法在實踐中如何工作。這似乎從遠處種笨重...


1.技術上的16位和32位的操作碼是相同的,但可選的前綴字節16位和32位模式之間切換
2.對於歇斯底里葡萄乾,另一種IA32彙編程序格式稱爲AT & T格式

1

a。

  • 字:2個字節
  • DWORD:4個字節
  • qword的:8個字節

的DWORD是機器字。這些名稱已從Win16中繼承,其中2個字節實際上形成了一個機器字。

b。該數字代表堆棧上返回地址的相對偏移量。字節0..3是返回地址本身。字節< 0是局部變量,> = 4是該函數的參數。有關詳細信息,請參閱彙編程序教程。在純ASM中編寫幾個函數是理解這些細節的最好方法。

c。 ASM不是標準化的。所以沒有標準的程序。