我用c写了一个简单的程序,它调用一个函数while_loop,参数为4,3,2,这个函数基本上就是一个while循环,我不认为它和我的问题有什么关系,因为它是一个一般性的问题,我被告知运行objdump -d,我照做了。
我有很多问题,所以在这里:
1.我知道最左边一列是地址,地址是根据前面的字节数递增的,我不太明白的是第二列,是不是执行的指令,但是是十六进制的?那是不是push %ebp等于55?我不太明白。
1.因为这是IA-32,而且是小端字节序,所以我知道最低有效字节存储在最低地址。但是,我不明白这些字节的顺序是否是根据它们在内存中的位置来显示的。请看第3行,“8b 55 10”是否意味着最低地址中有8b,我将以相反的方式读取它,或者这是否意味着10位于最低地址,我将以相反的方式读取它?
1.左边的这些地址是绝对内存地址还是相对内存地址?
1条答案
按热度按时间wsewodh21#
在这种情况下,你的地址是绝对的,因为你有一个位置-dependent 的可执行文件(不是PIE)。在ELF元数据中有一个字段(由链接器设置),指定Map可执行文件的虚拟地址。你可以使用
readelf -a
来查看这个字段和更多信息。在PIE可执行文件中,十六进制地址是相对于“图像基址”的,通常意味着相对于文件的开始。(类似于
.o
,其中地址从.text
部分的开始处的0
开始计数)。您可以使用--adjust-vma=offset
来设置打印这些地址的基址。是的,第2列是机器码的十六进制转储,按内存顺序为单个字节。Objdump不会将它们解释为小端字节序字或类似的东西,只是每个字节一对十六进制数字,按地址递增的顺序。
x86机器代码基本上是一个字节流。指令由
操作码可以是单个字节,也可以是在Intel / AMD文档中按内存顺序指定的字节序列,例如
0F AF /r
代表imul reg, reg/mem
有些指令有16位立即数,但如果有,通常是1或4个字节。
字节顺序仅与寻址模式中的多字节位移或多字节立即数相关。
例如
foo.s
中的mov $0x12345678, %eax
,与gcc -c foo.s
组装成.o
,该.o
反组装为:另请参阅SO's x86 tag wiki中x86文档/手册的更多链接,包括英特尔的PDF手册
此外,* Are machine code instructions fetched in little endian 4-byte words on an Intel x86-64 architecture? * 也提到立即数是小尾序。