assembly 如何解释objdump反汇编输出列?

yc0p9oo0  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(188)

我用c写了一个简单的程序,它调用一个函数while_loop,参数为4,3,2,这个函数基本上就是一个while循环,我不认为它和我的问题有什么关系,因为它是一个一般性的问题,我被告知运行objdump -d,我照做了。

我有很多问题,所以在这里:
1.我知道最左边一列是地址,地址是根据前面的字节数递增的,我不太明白的是第二列,是不是执行的指令,但是是十六进制的?那是不是push %ebp等于55?我不太明白。
1.因为这是IA-32,而且是小端字节序,所以我知道最低有效字节存储在最低地址。但是,我不明白这些字节的顺序是否是根据它们在内存中的位置来显示的。请看第3行,“8b 55 10”是否意味着最低地址中有8b,我将以相反的方式读取它,或者这是否意味着10位于最低地址,我将以相反的方式读取它?
1.左边的这些地址是绝对内存地址还是相对内存地址?

wsewodh2

wsewodh21#

在这种情况下,你的地址是绝对的,因为你有一个位置-dependent 的可执行文件(不是PIE)。在ELF元数据中有一个字段(由链接器设置),指定Map可执行文件的虚拟地址。你可以使用readelf -a来查看这个字段和更多信息。
在PIE可执行文件中,十六进制地址是相对于“图像基址”的,通常意味着相对于文件的开始。(类似于.o,其中地址从.text部分的开始处的0开始计数)。您可以使用--adjust-vma=offset来设置打印这些地址的基址。

是的,第2列是机器码的十六进制转储,按内存顺序为单个字节。Objdump不会将它们解释为小端字节序字或类似的东西,只是每个字节一对十六进制数字,按地址递增的顺序。
x86机器代码基本上是一个字节流。指令由

[prefixes] opcode [modrm [SIB] displacement0/8/32] [immediate8/32]

操作码可以是单个字节,也可以是在Intel / AMD文档中按内存顺序指定的字节序列,例如0F AF /r代表imul reg, reg/mem
有些指令有16位立即数,但如果有,通常是1或4个字节。

字节顺序仅与寻址模式中的多字节位移或多字节立即数相关。

例如foo.s中的mov $0x12345678, %eax,与gcc -c foo.s组装成.o,该.o反组装为:

0:   b8 78 56 34 12          mov    $0x12345678,%eax

另请参阅SO's x86 tag wiki中x86文档/手册的更多链接,包括英特尔的PDF手册
此外,* Are machine code instructions fetched in little endian 4-byte words on an Intel x86-64 architecture? * 也提到立即数是小尾序。

相关问题