1、CPU内部通用寄存器由32位扩展到64位 即EAX、 EBX、 ECX、 EDX、 EBP、
ESP、 EIP、 ESI、 EDI 扩展为RAX、 RBX、 RCX、 RDX、 RBP、RSP、 RIP、 RSI、 RDI 并且增加了 8 个新的寄存器:R8-R15
2、调用约定不同,32位支持 c 、stdcall、fastcall、64位下就一样:fastcall。具体就是 函数调用的前4个参数 用rcx 、rdx、r8、r9、4个寄存器传递,其余的用堆栈传递。 但保留前4个参数的堆栈空间
3、非易失寄存器 rbx、 rsi 、rdi、 r12、 r13、 r14 、r15这几个寄存器用完之后记得要 恢复它原始的值。通俗地说就是你可以在自己的函数内部使用这些寄存器,但用完 之后必需恢复它原始的值,windows应用层和内核层同样遵循这个原则,本人经常使 用这些寄存器作 while 循环的计数器用,windows api调用不会修改这几个寄存器的 值。
mov rbx,100
.while rbx {} 0;rbx !=0
;;;;;
;;;;;
invoke MessageBox,0,0,0,MB_OK
dec rbx
.endw
4、SEH 异常机制不同,64位下异常机制已经不使用FS寄存器,会在节表中存储异常结 构,这个在之后的篇幅中会专门介绍。心急的朋友可以调试一下NTDLL!KiUserExceptio nDispatcher 这是应用层异常的总入口,RtlDispatchException 是对64位程序异常的处理 过程 ,包括对AddVectoredExceptionHandler 、SetUnhandledExceptionFilter 的处理, 如果你想在应用层面单步调试的话,这里是个好地方,VMP也可以调试。
5、微软 64位汇编编译器已经不支持高级语法以及 INVOKE调用,所以我们必需使用一个 vasily.inc 的宏才能继续使用高级语法,从字面看貌似是一个俄国人编写的。
6、64位汇编要求函数调用堆栈16字节对齐(windows 会在我们愉快地调用它提供的API时 使用MOVDQA之类的多媒体指令,这指令如果内存不对齐在16字节的话,那就直接报异 常)x64macros.inc 已经为我们默默做好了这一 切。
7、32位汇编不熟悉的话可以参考罗云彬的《Windows环境下32位汇编语言程序设计》
8、想对64位CPU有更深的理解看邓志《x86/x64体系探索及编程》《处理器虚拟化技术》
9、还有很多很多不同的地方。
10、以上两位作者都是神一样的存在。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/15411.html