【发布时间】:2012-01-02 11:54:06
【问题描述】:
以下是一些指令及其对应的编码:
55 push %ebp
89 e5 mov %esp,%ebp
83 ec 18 sub $0x18,%esp
a1 0c 9f 04 08 mov 0x8049f0c,%eax
85 c0 test %eax,%eax
74 12 je 80484b1 <frame_dummy+0x21>
b8 00 00 00 00 mov $0x0,%eax
85 c0 test %eax,%eax
74 09 je 80484b1 <frame_dummy+0x21>
c7 04 24 0c 9f 04 08 movl $0x8049f0c,(%esp)
今天的微处理器通常是 32 位或 64 位的,我猜它们通常以 4 字节或 8 字节块的形式从内存中读取数据。但是,指令可以具有可变长度。微处理器如何解码这些指令?为什么它们的长度不是固定的以方便执行?
【问题讨论】:
-
仅供参考:它们实际上通常一次获取 16 (Core2) 或 32 (K10) 字节。
-
@harold,指令长度是否受处理器字长(处理器架构)的限制,在这种情况下,现代处理器的最大长度是 32 位或 64 位(不是字节)?
-
@DenysS。不一定,也不是在 x86 中。这更像是一个 RISC 功能。 x86 指令目前被限制为 15 个字节(这是一个奇数,实际上很难达到),这个限制曾经更低(但它总是大于字长)。
-
@harold,好的,但是字长必须限制指令操作数和寄存器的大小,对吧? (我从 wiki 得到的)否则是什么意思呢?
-
@DenysS。确实,通用寄存器与字长一样宽(或者,好吧,无论如何,这已经足够了)并且指针大小和“任何地方的最大立即参数”仍然匹配那些(尽管在 64 位模式下,唯一的 64 位立即数如果您想将地址计数为立即数,那么任何地方都是对通用寄存器的简单加载和对偏移量的特殊加载,ALU 操作中的立即数被卡在 32 位)。不过现在也有 256 位向量寄存器,您可以在 16 位模式下使用 32 位寄存器,因此 x86 是“字长”含义的一个糟糕示例。
标签: assembly cpu-architecture microprocessors