我写了一个简单的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字节的字吗?
答案 0 :(得分:3)
与数据或地址总线大小相关的指令大小不。一些16位x86 CPU具有3种完全不同的大小,具有8位数据总线,20位地址总线和可变长度指令大小。现代32位或64位x86也具有可变长度指令,以便向后兼容。
只需查看movl $0x542412e6, %eax
和pushl 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架构都有固定长度的指令,并且会被修改。