云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

windows 环境下64位汇编语言与32位的区别

jxf315 2024-12-30 04:50:36 教程文章 48 ℃

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、以上两位作者都是神一样的存在。

Tags:

最近发表
标签列表