我一直在读Donald Knuth的编程艺术,第1卷,其中MIX被用作汇编语言。在Knuth谈到MIX中的算术运算的部分中,我不明白如何执行减法,乘法和除法运算。
例如,教科书有这个:
寄存器A具有以下字代码:
-| 1234 | 0 | 0 | 9
和a 存储单元,比如M,具有以下字代码:-| 2000 | 150 | 0
。
该书说,在执行A-M时,结果是:+| 766 | 149|?
。
在MIX中,内存被分成单词。每个单词都有以下内容:
第一个字段代表符号(+或 - )
接下来的两个字节保存地址
下一个字节表示索引,而第五个字节表示字段规范
最后一个字节用于操作码
该书说,在执行A-M时,结果是:+| 766 | 149|?
。
任何人都可以帮我吗?
答案 0 :(得分:3)
正在执行减法操作,因此可以直观地认为答案应该是:
rA - | 1234 | 0 | 0 | 9 | (before)
SUB - | 2000 | 150 | 0 |
---------------------------
| +766 | +150 | -9 | (after)
这是错误的,因为即使您知道(3:4)是150,也无法确定(3:3)和(4:4)的各个值。此外,字节的符号不一致。如果考虑每字节5位的情况,则机器会将此结果中的最低有效字节视为:
[32 1 x(150)] - 9 = [32 1 x(149)] + [32 0 x(23 )]
每个字节有6位的机器将其解释为:
[64 1 x(150)] - 9 = [64 1 x(149)] + [64 0 x(55 )]
再进一步,每字节7位的机器会将其解释为:
[128 1 x(150)] - 9 = [128 1 x(149)] + [128 0 x(119 )]
因此,从这些示例中可以看出,对于任何字节大小都存在149,但最低有效字节因机器而异。因此,正确答案是
rA - | 1234 | 0 | 0 | 9 | (before)
SUB - | 2000 | 150 | 0 |
--------------------------
rA + | 766 | 149 | ? | (after)
答案 1 :(得分:2)
假设每个字节的大小为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
。
因此,我们不知道寄存器的最后一个块将保留什么,因为这取决于一个字节大小的定义,即b
。
答案 2 :(得分:2)
我们必须记住 byte 在 MIX 中的含义。 字节必须能够容纳:
在二进制计算机上,字节必须6位大。因为它允许我们存储 2⁶=64 个不同的值,满足条件 1。而 64≤100,满足条件 2。
在十进制计算机上,字节必须为2位大。因为这将允许我们存储 10²=100 个不同的值,满足条件 1。而 100≤100,满足条件 2。
让我们看看计算是如何在每台计算机上完成的。
┌─┬─┬─┬─┐ ┌─┬──────┬──────┬──────┐
│-│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 计算机使用的数字系统,最低有效字节会有所不同,而接下来的两个字节将始终相同。因此“?”在书中。
答案 3 :(得分:1)
我知道这个问题有点老了,但是我最近正在研究这个问题。 问题的核心是模棱两可; MIX的印刷表示形式 单词含糊不清。
根据Knuth,一个字节必须至少包含64个值(0..63),且不超过 100(0..99)个值。仔细阅读以下内容,其他一些答案将无效。 规格(第125页,TAOCP第1卷)
让我们用二进制和十进制解释来解决这个问题。首先是MIX字 被显式转换,然后以熟悉的方式执行算术 小数模式。最后,答案将转换回MIX表示形式。
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
答案的MIX字二进制表示为:
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
MIX词的十进制表示形式是:
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!
给出的答案是766149?我们可以解决吗?值。
766 149 0 200811840 767490
? 55 1
MIX字词表示法不够明确,不会抛出 现场包装;这很容易弄错。现场包装无关 因为操作以整个单词为单位。代表的结果 作为字段打包字节的操作是另一层抽象。