Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么汇编程序可以计算指令中的复杂值?_Assembly_X86 64_Fasm - Fatal编程技术网

Assembly 为什么汇编程序可以计算指令中的复杂值?

Assembly 为什么汇编程序可以计算指令中的复杂值?,assembly,x86-64,fasm,Assembly,X86 64,Fasm,为什么我们可以这样写: mov rax, [array + 2*rcx] 这不能: mov rax, [array + rcx*rcx] 为什么在第一种情况下,除了主指令(mov)之外,我们还可以进行复杂的计算,而在第二种情况下,我们只能进行稍微复杂一些的计算? 为什么我们可以增加记忆: add [array], 1 引擎盖下发生了什么?因为是cpu在做计算,它只能做有限的形式。机器编码也有明显的局限性。有关详细信息,请参阅手册。TL;DR:[base+index*scale+offset

为什么我们可以这样写:

mov rax, [array + 2*rcx]
这不能:

mov rax, [array + rcx*rcx]
为什么在第一种情况下,除了主指令(mov)之外,我们还可以进行复杂的计算,而在第二种情况下,我们只能进行稍微复杂一些的计算? 为什么我们可以增加记忆:

add [array], 1

引擎盖下发生了什么?

因为是cpu在做计算,它只能做有限的形式。机器编码也有明显的局限性。有关详细信息,请参阅手册。TL;DR:
[base+index*scale+offset]
其中
base
index
为探地雷达,
scale
为1,2,4或8,且
offset
为常数。添加到内存是一种读-修改-写操作。x86允许这样做,因为它是CISC。@Jester:我认为stackoverflow.com需要一个“将注释自动转换为答案”按钮。;-)有关现代x86 CPU上内存目标
add
和其他执行内部(如何解码为UOP)的详细信息,请参阅Agner Fog的Microach指南:。e、 g.在现代Intel上,加载+添加uops微熔丝,存储地址和存储数据uops也是如此,因此我们有两个熔合的域uops用于4个未熔合的域uops(每个域uops都需要一个执行单元)。进行此计算的不是汇编程序(即,这不会扩展为多条指令),但它是处理器可以解释的指令集体系结构/机器代码中的编码。提供寻址模式以便于进行常见的指针和数组操作。在寻址模式下完成的算术可以作为单独的指令来完成,但这可能会更长、更慢,并且需要一个临时寄存器。不同的ISA提供不同的寻址模式。