; 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字节?是一个双关语8?
b)为什么var_4设为-4?为什么不开始,比方说,0?
c)在c中定义int的标准程序是
var_x = dword ptr y?
谢谢
答案 0 :(得分:2)
一个。 DWORD是无符号的,32位:请参阅here(旧名称,当Windows为16位时,MS开始使用它。)
湾堆栈顶部(dword ptr 0)由返回地址
占用℃。这里的变量y
不起作用。无论如何,dword ptr
的这种系统使用是某些汇编程序和反汇编程序的特征,而不是“标准程序”。
答案 1 :(得分:1)
一个。
dword是机器词。这些名称是从Win16继承的,其中2个字节实际上形成了一个机器字。
湾该数字表示堆栈上返回地址的相对偏移量。 bytes 0..3是返回地址本身。字节< 0是局部变量,> = 4是函数的参数。查看汇编程序教程了解详细信息。在纯ASM中编写几个函数是理解这些细节的最佳方法。
℃。 ASM不是标准化的。所以没有标准程序。
答案 2 :(得分:0)
(a) A dword
实际上是一个简单的单词,它是32位。
(b)堆栈上的索引不一定是通过堆栈指针而是通过帧指针完成的。 (IA-land中的“Base”指针。)将设置frame,err,base,pointer以使堆栈跟踪成为可能。本地和参数可能位于内存中较低的地址,堆栈中的“更高”。
(c)不太可能几乎所有其他汇编程序, Intel格式实现了这种抽象,其中数据类型具有宽度而不是键入的指令,因此汇编程序根据您对操作数的声明选择8位,16位或32位操作码 1 。我已经编写了很多ia32程序集,但只在各种其他汇编程序 2 中编写,所以我无法评论这种非常好的方法在实践中是如何工作的。从远处来看似乎有点笨拙......
1。从技术上讲,16位和32位操作码是相同的,但可选的前缀字节在16位和32位模式之间切换。
2.另一种IA32汇编程序格式称为 AT& T格式,用于歇斯底里的葡萄干。
功能