如何解释 CPU 窗口中反汇编面板的列?

3

有一个叫做CPU窗口的工具,我按下Ctrl+Alt+C后会弹出,它显示我的代码的反汇编。

在内存地址左侧有一个绿色箭头表示当前执行点的位置,然后是内存地址,但第二列代表什么意思?为什么编译器有时会在指令之后跳过多个地址?

例如:

|first column|second column|assembly|
004520F4 55             push ebp      //continuous 
004520F5 8BEC           mov ebp, esp  //jumps to F7
004520F7 6A00           push $00      //jumps to F9
004520F9 53             push ebx      //continuous
004520FA 33D2           xor edx,edx

2
操作码。请参见例如http://sparksandflames.com/files/x86InstructionChart.html。 - Sertac Akyuz
不错,那跳跃方面呢,有什么指令大小之类的吗? - EProgrammerNotFound
1
另请参阅文档反汇编窗格 - LU RD
2个回答

10

让我们来看看代码:

004520F4 55             push ebp      
004520F5 8BEC           mov ebp, esp  
004520F7 6A00           push $00      
004520F9 53             push ebx      
004520FA 33D2           xor edx,edx

每行代表一个机器指令。呈现的信息如下:

  • 第一列是指令开始的地址,以十六进制显示。
  • 第二列是指令的机器码,以十六进制显示。
  • 第三列是将指令反汇编为汇编语言。

因此,第二列和第三列表示完全相同的信息。第三列提供了更易于理解的代码。

请注意,不同的指令长度不同。第一个和第四个指令只有一个字节长。其他指令为两个字节长。这就解释了为什么在两个字节的指令后,指令地址会增加超过一个字节。

还有一些指令可以使用多个字节,因此对于这些指令,您可以具有3、4等增量。很好的例子是调用或跳转指令,它们编码目标地址或偏移量。因此,在32位计算机上进行绝对跳转可能需要编码为5个字节,其中一个字节为操作码,四个字节为地址。

回到好旧的日子,早在我出生之前,程序员甚至没有汇编器,而是直接用机器指令编写代码。那一定很有趣!


它们是两个字节的,因为操作码是双倍的(4个字符而不是2个),还是仅仅是巧合? - EProgrammerNotFound
1
机器码以十六进制显示。因此,4个十六进制字符表示两个字节。机器不存储十六进制。它只存储普通的8位字节。因此,请查看8BEC。它有两个字节长。在十六进制中写出需要4个字符。 - David Heffernan
想象一下从穿孔卡片转移的好处...如果你丢失了其中一些,那么你就有了一个真正需要解决的调试任务 :) - Hugh Jones
@Hugh 已经在那里,做过那个,花了一晚上的时间把它们重新排列。 - Keith Miller
在打孔卡片出现之前,有纸带(http://en.wikipedia.org/wiki/Punched_tape)。通过电传打字机(http://en.wikipedia.org/wiki/File:ASR-33_Teletype_terminal_IMG_1658.jpg)输入,其中旋转圆柱头上的“锤子”敲击其背面,以强制字符在针式进纸上打印。 - Jan Doggen
显示剩余5条评论

2
汇编清单(第三列)是实际机器代码的可读形式,第二列中的机器代码是CPU实际执行的内容。
如果“跳过一些地址”是指第一列中的地址不总是按照1递增,那是因为机器代码中的指令长度不同。例如,第一行的push ebp只有一个字节,值为0x55,因此下一个地址只增加了一个。但是第二个指令mov ebp, esp的机器代码有两个字节(0x8b 0xec),因此地址增加了两个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接