donald knuth的混合汇编语言中的算术运算

时间:2014-09-16 17:05:03

标签: assembly knuth

我一直在读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|?

任何人都可以帮我吗?

4 个答案:

答案 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 中的含义。 字节必须能够容纳:

  1. 至少有 64 个不同的值,和
  2. 最多 100 个不同的 价值观

二进制计算机上,字节必须6位大。因为它允许我们存储 2⁶=64 个不同的值,满足条件 1。而 64≤100,满足条件 2。

十进制计算机上,字节必须为2位大。因为这将允许我们存储 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)
└─┴─┴─┴──┘

在 2 位十进制计算机上:

┌─┬─┬─┬─┐                           ┌─┬──┬──┬──┐
│-│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可以同时代表3234857051234009。 根据您对单词的阅读(二进制或十进制模式), 正在用两个独特的答案解决两个不同的问题。

下表将对这些摘要进行汇总,希望可以使它们变得清楚。

       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字词表示法不够明确,不会抛出 现场包装;这很容易弄错。现场包装无关 因为操作以整个单词为单位。代表的结果 作为字段打包字节的操作是另一层抽象。