Windows编程学习记录(一)

1.子系统 

 

 

LNK2019错误,C28251警告,说明这个程序没有识别到main函数。原因是项目->属性->链接器->子系统应该选择窗口而不是控制台。

下面对子系统的说明写了:子系统的选择会影响链接器将选择的入口点符号或入口函数。 

 

 2.匈牙利命名法

可参考:https://blog.csdn.net/qq_44721831/article/details/98350315

 

3.__cdecl, __stdcall, __fastcall

    函数的调用方式。在高级语言层次不容易看出区别,在汇编语言环境下可以很容易的看出区别。

(1)__stdcall(WINAPI就是__stdcall的宏定义),参数从右到左传,所以在汇编中看压栈的时候参数是从右到左压的,用时堆栈平衡由被调用者维持,即在返回前能看到retn xxx的操作,返回后没有操作。

(2)__cdecl,参数同样是从右到左,由调用者负责维持堆栈平衡,所以返回前看到的是retn,返回后有add esp, xxx的操作

(3)__fastcall,左边开始的两个不大于4字节(int)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送。其他和stdcall一样。即就是说两个4字节参数以内就不用清栈了,因为没有压栈操作,多的按照__stdcall处理。因为寄存器比内存快很多,所以叫做fastcall

(4)__pascal ,和__stdcall的区别是从左往右传参,其余一样。

(写到这里想起了SPRC架构下的函数传参都是用的寄存器,同时是从左往右传的参数,不知道会不会比X86要快很多呢?)

自己写程序截图太麻烦,贴一个有图并且讲的很清楚的文章:https://www.cnblogs.com/yenyuloong/p/9626658.html

学逆向理解这些调用方式很重要,因为内嵌代码的时候需要保持堆栈平衡。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值