网站首页 > 教程文章 正文
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-12-30 互联网面经宝典 - 实战篇(阿里巴巴)
- 2024-12-30 「教程」风光摄影达人的杀手锏:延时+堆栈
- 2024-12-30 不同类型的AGV适用于哪些场景呢? agv应用于什么场合
- 2024-12-30 JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解
- 2024-12-30 【打印机驱动】PS, PCL 和 PCL6 有什么不同?
- 2024-12-30 类(class)与结构(struct)的区别? 类class与结构体struct的比较
- 2024-12-30 为什么使用ND减光镜而不是后期堆栈?
- 2024-12-30 深入理解Android NDK日志符号化 日志sdk
- 2024-12-30 佳能R系列R3、R5C、R5、R6、R、RP这6款微单哪一个更值得购买呢?
- 2024-12-30 相信我:整合您的监控堆栈 相控阵检测
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)