有一个名为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我们来看看代码:
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个字节编码,一个用于操作码,四个用于地址.
回到过去的好时光,早在我出生之前,程序员甚至没有装配工并直接在机器指令中编写代码.那肯定是一大堆乐趣!