我看到的代码如下:
mov ax, cs
mov ds, ax
mov es, ax
为什么我不能将其压缩为:
mov ds, cs
mov es, cs
使用累加器寄存器后,第一种方式更快吗?但这似乎并不直观,因为cs和ds是段寄存器。还是有一些我不知道的限制?
顺便说一下,我正在使用nasm。
答案 0 :(得分:10)
你不能将段寄存器移动到段寄存器 - 没有指令。
答案 1 :(得分:1)
微处理器的处理器只有很多空间用于所有指令。因此,对于很少使用的操作湖改变段寄存器,一般指令通常优于几个特殊目的指令。此外,对于某些处理器,指令的数量绝对受到架构的限制 - 例如,原始8080处理器限制为256条指令,因为它们都必须在单个字节中编码操作码。
答案 2 :(得分:1)
它不是汇编语言,而是阻止这些操作的底层机器语言。
虽然汇编由易于阅读的单词或助记符组成,但它们实际上直接代表机器代码的1和0。在x86 CPU上,每条指令通常由一个字节序列组成,其中单个字节或字节内的偶数位具有含义。某些位表示指令,其他位表示addressing mode。在寄存器寻址模式(如示例)中,某些位表示哪些特定寄存器将用作mov
指令的源和目标。
现在x86系列处理器可以追溯到20世纪70年代,当时CPU架构更简单。在那些日子里,accumulator的概念至关重要 - ax
是16位x86累加器。所有的计算都是建立起来的,或者是积累的#34;在此寄存器中,所有指令均可使用。其他通用寄存器的使用范围更为有限。
因为指令基于字节,所以你需要尽可能少的字节来表示尽可能快地保持指令解码的指令。为了保持尽可能短的指令,累加器的使用是重中之重。
在更现代的CPU(如Motorola 680x0)上,更多通用寄存器具有更多功能,这些功能以前是累加器的域。在RISC CPU上,所有寄存器都与累加器一样灵活。我听说在64位模式下,当前的x86 / amd64指令集现在受到的限制要少得多。
答案 3 :(得分:1)
查看Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015" MOV Move"专栏"指令"。
寄存器的唯一16位mov编码为:
1
和" 3.1.1.3操作码汇总表中的指令栏"说明:
因此mov r/m16, Sreg
无法编码,因为没有mov ds, cs
版本。