有一个名为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
答案 0 :(得分: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个字节编码,一个用于操作码,四个用于地址。
回到过去的好时光,早在我出生之前,程序员甚至没有装配工并直接在机器指令中编写代码。这肯定是一大堆乐趣!
答案 1 :(得分:2)
汇编列表(第三列)是第二列中实际机器代码的人类可读形式,cpu实际执行该代码。
如果通过“跳过某些地址”,则意味着第一列中的地址并不总是递增1,这是因为指令在机器代码中的长度不同。例如,第一行push ebp
是一个值为0x55
的单字节,因此下一个地址只是一个。但是第二条指令的机器代码mov ebp, esp
是两个字节(0x8b 0xec
),因此地址递增2。