movl (%edx) (%eax)
leal %esi (%edi)
为什么会这样?最后,还有其他类似的功能我应该知道是不允许的。
movl (mem), (mem)
mov dword [eax], [ecx] ; or the equivalent in Intel-syntax
无效,因为x86机器码没有包含两个地址的mov
的编码。(事实上,任何x86指令都不能有两种任意的寻址模式。)
它有MOV r32,r/m32
和MOV r/m32,r32
。Reg-reg移动可以使用MOV r32,R/M32
操作码或MOV R/M32,r32
操作码进行编码。许多其他指令有两个操作码,一个是dest必须是寄存器,另一个是src必须是寄存器。
(还有一些特殊的形式,如MOV r32,IMM32
或MOVABS 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进程的内存可以爬升多远来点击我的视