简单的assembly问题

; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) _wWinMain@16 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中定义int的标准程序是

var_x = dword ptr y?

谢谢

一个。 DWORD是无符号的,32位:请参阅此处 (旧名称,当Windows为16位时,MS开始使用它)。

湾 堆栈顶部(dword ptr 0)由返回地址占用

C。 这里的变量y不起作用。 无论如何, dword ptr这种系统化使用是某些汇编程序和反汇编程序的特征,而不是“标准程序”。

一个。

  • 字:2个字节
  • dword:4个字节
  • qword:8个字节

双字是机器字。 这些名称是从Win16inheritance的,其中2个字节实际上形成了一个机器字。

湾 该数字表示堆栈上返回地址的相对偏移量。 bytes 0..3是返回地址本身。 bytes <0是局部变量,> = 4是函数的参数。 查看汇编程序教程了解详细信息。 在纯ASM中编写几个函数是理解这些细节的最佳方法。

C。 ASM不是标准化的。 所以没有标准程序。

(a) dword实际上是一个普通的单词,它是32位的。

(b)堆栈索引不一定是通过堆栈指针而是通过帧指针完成的。 (IA-land中的“Base”指针。)将设置frame,err,base,pointer以使堆栈跟踪成为可能。 本地和参数可能位于内存中较低的地址,堆栈上的“较高”。

(c)不太可能几乎所有其他汇编程序, 英特尔格式实现了这种抽象,其中数据类型具有宽度而不是类型指令,因此汇编程序选择基于8位,16位或32位操作码1你的操作数声明。 我已经写了很多ia32程序集,但仅限于其他各种汇编程序2 ,所以我无法评论这种非​​常规方法在实践中是如何工作的。 从远处来看似乎有点笨拙……


1.从技术上讲,16位和32位操作码是相同的,但可选的前缀字节在16位和32位模式之间切换。
2.另一种IA32汇编程序格式称为歇斯底里葡萄干的AT&T格式