操作`mov [esp-4],eax`添加附加字节

大卫·彼得森

我正在对MSVC ++中的机器代码进行一些实验,并创建了一个函数,该函数使我可以围绕带符号位移的寄存器构建mov操作。一切进行顺利,直到我的功能得以建立mov [esp-4], eax突然,我的程序开始崩溃。在进行拆卸后,我发现了一些很奇怪的东西。对于此movESP寄存器偏移引用的操作,在参数字节和有符号位移之间放置了一个附加字节。该字节似乎总是为0x24。因此出于好奇,我分解了以下代码__asm块并获得了一些有趣的结果:

mov [eax - 4], eax
mov [ecx - 4], eax
mov [edx - 4], eax
mov [ebx - 4], eax
mov [esp - 4], eax
mov [ebp - 4], eax
mov [esi - 4], eax
mov [edi - 4], eax

机器代码将以上内容翻译为:

89 40 FC
89 41 FC
89 42 FC
89 43 FC
89 44 24 FC      <--- WAT!
89 45 FC
89 46 FC
89 47 FC

我在Windows计算器中键入了十六进制24,并将其切换为二进制。结果是00100100似乎是两个虚拟位,然后是ESP寄存器两次。

谁能阐明为什么会这样?我认为这超出了MS C ++编译器的怪异之处,并且直接进入了70年代或80年代(90年代?)的遗留功能领域,但是我找不到关于为什么ESP例外的在线参考资料mov操作风格谢谢!

小丑

[esp]不能modr/m使用字节进行编码,它需要一个SIB字节。请参阅表2-2。intel指令集参考中带有ModR / M字节的32位寻址形式44modr / m值编码为另一个操作数,eax然后是一个SIB字节和一个位移字节。SIB的值24进行编码[esp],见表2-3。具有SIB字节的32位寻址形式

SIB可编码所有其他变种太多,但因为这是1个字节长,汇编器不使用的形式。这是供参考的列表:

89 44 20 FC mov [eax-0x4],eax
89 44 21 FC mov [ecx-0x4],eax
89 44 22 FC mov [edx-0x4],eax
89 44 23 FC mov [ebx-0x4],eax
89 44 24 FC mov [esp-0x4],eax
89 44 25 FC mov [ebp-0x4],eax
89 44 26 FC mov [esi-0x4],eax
89 44 27 FC mov [edi-0x4],eax

就其本身而言,这不应该导致崩溃,但可能会随机尝试覆盖内存中的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何为mov eax,moffs32生成A1操作码

来自分类Dev

ESP是否与EAX一样通用?

来自分类Dev

汇编:从%esp升级到%eax

来自分类Dev

为什么GCC无法优化功能序言和结尾(push ebp; mov ebp,esp; ...; pop ebp)

来自分类Dev

为什么在组装的CALLEE中“ PUSH EBP”和“ MOV EBP,ESP”?

来自分类Dev

为什么GCC无法优化功能序言和结尾(push ebp; mov ebp,esp; ...; pop ebp)

来自分类Dev

“ mov eax,num”和“ mov eax,num”之间的区别

来自分类Dev

mov指令奇怪的目标操作数

来自分类Dev

“mov”的操作数类型不匹配

来自分类Dev

将.mov附加到MFMailComposeViewController

来自分类Dev

为什么不能做 mov [eax], [ebx]

来自分类Dev

mov eax,dword ptr [eax]有什么作用?

来自分类Dev

直接推送常量或Mov Eax和Push Eax

来自分类Dev

向 PouchDB 文档添加附加附件

来自分类Dev

VBA JsonConverter添加附加引号

来自分类Dev

jQuery:添加附加元素的属性

来自分类Dev

使用swtich添加附加条件

来自分类Dev

PIN:识别MOV和间接内存操作数

来自分类Dev

mov.b指令中的负操作数

来自分类Dev

确定NASM何时可以推断mov操作的大小

来自分类Dev

在Mac上附加.mov / .avi文件

来自分类Dev

将ESP32连接到Google Cloud Platform时,来自Mongoose操作系统的“无效gcp.key”

来自分类Dev

相当于mov eax的AsmJit,[ecx + 0CC]

来自分类Dev

可以花一些假的mov eax,esi吗?

来自分类Dev

在Arduino ESP8266中添加太多yield()有什么影响?

来自分类Dev

为什么我们在组装时使用sub esp,4而不是推送寄存器?

来自分类Dev

BluePy频繁BLE断开Raspberry Pi4和ESP32之间的连接-(Bluetooth)

来自分类Dev

在汇编中,如何将esp的地址偏移4到一个变量中?

来自分类Dev

替代popl%esp

Related 相关文章

热门标签

归档