汇编:为什么我们要困扰寄存器?

Cam*_*Cam 15 math performance assembly cpu-architecture cpu-registers

我有一个关于装配的基本问题.

如果它们也可以在内存上工作,为什么我们只在寄存器上进行算术运算呢?

例如,以下两个原因(基本上)都将相同的值计算为答案:

片段1

.data
    var dd 00000400h

.code

    Start:
        add var,0000000Bh
        mov eax,var
        ;breakpoint: var = 00000B04
    End Start
Run Code Online (Sandbox Code Playgroud)


片段2

.code

    Start:
        mov eax,00000400h
        add eax,0000000bh
        ;breakpoint: eax = 0000040B
    End Start
Run Code Online (Sandbox Code Playgroud)



从我所看到的,大多数文本和教程主要在寄存器上进行算术运算.使用寄存器只是更快吗?

编辑:那很快:)

给出了一些很好的答案; 根据第一个好的答案选择了最佳答案.

Dav*_*one 25

如果你看一下计算机体系结构,你会发现一系列内存级别.那些接近CPU的是快速,昂贵(每一点),因此很小,而在另一端你有大,慢和廉价的存储设备.在现代计算机中,这些通常类似于:

 CPU registers (slightly complicated, but in the order of 1KB per a core - there
                are different types of registers. You might have 16 64 bit
                general purpose registers plus a bunch of registers for special
                purposes)
 L1 cache (64KB per core)
 L2 cache (256KB per core)
 L3 cache (8MB)
 Main memory (8GB)
 HDD (1TB)
 The internet (big)
Run Code Online (Sandbox Code Playgroud)

随着时间的推移,已经添加了越来越多的缓存级别 - 我记得CPU没有任何板载缓存的时候,我甚至都不老了!目前,硬盘驱动器带有板载缓存,互联网缓存在任何数量的地方:内存,硬盘驱动器,以及缓存代理服务器.

在远离CPU的每一步中,带宽都会急剧下降(通常是数量级)并且延迟会增加.例如,HDD可能能够以100MB/s的速度读取,延迟为5ms(这些数字可能不完全正确),而主存储器的读取速度为6.4GB/s,延迟为9ns(6阶大小!).延迟是一个非常重要的因素,因为您不希望CPU保持等待的时间超过必须(对于具有深度管道的架构尤其如此,但这是另一天的讨论).

我们的想法是,您经常会反复使用相同的数据,因此将它放在一个小的快速缓存中以便后续操作是有意义的.这被称为时间局部性.局部性的另一个重要原则是空间局部性,它表示可能几乎同时读取彼此附近的存储位置.正是由于这个原因,从RAM读取将导致更大的RAM块被读取并放入CPU缓存中.如果它不适合这些局部性原则,那么内存中的任何位置都有可能同时被读取,因此无法预测接下来将要访问的内容以及所有级别的缓存在世界上不会提高速度.您可能只是使用硬盘驱动器,但我确定您知道在分页时计算机停止运行是什么样的(基本上使用HDD作为RAM的扩展).除了硬盘驱动器(许多小型设备只有一个内存)之外,概念上可能没有内存,但与我们熟悉的相比,这将是非常缓慢的.

寄存器(只有少量寄存器)的另一个优点是它可以让你有更短的指令.如果您的指令包含两个(或更多)64位地址,那么您将获得一些长指令!


Tro*_*nic 9

寄存器更快,并且您可以直接在内存上执行的操作更加有限.