我一直在读Donald Knuth的《编程的艺术》第一卷,在这本书中,MIX被用作汇编语言。在Knuth谈到MIX中的算术运算的部分,我不理解减法、乘法和除法是如何进行的。
例如,课本上有这样的内容:
寄存器A具有以下字码:
-| 1234 | 0 | 0 | 9
,而存储器单元,例如M,具有以下字码:-| 2000 | 150 | 0
。
书中说,在执行A-M时,结果是:+| 766 | 149|?
。
在MIX中,记忆被分成单词。每个单词都有以下内容:第一个字段表示符号(+或-)
接下来的两个字节保存地址。
下一个字节表示索引,而第五个字节表示字段规范。
最后一个字节用于操作码。
书中说,在执行A-M时,结果是:+| 766 | 149|?
。
有人能帮我吗?
发布于 2019-03-01 08:51:20
我意识到这个问题有点老了,但我最近正在解决这个问题。问题的核心是模棱两可;混合词语的印刷表示是模棱两可的。
根据Knuth的说法,一个字节必须至少包含64个值(0..63),并且不超过100个(0..99)值。通过仔细阅读规范,其他一些答案将是无效的。(第125页TAOCP第1卷)
让我们在二进制和十进制解释中解决这个问题。首先对混合字进行显式转换,然后以熟悉的十进制模式执行运算。最后,将答案转换回混合表示。
BINARY MODE REALITY
1234 0 0 9 = [(1234 * 64^3) + (0 * 64*2) + (0 * 64) + 9] = 323485705
2000 150 0 = [(2000 * 64*3) + (150 * 64) + 0] = 524297600
-323485705 - -524297600 = 200811895
答案的混合字二进制表示为:
200811895 = [(766 * 64^3) + (149 * 64) + 55] = 766 149 55
现在来看小数的解释:
DECIMAL MODE REALITY
1234 0 0 9 = [(1234 * 10^3) + (0 * 10^2) + (0*10) + 9] = 1234009
2000 150 0 = [(2000 * 10^3) + (150 * 10) + 0] = 2001500
-1234009 - -2001500 = 767 491
混合单词的十进制表示为:
767491 = [(766 * 10^3) + (149 * 10) + 1] = 766 149 1
请注意,打印的表示形式不明确。例如,1234 0 0 9
可以同时表示323485705
或1234009
。根据您对单词的读取(二进制或十进制模式),您正在处理两个不同的问题,并具有两个唯一的答案。
下面的表格将进行总结,希望能让事情变得清晰。
MIX Binary Decimal
rA -1234 0 0 9 -323485705 -1234009
SUB -2000 150 0 - -524297600 - -2001500
----------- ---------- --------
766 149 ? 200811895 767491 NOTE: 2 different answers!
打印出来的答案是766 149?我们能解决这个问题吗?价值。
766 149 0 200811840 767490
? 55 1
如果不使用字段包装,混合单词表示就足够模糊了;很容易弄错。字段打包是不相关的,因为操作将整个单词作为一个单元进行操作。将操作的结果表示为字段压缩字节是另一个抽象层。
发布于 2021-02-15 00:08:44
我们必须记住一个字节在MIX中意味着什么。一个字节必须能够保存:
在binary计算机上,字节必须是6位 large。因为它允许我们存储2⁶=64不同的值,满足条件1。64≤100,满足条件2。
在decimal计算机上,字节必须是2位 large。因为这将允许我们存储10²=100不同的值,满足条件1。和100≤100,满足条件2。
让我们看看如何在每台计算机上进行计算。
在6位二进制计算机上:
┌─┬─┬─┬─┐ ┌─┬──────┬──────┬──────┐
│-│0│0│9│ would be represented as │-│000000│000000│001001│
└─┴─┴─┴─┘ └─┴──────┴──────┴──────┘
和
┌─┬─┬─┬─┐ ┌─┬──────┬──────┬──────┐
│-│150│0│ would be represented as │-│000010 010110│000000│
└─┴─┴─┴─┘ └─┴──────┴──────┴──────┘
减去这两个就得到了:
┌─┬──────┬──────┬──────┐
│+│000010 010101│110111│
└─┴──────┴──────┴──────┘
它的十进制数等于:
┌─┬─┬─┬──┐
│+│149│55│ (we'll call this result A)
└─┴─┴─┴──┘
在两位十进制计算机上:
┌─┬─┬─┬─┐ ┌─┬──┬──┬──┐
│-│0│0│9│ would be represented as │-│00│00│09│
└─┴─┴─┴─┘ └─┴──┴──┴──┘
和
┌─┬─┬─┬─┐ ┌─┬──┬──┬──┐
│-│150│0│ would be represented as │-│01 50│00│
└─┴─┴─┴─┘ └─┴──┴──┴──┘
减去这两个就得到了:
┌─┬──┬──┬──┐
│+│01 49│91│
└─┴──┴──┴──┘
它的十进制数等于:
┌─┬─┬─┬──┐
│+│149│91│ (we'll call this result B)
└─┴─┴─┴──┘
结论
我们注意到A≠B,但是149总是在那里。它是不同的最后一个字节。因此,根据MIX计算机使用的数字系统,最低有效字节将不同,而随后的两个字节将始终相同。因此出现了"?“在书里。
发布于 2017-08-26 16:55:08
假设每个字节的大小为b
。因此,+|1234|0|0|9
可以写成:
-(1234*B³+9)
-|2000|150|0|
可以写成:
-(2000*B³+150*B+0)
。
现在从第一个数字中减去第二个数字:
-(1234*B³+9)-(-(2000*B³+150*B))
=766*B³+150*B-6
但这不能直接表示(因为一个术语是负的),因此:
=766*B³+149*B+(B-6)
B=2^b
**.**所在的=766*B³+149*B+(B-6)
因此,我们不知道寄存器的最后一个块将保存什么,因为这取决于一个字节的大小的定义,即b
。
https://stackoverflow.com/questions/25874604
复制相似问题