为什么指令的地址在机器码中不连续?
Why aren't instructions' adresses consecutive in machine code?
我刚刚将一个CPP源代码编译成一个对象.o
文件,前几行是这样的:
Disassembly of section .text:
0000000000000000 <_Z8mainLoopv>:
0: f3 0f 1e fa endbr64
4: 55 push %rbp
5: 48 89 e5 mov %rsp,%rbp
8: 41 55 push %r13
a: 41 54 push %r12
c: 53 push %rbx
d: 48 81 ec 88 00 00 00 sub [=10=]x88,%rsp
14: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
我假设第一列是说明的地址,对吗?如果是这样,为什么它们不是连续的?像这样:
0: f3 0f 1e fa endbr64
1: 55 push %rbp
2: 48 89 e5 mov %rsp,%rbp
3: 41 55 push %r13
4: 41 54 push %r12
5: 53 push %rbx
6: 48 81 ec 88 00 00 00 sub [=11=]x88,%rsp
7: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
每条指令可以占用多于一个字节的space。这里,第一条指令占用 space(f3 0f 1e fa
) 的四个字节,因此下一条指令从字节 4 开始。
第一列是指令的地址。
由于x86_64 指令长度不同(例如 ARM64),因此值差异会有所不同。第二列显示每条指令的字节数。请注意它们的长度不同。
我刚刚将一个CPP源代码编译成一个对象.o
文件,前几行是这样的:
Disassembly of section .text:
0000000000000000 <_Z8mainLoopv>:
0: f3 0f 1e fa endbr64
4: 55 push %rbp
5: 48 89 e5 mov %rsp,%rbp
8: 41 55 push %r13
a: 41 54 push %r12
c: 53 push %rbx
d: 48 81 ec 88 00 00 00 sub [=10=]x88,%rsp
14: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
我假设第一列是说明的地址,对吗?如果是这样,为什么它们不是连续的?像这样:
0: f3 0f 1e fa endbr64
1: 55 push %rbp
2: 48 89 e5 mov %rsp,%rbp
3: 41 55 push %r13
4: 41 54 push %r12
5: 53 push %rbx
6: 48 81 ec 88 00 00 00 sub [=11=]x88,%rsp
7: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
每条指令可以占用多于一个字节的space。这里,第一条指令占用 space(f3 0f 1e fa
) 的四个字节,因此下一条指令从字节 4 开始。
第一列是指令的地址。
由于x86_64 指令长度不同(例如 ARM64),因此值差异会有所不同。第二列显示每条指令的字节数。请注意它们的长度不同。