好的,我已经搜索过这个,但似乎找不到任何与此相关的内容。
我所知道的是,如果数字大于 255,计算机将使用一个新的 8 位内存块(1 字节)来存储大数字。
假设我想让计算机添加255 + 7.那会给我262在基地10但以二进制表示则为:
00 00<--之前
01 06<-之后
(顺便说一下,这是十六进制形式)
计算机如何解码这些2 个字节回到基地10形式/十进制形式(如果计算机不能添加)6和256因为255是它可以添加的最大数字。计算机如何做到这一点2字节答案/结果显示为262屏幕上?
答案1
首先,请参见问题下方的 Aganju 的评论。
现在,至于计算机如何跟踪这一点,我可以从 16 位编程中给你提供我的知识。概念可能相同。(但是,确切的答案可能取决于实现。换句话说,设计芯片的人至少在理论上可以对其工作原理做出不同的决定。)
当你将两个 8 位数字相加时,你能得到的最大数字是 (0xFF + 0xFF = 1FE)。事实上,如果你将两个 8 位数字相乘,你能得到的最大数字 (0xFF * 0xFF = 0xFE01) 仍然是 16 位,是 8 位的两倍。
现在,您可能认为 8 位处理器只能跟踪 8 位。这并不准确。8 位处理器以 8 位块的形式接收数据。(这些“块”通常有一个正式术语:“字”。在 8 位处理器上,使用 8 位字。在 64 位处理器上,可以使用 64 位字。)
因此,当您向计算机提供 3 个字节时:
字节 #1:MUL 指令
字节 #2:高位字节(例如 0xA5)
字节 #3:低位字节(例如 0xCB)
计算机可以生成超过 8 位的结果。CPU 可能会生成如下结果:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
又名:
0x4082xxxxD7
现在,让我为您解释一下:
0x 只是表示以下数字是十六进制的。
我稍后将更详细地讨论“40”。82
是“A”寄存器的一部分,它是一系列 8 位。xx
和 xx 是另外两个寄存器的一部分,称为“B”寄存器和“C”寄存器。D7
可以容纳更多位,称为“D”寄存器。
寄存器只是一块内存。寄存器内置于 CPU,因此 CPU 可以访问寄存器,而无需与 RAM 条上的内存交互。
因此 0xA5 乘以 0xCB 的数学结果是 0x82D7。
那么,为什么这些位被拆分到 A 和 D 寄存器中,而不是 A 和 B 寄存器或 C 和 D 寄存器中呢?好吧,再说一次,这是我使用的示例场景,其概念与真正的汇编语言(Intel x86 16 位,由 Intel 8080 和 8088 以及许多较新的 CPU 使用)非常相似。可能有一些通用规则,例如“C”寄存器通常用作计数操作(典型的 for 循环)的索引,而“B”寄存器用于跟踪有助于指定内存位置的偏移量。因此,“A”和“D”可能对一些常见的算术函数更常见。
每条 CPU 指令都应该有一些文档,供使用汇编语言编程的人使用。该文档应该指定每条指令使用哪些寄存器。(因此,选择使用哪些寄存器通常由 CPU 的设计者指定,而不是汇编语言程序员。尽管可以有一些灵活性。)
现在,回到上面例子中的“40”:这是一系列位,通常称为“标志寄存器”。标志寄存器中的每个位都有一个名称。例如,如果结果大于可以存储一个字节结果的空间,则 CPU 可能会设置一个“溢出”位。(“溢出”位通常可以用缩写名称“OF”来表示。这是大写的 o,而不是零。)软件可以检查此标志的值并注意到“问题”。高级语言通常会不可见地处理此位,因此初学者通常不会了解如何与 CPU 标志交互。但是,汇编程序员通常可以以与其他变量非常相似的方式访问其中一些标志。
例如,您可能有多个 ADD 指令。一个 ADD 指令可能将 16 位结果存储在 A 寄存器和 D 寄存器中,而另一个指令可能只将 8 个低位存储在 A 寄存器中,忽略 D 寄存器并指定溢出位。然后,稍后(将 A 寄存器的结果存储到主 RAM 之后),您可以使用另一个 ADD 指令,该指令仅将 8 个高位存储在寄存器(可能是 A 寄存器)中。是否需要使用溢出标志可能取决于您使用的乘法指令。
(通常还存在“下溢”标志,以防减去太多而无法得到所需的结果。)
仅向您展示事情变得多么复杂:
英特尔 4004 是 4 位 CPU
英特尔 8008 是 8 位 CPU。它有 8 位寄存器,分别名为 A、B、C 和 D。
英特尔 8086 是 16 位 CPU。它有 16 位寄存器,分别名为 AX、BX、CX 和 DX。
英特尔 80386 是 32 位 CPU。它有 32 位寄存器,分别名为 EAX、EBX、ECX 和 EDX。
英特尔 x64 CPU 有 64 位寄存器,分别名为 RAX、RBX、RCX 和 RDX。x64
芯片可以运行 16 位代码(在某些操作模式下),并可以解释 16 位指令。执行此操作时,组成 AX 寄存器的位是组成 EAX 寄存器的位的一半,而 EAX 寄存器的位又是组成 RAX 寄存器的位的一半。因此,每当您更改 AX 的值时,您也会更改 EAX 和 RAX,因为 AX 使用的那些位是 RAX 使用的位的一部分。
除了我提到的这些之外,还有更多的标志和寄存器。
现在,如果您使用的是 8 位 CPU,当您写入内存时,您可能会发现一些限制,即能够引用 8 位地址,而不是 4 位或 16 位地址。细节将因 CPU 而异,但如果您有这样的限制,那么 CPU 可能正在处理 8 位字,这就是为什么 CPU 通常被称为“8 位 CPU”。