当前位置: 代码迷 >> 汇编语言 >> 32位汇编与高级语言的区别解决方法
  详细解决方案

32位汇编与高级语言的区别解决方法

热度:8277   发布时间:2013-02-26 00:00:00.0
32位汇编与高级语言的区别
小弟初学习windows32位汇编开发,以前我是用C++的
有很多指令不是太懂请教
==========================
_ProcDlgMain         proc     uses   ebx   edi   esi   hWnd,wMsg,wParam,lParam

在汇编中的函数定义为什么要那样写特别是前面的
uses   ebx   edi   esi   着3个寄存器在这里有什么用汇编语言的参数是如何的
传递的,如果在C语言中:

这样定义函数   void   s(int   a,int   b)
要这样使用s(a,b)
但是我在32未汇编中很少看到参数的传递
有些是这么写的
invoke   DialogBoxParam,eax,DLG_MAIN,NULL   offset   _ProcDlgMain,NULL
我知道上面的offset   _ProcDlgMain是传递的函数地址那参数呢?

最后还有一个问题就是函数返回值的问题
是不是在32位汇编中函数返回ret都是默认的eax寄存器的内容,那怎么看出来返回的
是bool类型还是int类型
象这个_ProcDlgMain函数的最后是
                      mov   eax,FALSE
                  ret
  .endif
  mov   eax,TRUE
  ret
象这样的函数的返回值是不是就是bool的


------解决方案--------------------------------------------------------
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
--------------------
uses ebx edi esi 是指 _ProcDlgMain 这个子程要使用到 ebx edi 和 esi 寄存器, 这样编译程序会在子程的开始自动加上将它们压栈的指令, 在子程结束返回前加上出栈恢复它们的指令.
hWnd, wMsg, wParam, lParam 就是传递给 _ProcDlgMain 子程的参数, 如同上面的那个 int a, int b 似的


invoke DialogBoxParam,eax,DLG_MAIN,NULL offset _ProcDlgMain,NULL
--------------------
这个是调用 DialogBoxParam 函数的意思. eax, DLG_MAIN, NULL, offset ProcDlgMain, NULL 都是传递给 DialogBoxParam 函数的参数. 这里的 offset ProdDlgMain 是将 ProcDlgMain 子程的起始地址作为参数传送给 DialogBoxParam 函数的, 和 ProcDlgMain 子程的参数没用关系


返回值的问题, bool 和 int 在汇报级上都是 dword 来表示的. 一个值, 是什么样数值的类型, 有你处理它的方法决定的. 如果是 bool 类型, 一般是通过查看它是否为 0 来决定是否是 false; 往往认为非 0 即是 true
  相关解决方案