Assembly donald knuth'中的算术运算;s混合汇编语言
我一直在读Donald Knuth的《编程的艺术》(The Art of Programming,Volume 1),其中MIX被用作汇编语言。在Knuth讨论混合算术运算的部分中,我不理解减法、乘法和除法运算是如何执行的 例如,教科书有以下内容: 寄存器A有以下单词代码:Assembly donald knuth'中的算术运算;s混合汇编语言,assembly,knuth,Assembly,Knuth,我一直在读Donald Knuth的《编程的艺术》(The Art of Programming,Volume 1),其中MIX被用作汇编语言。在Knuth讨论混合算术运算的部分中,我不理解减法、乘法和除法运算是如何执行的 例如,教科书有以下内容: 寄存器A有以下单词代码:-|1234 | 0 | 0 | 9和 存储单元,比如M,有以下单词代码:-|2000 | 150 | 0 这本书说,在执行A-M时,结果是:+|766 | 149 |? 在混合模式中,记忆被分割成单词。每个单词都有以下内容:
-|1234 | 0 | 0 | 9
和
存储单元,比如M,有以下单词代码:-|2000 | 150 | 0
这本书说,在执行A-M时,结果是:+|766 | 149 |?
在混合模式中,记忆被分割成单词。每个单词都有以下内容:
第一个字段表示符号(+或-)接下来的两个字节保存地址。
下一个字节表示索引,第五个字节表示字段规范。
最后一个字节是操作码。
这本书说,在执行A-M时,结果是:
+|766 | 149 |?
有人能帮我吗?正在执行减法运算,因此人们会直觉地认为答案应该是这样的:
rA - | 1234 | 0 | 0 | 9 | (before)
SUB - | 2000 | 150 | 0 |
---------------------------
| +766 | +150 | -9 | (after)
这是错误的,因为即使您知道(3:4)是150,也无法确定(3:3)和(4:4)的单个值。此外,字节的符号不一致。如果考虑每字节5位的情况,则该机器将此结果中的最低有效字节视为:
[321 x(150)]-9=[321 x(149)]+[320 x(23)]
每字节有6位的机器将解释为:
[641x(150)]-9=[641x(149)]+[640x55]
更进一步说,每字节7位的机器将解释为:
[1281x(150)]-9=[1281x(149)]+[1280x119]
因此,您可以从这些示例中看到,对于任何字节大小,都存在149,但最低有效字节根据机器的不同而不同。因此,正确的答案是
rA - | 1234 | 0 | 0 | 9 | (before)
SUB - | 2000 | 150 | 0 |
--------------------------
rA + | 766 | 149 | ? | (after)
假设每个字节的大小为
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
我意识到这个问题有点老了,但我最近正在解决这个问题。
问题的核心是含糊不清;混合的印刷品
语言是模棱两可的
根据Knuth的说法,一个字节必须至少包含64个值(0..63),且不超过
100(0..99)个值。如果仔细阅读这本书,其他一些答案将是无效的
规范(第125页第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!
给出的打印答案是766149?我们能解决这个问题吗?价值观
766 149 0 200811840 767490
? 55 1
混合词表示法足够含糊不清,而无需插入
现场包装;这很容易出错。现场包装不相关
因为操作将整个单词作为一个单元来处理。代表
作为字段压缩字节的操作是另一层抽象。我们必须记住字节在MIX中的含义。字节必须能够容纳:
┌─┬──────┬──────┬──────┐
│+│000010 010101│110111│
└─┴──────┴──────┴──────┘
┌─┬──┬──┬──┐
│+│01 49│91│
└─┴──┴──┴──┘
以十进制表示,其等于:
┌─┬─┬─┬──┐
│+│149│55│ (we'll call this result A)
└─┴─┴─┴──┘
┌─┬─┬─┬──┐
│+│149│91│ (we'll call this result B)
└─┴─┴─┴──┘
在2位十进制计算机上:
及
减去这两者,我们得到:
┌─┬──────┬──────┬──────┐
│+│000010 010101│110111│
└─┴──────┴──────┴──────┘
┌─┬──┬──┬──┐
│+│01 49│91│
└─┴──┴──┴──┘
以十进制表示,其等于:
┌─┬─┬─┬──┐
│+│149│55│ (we'll call this result A)
└─┴─┴─┴──┘
┌─┬─┬─┬──┐
│+│149│91│ (we'll call this result B)
└─┴─┴─┴──┘
结论 我们注意到≠B、 但它总是存在的。这是最后一个不同的字节。
因此,根据MIX计算机使用的数字系统,最低有效字节将有所不同,而下面两个字节将始终相同。因此书中出现了“?”。你能解释一下符号吗?也就是说,一个人应该如何解释例如
——|1234 | 0 | 0 | 9
?无论你未来的意图是什么,都不要试图破译现在的古老混合语言——如果你试图破译Doland Knuth的MMIX——“面向新千年的RISC计算机”——汇编语言,你的努力肯定会得到更好的回报我刚开始读唐纳德·克努特的《计算机编程的艺术》第一卷。我在书中读到,所有的卷都将用新的MMIX汇编语言重新编辑。它们是否已经在MMIX中可用@xmojmr@user346484