如何计算指令的字节数?请结合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
相关产品推荐
相关产品推荐

