483除以64与的差,再乘62与16的和?

该答案的大部分内容最初来自(在该其他问题标记为重复之前写的)。因此,我讨论了使用8位值(即使这个问题询问的是32位值),但这没关系,因为8位值在概念上更易于理解,并且相同的概念适用于较大的值,例如32位算术。

当您将两个8位数字相加时,可以获得的最大数字(0xFF + 0xFF = 1FE)。实际上,如果将两个8位数字相乘,则可获得的最大数字(0xFF * 0xFF = 0xFE01)仍然是16位,是8位的两倍。

现在,您可能假设x位处理器只能跟踪x位。(例如,一个8位处理器只能跟踪8位。)这是不准确的。8位处理器以8位块的形式接收数据。(这些“块”通常有一个正式术语:“字”。在8位处理器上,使用8位字。在64位处理器上,可以使用64位字。)

因此,当您为计算机提供3个字节时:
字节#2:高位字节(例如0xA5)
字节#3:低位字节(例如0xCB)
计算机可以生成以下结果:超过8位。CPU可能会生成如下结果:
现在,让我为您解释一下:
0x仅表示以下数字为十六进制。
我将暂时详细讨论“ 40”。
82是“ A”寄存器的一部分,该寄存器是一系列8位。
xx和xx是另外两个寄存器的一部分,分别称为“ B”寄存器和“ C”寄存器。我没有用零或一填充这些位的原因是“ ADD”指令(发送给CPU)可能导致这些位未被该指令更改(而本例中我使用的大多数其他位可能会被更改,除了一些标志位)。
D7将适合更多的位,称为“ D”寄存器。
寄存器只是一块内存。寄存器内置于CPU中,因此CPU无需访问RAM棒上的内存即可访问寄存器。

现在,为什么将这些位拆分为A和D寄存器而不是A和B寄存器,或C和D寄存器?好吧,再次,这是我正在使用的示例场景,在概念上与真实的汇编语言(Intel x86 16位,如Intel 8080和8088以及许多较新的CPU使用)非常相似。可能存在一些通用规则,例如“ C”寄存器通常用作计数操作的索引(对于循环而言是典型的),而“ B”寄存器则用于跟踪有助于指定存储位置的偏移量。因此,对于某些常见的算术函数,“ A”和“ D”可能更常见。

每条CPU指令应具有一些文档,供汇编程序的人员使用。该文档应指定每个指令使用哪些寄存器。(因此,有关使用哪个寄存器的选择通常由CPU的设计人员指定,而不是由汇编语言程序员指定。尽管有一定的灵活性。)

现在,回到上面的示例中的“ 40”:这是一系列位,通常称为“标志寄存器”。标志寄存器中的每个位都有一个名称。例如,如果结果大于可以存储结果一个字节的空间,则CPU可能会设置一个“溢出”位。(“溢出”位通常用缩写为“ OF”来表示。这是一个大写的o,而不是零。)软件可以检查该标志的值并注意到“问题”。使用此位通常是由高级语言来进行的,因此,初学者通常不了解如何与CPU标志进行交互。但是,汇编程序员通常可以以与其他变量非常相似的方式访问其中一些标志。

例如,您可能有多个ADD指令。一个ADD指令可能将16位结果存储在A寄存器和D寄存器中,而另一条指令可能只是将8个低位存储在A寄存器中,忽略D寄存器,并指定溢出位。然后,稍后(将A寄存器的结果存储到主RAM中之后),您可以使用另一条ADD指令,该指令仅将8个高位存储在一个寄存器(可能是A寄存器)中。是否需要使用溢出标志可能会取决于您使用的乘法指令。

(通常也有一个“下溢”标志,以防您减去太多而无法达到所需的结果。)

CPU具有名为RAX,RBX,RCX和RDX的64位寄存器。x64芯片可以运行16位代码(在某些操作模式下),并且可以解释16位指令。这样做时,组成AX寄存器的位是组成EAX寄存器的位的一半,也就是组成RAX寄存器的位的一半。因此,无论何时更改AX的值,也都在更改EAX和RAX,因为AX使用的那些位是RAX使用的位的一部分。(如果您将EAX更改为65,536的倍数,则低16位不变,因此AX不会更改。如果您将EAX更改为非65,536的倍数,那么也会影响AX

除了我已经提到的标志和寄存器之外,还有更多的标志和寄存器。我只是选择了一些常用的例子来提供一个简单的概念示例。

现在,如果您使用的是8位CPU,则在写入内存时,可能会遇到一些限制,即不能引用4位或16位地址,而只能引用8位地址。具体细节因CPU而异,但是如果您有此类限制,则CPU可能正在处理8位字,这就是为什么CPU最常被称为“ 8位CPU”的原因。

我要回帖

更多关于 1246用加减乘除等于24 的文章

 

随机推荐