2009-09-08 67 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不是标准化的。所以没有标准的程序。