是否所有为32位机器编译的代码都是4字节块?

时间:2013-11-19 02:58:56

标签: gcc assembly x86 instructions

我写了一个简单的32位汇编代码:

movl  $0x542412e6, %eax
movl  %ebp , %edx
addl  $0x30, %edx
movl  %edx, %ebp
pushl 0x08048dd6
ret

当我运行此命令时:

gcc -m32 -c e.s

我得到以下18个字节:

0:  b8 e6 12 24 54          mov    $0x542412e6,%eax
5:  89 ea                   mov    %ebp,%edx
7:  83 c2 30                add    $0x30,%edx
a:  89 d5                   mov    %edx,%ebp
c:  68 d6 8d 04 08          push   $0x8048dd6
11: c3                      ret 

为什么目标代码是18个字节而不是20或16?对于32位机器,它不应该总是用4字节的字吗?

2 个答案:

答案 0 :(得分:3)

与数据或地址总线大小相关的指令大小。一些16位x86 CPU具有3种完全不同的大小,具有8位数据总线,20位地址总线和可变长度指令大小。现代32位或64位x86也具有可变长度指令,以便向后兼容。

只需查看movl $0x542412e6, %eaxpushl 0x08048dd6行,您就会发现在32位数据中编码32位立即数,操作码和寄存器是不可能的。如果体系结构使用32位固定长度指令,则它必须使用多个指令或文字池来加载32位常量。

RISC架构通常将固定宽度指令作为代码密度解码器简单性之间的权衡。但是也存在指令大小不同于32位的32位RISC架构。例如,MIPS16e和ARM thumb v1具有16位指令,而ARM thumb2和dalvikVM具有可变长度指令。现代64位RISC架构也不会有64位指令,而是经常坚持使用32位大小

答案 1 :(得分:2)

x86没有固定长度的说明,也不需要对齐。架构需要使其指令与某个偏移量匹配。这就是为什么x86进程需要更多逻辑来解码RISC处理器的指令。

现在大多数RISC架构都有固定长度的指令,并且会被修改。