0

我目前正在开始学习机器语言和汇编。我正在处理的程序相当简单,只是十进制和十六进制数的基本加减法,但由于某种原因,我无法得到实际答案。

免责声明:是的,这是一项大学作业。不,我不想让你为我做这件事。我向我的教授寻求帮助,但他的解释只会让我更加困惑 - 所以我希望 stackoverflow 社区可以帮助澄清我的错误在哪里,以便我可以修复它。

我在模拟 H1 和 V1 计算机的 Windows 平台上的“sim”中运行它,所以它是一个模拟环境。

这是日志文件:

Simulator Version 4.0               Fri Jan 29 17:15:56 2016

Machinecode file   = ex1-3b.mac   Size =  17 (hex) =   23 (dec)
Microcode file     = none         Size =  93 (hex) =  147 (dec)
Config file        = none
Log file           = ex1-3b.log
Answer file        = none
Simulation mode    = horizontal
Microlevel         = disabled
Shifter            = one-position
Cmd line addr      = F3C   (hex) =   3900 (dec)
Load point         = 0     (hex) =      0 (dec)
======================== Log Turned On  Fri Jan 29 17:15:56 2016
---- [T7] 0: st   /1 010/ g
  0: st   /1 010/ m[010]=002D/0000  
  1: add  /2 011/ ac=0000/0045  
  2: sub  /3 012/ ac=0045/0038  
  3: sub  /3 013/ ac=0038/0025  
  4: add  /2 014/ ac=0025/0030  
  5: add  /2 015/ ac=0030/002B  
  6: st   /1 016/ m[016]=0000/002B  
  7: hout /FFF9 / 002B
  8: dout /FFFD / 43
  9: halt /FFFF / 
Machine inst count =     A (hex) =     10 (dec)
---- [T7] d0
  0: 1010 2011 3012 3013 2014 2015 1016 FFF9    ........
  8: FFFD FFFF 0000 0000 0000 0000 0000 0000    ........
 10: 0000 0045 000D 0013 000B FFFB 002B 0000    .E....+.
 18: 0000 0000 0000 0000 0000 0000 0000 0000    ........

所以,这应该做的是:

45(10) + 45(16) - 13(10) - 13(16) + b(16) + (-5)(10)

(10) 是 base10, (16) 是十六进制。为了我自己的理智,当我将这些值输入到程序中时,我将它们转换为 base10 以保持它们的一致性(每个数字旁边的 t 告诉编译器使用 base10)。

这是我对其工作原理的理解:

我告诉它加载内存插槽 10(是的,我知道我在这里浪费了很多内存),我将其设置为初始值 45。然后我在插槽 11 中添加 45,在 12 中减去 13,在 19 中13(十六进制中 13 的十进制形式),14 中的 11,然后 15 中的 -5。然后我将这些全部存储在插槽 16 中。

接下来,在停止程序之前,我以十六进制和十进制形式打印存储在内存插槽 16 中的数字。

到目前为止,我在这一切上都是正确的吗?还是我在某个地方出错了?这就是我很好奇的地方。

现在我的结果是 43,但如果我的数学是正确的,实际的结束数字应该是 59。

任何帮助将不胜感激!

4

1 回答 1

1
  • 根据我使用的 Android 应用程序,结果应该是 88(10) / 58(16)。至少结果应该是偶数,因为您要添加 6 个奇数,所以我认为不会是 59。
  • 我猜你应该加载(memory -> ac) 而不是st(ac -> memory) 作为第一条指令。
于 2016-01-29T22:54:13.800 回答