简单比较中的题
PSTR psTest = "/x89";
0x89 == psTest[0]
是否 成立?
不成立.
我本来很疑惑, PSTR[0] 是一个 byte , 0x89 也是一个byte .
反汇编如下:
003533E7 8B 45 08 mov eax,dword ptr [psTest]
003533EA 0F B6 08 movsx ecx,byte ptr [eax]
003533ED 81 F9 89 00 00 00 cmp ecx,89h
003533F3 75 09 jne xxxxxx (3533FEh)
注意是 movsx
所以 0x89 ----> 0xFFFFFF89
这样就使得 0x89 != psTest[0]
实际上 PSTR 是一个 char *
他似乎被编译器默认转化为一个有符号数, 在32位中, psTest[0] 被有符号扩展为一个 DWORD 大小的数据.
所以0x89 作为有符号数扩展为 DWORD 成为了 0xFFFFFF89 .
这也是为什么会有 movsx
最后,我把语句改为: 0x89 == (BYTE)(psTest[0])
movsx 就被改成了 movzx
最后结果也为 TRUE
P.S: 有时候会发生一些看似异常的问题,需要我们注意 .
codes for comicOnline.download.getFileType
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏