CS:APP练习题2.18疑问:反汇编器补码表示为何与预期不符?
关于CS:APP练习题2.18反汇编显示的疑问解答
这是反汇编器的可读性优化导致的,核心原因有两点:
立即数的长度适配
反汇编器会根据指令的类型自动选择最紧凑的表示方式。比如如果这条指令使用的是8位立即数(比如movb或带8位偏移的跳转指令),-0x58(十进制-88)刚好能被8位补码表示(8位补码范围是-128到127),反汇编器就会直接用这个更简洁的负数十六进制形式展示,而非扩展成32位的0xFFFFFFA8。补码的等价性
从补码原理来看,-0x58作为8位补码,扩展到32位时会自动符号扩展为0xFFFFFFA8,二者在CPU执行时的语义完全等价。反汇编器优先展示更直观、更短的形式,方便程序员快速理解数值大小,而非机械输出全长度补码。
举个实际例子:如果是addl $-0x58, %eax这类指令,反汇编器显示的$-0x58对应机器码里的0xA8(8位立即数),CPU执行时会自动将其符号扩展为32位的0xFFFFFFA8再参与运算,结果和直接使用32位立即数完全一致。
内容的提问来源于stack exchange,提问作者Kumaravel Rajan
相关产品推荐
相关产品推荐

