; 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
这种系统化使用是某些汇编程序和反汇编程序的特征,而不是“标准程序”。
一个。
双字是机器字。 这些名称是从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格式 。
以上就是c/c++开发分享简单的assembly问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549725.html