为什么指令的地址在机器码中不连续?

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),因此值差异会有所不同。第二列显示每条指令的字节数。请注意它们的长度不同。