当前位置: 首页 > 知识库问答 >
问题:

为什么不允许从内存到内存的movl?

羿宏硕
2023-03-14
 movl (%edx) (%eax) 
 leal %esi (%edi)

为什么会这样?最后,还有其他类似的功能我应该知道是不允许的。

共有1个答案

公羊光明
2023-03-14
movl (mem), (mem)

mov dword [eax], [ecx]    ; or the equivalent in Intel-syntax

无效,因为x86机器码没有包含两个地址的mov的编码。(事实上,任何x86指令都不能有两种任意的寻址模式。)

它有MOV r32,r/m32MOV r/m32,r32。Reg-reg移动可以使用MOV r32,R/M32操作码或MOV R/M32,r32操作码进行编码。许多其他指令有两个操作码,一个是dest必须是寄存器,另一个是src必须是寄存器。

(还有一些特殊的形式,如MOV r32,IMM32MOVABS r64,[64bit-绝对地址]。)

很少有指令可以加载并存储到两个不同的地址,例如movs(string-move)和push/pop(mem)(哪些x86指令需要两个(或更多)内存操作数?)。在所有这些情况下,至少有一个内存地址是隐式的(由操作码隐含),而不是任意的选择,可以是[eax][edi+esi*4+123]或其他。

许多ALU指令都有一个内存目的地。这是在单个内存位置上的读-修改-写,使用相同的寻址模式进行加载和存储。这表明限制并不是8086不能加载和存储,而是解码复杂性(和机器码紧凑性/格式)的限制。

没有任何指令采用两个任意有效地址(即用灵活的寻址模式指定)。MOVS具有隐式源操作数和dest操作数,而push具有隐式dest操作数。

正如我上面提到的,同一指令的内存源和内存目的地形式(asm源助记符)使用两个不同的操作码。就硬件而言,它们是不同的指令。

这种设计选择的部分原因可能是实现的复杂性:如果一条指令可能需要来自AGU(地址生成单元)的两个结果,那么布线必须在那里才能实现。其中的一些复杂性在于解码器,解码器要弄清楚操作码是哪条指令,并解析剩余的位/字节以弄清楚操作数是什么。由于没有其他指令可以有多个R/m操作数,因此需要额外的晶体管(硅面积)来支持对两种任意寻址模式进行编码。对于逻辑来说,它必须计算出一条指令有多长,这样它就知道从哪里开始解码下一条指令。

它还可能为一条指令提供五个输入依赖项(存储地址的两寄存器寻址模式,加载地址和加载日期相同)。在设计8086/80386时,超标量/乱序/依赖跟踪可能不在雷达上。386增加了许多新的指令,因此可以对mov进行mem到mem的编码,但没有。如果386已经开始将结果直接从ALU输出转发到ALU输入之类的东西(与总是将结果提交到寄存器文件相比,以减少延迟),那么这个原因将是它没有实现的原因之一。

leal %esi, (%edi)

这里有两个问题:

首先,寄存器没有地址。裸%ESI不是有效的有效地址,因此不是lea的有效源

其次,LEA的目的地必须是寄存器。如果需要第二个有效地址来将目标存储到内存中,则没有编码。

valid-asm.s:2: Error: number of operands mismatch for `lea'
 类似资料:
  • 我正在尝试运行artisan make:controller。 我有一个问题: 我试图增加

  • 我们的软件正在通过一个从内存流读取数据的GZipStream解压某些字节数据。这些数据以4KB的块解压缩,并写入另一个内存流。 我们已经意识到进程分配的内存远高于实际解压的数据。 示例:具有2425536字节的压缩字节数组被解压缩为23050718字节。我们使用的内存分析器显示了方法MemoryStream。设置容量(Int32值)分配的67104936字节。这是保留内存和实际写入内存之间的2.9

  • 问题内容: 致命错误:耗尽了67108864字节的允许的内存大小(尝试分配13965430字节) PHPInfo显示我的memory_limit为128M,所以我对为什么错误说我只有64M感到困惑。phpinfo是否可能报告错误?还是让PHP使用两个单独的php.ini? 该错误是由我的一位同事在我不知情的情况下添加的主要php文件之一中的ini_set调用引起的。 问题答案: PHP的配置可以在

  • 我有以下代码: 不同的文件: 由于我编写了Mail()函数,因此出现以下错误: 致命错误:允许的内存大小134217728字节已用尽(尝试分配65488字节)

  • 问题内容: 我试图通过运行以下命令将HWIOAuthBundle添加到我的项目中。 HWIOAuthBundle github:https : //github.com/hwi/HWIOAuthBundle 当我尝试运行composer时,我遇到了内存不足错误。 将版本^0.6.0@dev用于hwi / oauth-bundle将版本^1.2@dev用于php-http / guzzle6-ada

  • 我有应用程序以守护程序模式运行。 我有一个视图,它从数据库中获取重要的queryset,并通过计算queryset的结果另外分配数组,然后返回这个数组。我没有使用线程本地存储、全局变量或任何类似的东西。 问题是,我的应用程序占用的内存与我为mod_wsgi设置的线程数相对应。 我做了一个小实验,在mod_wsgi中设置了不同数量的线程,然后通过curl检查wsgi进程的内存可以爬升多远来点击我的视