简单的装配问题

时间:2009-09-08 16:43:07

标签: c++ c 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字节?是一个双关语8?

b)为什么var_4设为-4?为什么不开始,比方说,0?

c)在c中定义int的标准程序是

var_x = dword ptr y?

谢谢

3 个答案:

答案 0 :(得分:2)

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

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

占用

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

答案 1 :(得分:1)

一个。

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

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格式,用于歇斯底里的葡萄干。 功能