【问题标题】:How do I interpret the columns of the CPU window's disassembly pane?如何解释 CPU 窗口反汇编窗格的列?
【发布时间】:2013-06-11 01:57:36
【问题描述】:

有一个工具叫做 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

【问题讨论】:

标签: delphi assembly compiler-construction cpu-registers


【解决方案1】:

汇编列表(第三列)是第二列中实际机器代码的人类可读形式,cpu 正在实际执行该代码。

如果“跳转一些地址”是指第一列中的地址并不总是以 1 递增,那是因为指令在机器代码中具有不同的长度。例如第一行,push ebp 是一个值为0x55 的单字节,因此下一个地址只是另一个地址。但是第二条指令的机器代码 mov ebp, esp 是两个字节 (0x8b 0xec),因此地址增加了 2。

【讨论】:

    【解决方案2】:

    我们来看代码:

    004520F4 55推ebp 004520F5 8BEC 移动 ebp, 特别是 004520F7 6A00 推 $00 004520F9 53 推 ebx 004520FA 33D2 xor edx,edx

    这里的每一行代表一条机器指令。提供的信息如下:

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

    所以第二列和第三列代表完全相同的信息。提供第三列是为了让代码更容易理解。

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

    有些指令甚至可以占用两个以上字节,因此这些指令的增量可以是 3、4 等等。一个很好的例子是编码目标地址或偏移量的调用或跳转指令。因此,32 位机器上的绝对跳转可能被编码为 5 个字节,一个用于操作码,四个用于地址。

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

    【讨论】:

    • 它们是两个字节,因为操作码是双倍的(4 个字符而不是 2 个)还是只是巧合?
    • 机器码以十六进制显示。因此,4 个十六进制字符代表两个字节。机器不存储十六进制。它只存储普通的旧 8 位字节。所以看看8BEC。那是两个字节长。以十六进制写出时,需要 4 个字符。
    • @David - 是的,这很有趣,但我们过去常称它们为“第三代语言”,这同样是一项艰巨的工作。
    • 想象一下它从打孔卡中获得了多么大的好处......放下一堆这样的东西,你就有了真正的调试任务来开始你的牙齿:)
    • @Hugh 去过那里,做到了,花了一夜让他们按顺序回来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多