如何从汇编清单判断x86内存操作数宽度、类型及IDIV指令版本?
IDIV指令版本判断方法及示例分析
一、IDIV版本的核心判断规则
IDIV的版本区分主要看两个维度:操作数宽度(32位/64位)和操作数类型(内存/寄存器):
- 位数版本判断:
- 32位版本(IDIV M32/R32):操作数为32位(汇编中用
DWORD PTR标识),隐含使用EAX:EDX作为被除数,商存在EAX,余数存在EDX。 - 64位版本(IDIV M64/R64):操作数为64位(汇编中用
QWORD PTR标识),隐含使用RAX:RDX作为被除数,商存在RAX,余数存在RDX。
- 32位版本(IDIV M32/R32):操作数为32位(汇编中用
- M/R版本区分:
- M版本:操作数是内存寻址表达式(比如
[rcx+8]、[rdi]这类)。 - R版本:操作数是寄存器(比如
ebx、r12这类)。
- M版本:操作数是内存寻址表达式(比如
二、示例代码分析
给出的汇编代码片段:
vdiv(std::vector<int, std::allocator<int> >&): mov rcx, QWORD PTR [rdi] mov eax, DWORD PTR [rcx+4] cdq idiv DWORD PTR [rcx+8] mov DWORD PTR [rcx], eax ret
- 位数版本:
代码中idiv的操作数标注了DWORD PTR,明确是32位宽度;同时前面的cdq指令是将EAX的符号位扩展到EDX,这正是32位IDIV要求的被除数准备操作(32位IDIV需要EAX:EDX作为被除数)。这里的rcx是64位寄存器只是用来做内存寻址,和IDIV的位数版本无关。 - M/R版本:
idiv的操作数是[rcx+8],属于内存寻址,所以这是IDIV M32版本。
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

