首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >donald knuth的Mix汇编语言的算术运算

donald knuth的Mix汇编语言的算术运算
EN

Stack Overflow用户
提问于 2014-09-17 01:05:03
回答 3查看 1.1K关注 0票数 4

我一直在读Donald Knuth的《编程的艺术》第一卷,在这本书中,MIX被用作汇编语言。在Knuth谈到MIX中的算术运算的部分,我不理解减法、乘法和除法是如何进行的。

例如,课本上有这样的内容:

寄存器A具有以下字码:-| 1234 | 0 | 0 | 9,而存储器单元,例如M,具有以下字码:-| 2000 | 150 | 0

书中说,在执行A-M时,结果是:+| 766 | 149|?

在MIX中,记忆被分成单词。每个单词都有以下内容:第一个字段表示符号(+或-)

接下来的两个字节保存地址。

下一个字节表示索引,而第五个字节表示字段规范。

最后一个字节用于操作码。

书中说,在执行A-M时,结果是:+| 766 | 149|?

有人能帮我吗?

EN

回答 3

Stack Overflow用户

发布于 2019-03-01 08:51:20

我意识到这个问题有点老了,但我最近正在解决这个问题。问题的核心是模棱两可;混合词语的印刷表示是模棱两可的。

根据Knuth的说法,一个字节必须至少包含64个值(0..63),并且不超过100个(0..99)值。通过仔细阅读规范,其他一些答案将是无效的。(第125页TAOCP第1卷)

让我们在二进制和十进制解释中解决这个问题。首先对混合字进行显式转换,然后以熟悉的十进制模式执行运算。最后,将答案转换回混合表示。

代码语言:javascript
复制
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

答案的混合字二进制表示为:

代码语言:javascript
复制
200811895 = [(766 * 64^3) + (149 * 64) + 55] = 766 149 55

现在来看小数的解释:

代码语言:javascript
复制
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

混合单词的十进制表示为:

代码语言:javascript
复制
767491 = [(766 * 10^3) + (149 * 10) + 1] = 766 149 1

请注意,打印的表示形式不明确。例如,1234 0 0 9可以同时表示3234857051234009。根据您对单词的读取(二进制或十进制模式),您正在处理两个不同的问题,并具有两个唯一的答案。

下面的表格将进行总结,希望能让事情变得清晰。

代码语言:javascript
复制
       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?我们能解决这个问题吗?价值。

代码语言:javascript
复制
  766 149 0     200811840           767490
          ?            55                1

如果不使用字段包装,混合单词表示就足够模糊了;很容易弄错。字段打包是不相关的,因为操作将整个单词作为一个单元进行操作。将操作的结果表示为字段压缩字节是另一个抽象层。

票数 4
EN

Stack Overflow用户

发布于 2021-02-15 00:08:44

我们必须记住一个字节在MIX中意味着什么。一个字节必须能够保存:

  1. at至少64个不同的值,and
  2. at 100个不同的values

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

decimal计算机上,字节必须是2位 large。因为这将允许我们存储10²=100不同的值,满足条件1。和100≤100,满足条件2。

让我们看看如何在每台计算机上进行计算。

在6位二进制计算机上:

代码语言:javascript
复制
┌─┬─┬─┬─┐                           ┌─┬──────┬──────┬──────┐
│-│0│0│9│   would be represented as │-│000000│000000│001001│
└─┴─┴─┴─┘                           └─┴──────┴──────┴──────┘

代码语言:javascript
复制
┌─┬─┬─┬─┐                           ┌─┬──────┬──────┬──────┐
│-│150│0│   would be represented as │-│000010 010110│000000│
└─┴─┴─┴─┘                           └─┴──────┴──────┴──────┘

减去这两个就得到了:

代码语言:javascript
复制
┌─┬──────┬──────┬──────┐
│+│000010 010101│110111│
└─┴──────┴──────┴──────┘

它的十进制数等于:

代码语言:javascript
复制
┌─┬─┬─┬──┐
│+│149│55│  (we'll call this result A)
└─┴─┴─┴──┘

在两位十进制计算机上:

代码语言:javascript
复制
┌─┬─┬─┬─┐                           ┌─┬──┬──┬──┐
│-│0│0│9│   would be represented as │-│00│00│09│
└─┴─┴─┴─┘                           └─┴──┴──┴──┘

代码语言:javascript
复制
┌─┬─┬─┬─┐                           ┌─┬──┬──┬──┐
│-│150│0│   would be represented as │-│01 50│00│
└─┴─┴─┴─┘                           └─┴──┴──┴──┘

减去这两个就得到了:

代码语言:javascript
复制
┌─┬──┬──┬──┐
│+│01 49│91│
└─┴──┴──┴──┘

它的十进制数等于:

代码语言:javascript
复制
┌─┬─┬─┬──┐
│+│149│91│  (we'll call this result B)  
└─┴─┴─┴──┘

结论

我们注意到A≠B,但是149总是在那里。它是不同的最后一个字节。因此,根据MIX计算机使用的数字系统,最低有效字节将不同,而随后的两个字节将始终相同。因此出现了"?“在书里。

票数 4
EN

Stack Overflow用户

发布于 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25874604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档