You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从汇编清单判断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。
  • M/R版本区分:
    • M版本:操作数是内存寻址表达式(比如[rcx+8]、[rdi]这类)。
    • R版本:操作数是寄存器(比如ebx、r12这类)。

二、示例代码分析

给出的汇编代码片段:

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
  1. 位数版本:
    代码中idiv的操作数标注了DWORD PTR,明确是32位宽度;同时前面的cdq指令是将EAX的符号位扩展到EDX,这正是32位IDIV要求的被除数准备操作(32位IDIV需要EAX:EDX作为被除数)。这里的rcx是64位寄存器只是用来做内存寻址,和IDIV的位数版本无关。
  2. M/R版本:
    idiv的操作数是[rcx+8],属于内存寻址,所以这是IDIV M32版本。

内容的提问来源于stack exchange,提问作者Vladislav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:27:08