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

如何计算指令的字节数?请结合cs-app示例讲解计算方法

x86-64指令字节数计算详解

下面逐个拆解你提到的4条指令的字节构成:

1. xorq %rdx, %rdx(3字节)

这条指令是64位寄存器间的异或操作,编码由3部分组成:

  • REX前缀(1字节):0x48,用于标识64位操作模式
  • 操作码(1字节):0x33,对应xor指令的寄存器到寄存器操作
  • ModR/M字节(1字节):0xD2,其中Mod=11(寄存器寻址)、REG=010(源寄存器%rdx)、RM=010(目标寄存器%rdx)
    三者相加:1+1+1=3字节

2. xorl %edx, %edx(2字节)

这条是32位寄存器间的异或操作,无需REX前缀:

  • 操作码(1字节):0x33
  • ModR/M字节(1字节):0xD2(逻辑同上面,对应%edx)
    相加:1+1=2字节

3. movq $0, %rdx(7字节)

这条是将立即数0写入64位寄存器%rdx,采用符号扩展32位立即数到64位的编码方式:

  • REX前缀(1字节):0x48,标识64位模式
  • 操作码(1字节):0xC7,对应“立即数写入寄存器”的操作类型
  • ModR/M字节(1字节):0xC2,Mod=11(寄存器寻址)、REG=000(指定操作类型)、RM=010(目标寄存器%rdx)
  • 32位立即数(4字节):0x00000000,符号扩展为64位后仍为0
    相加:1+1+1+4=7字节

4. movl $0, %edx(5字节)

这条是将立即数0写入32位寄存器%edx,编码构成:

  • 操作码(1字节):0xBA,由基础操作码0xB8加上寄存器编号(%edx对应编号2)生成
  • 32位立即数(4字节):0x00000000
    相加:1+4=5字节

本质上,异或指令利用“寄存器自身异或清零”的特性,复用寄存器编码,无需额外存储立即数,因此字节数远少于直接写入立即数的mov指令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:55:35