MMIX TRAP不是每隔一段时间都在工作

时间:2018-03-03 18:19:26

标签: assembly mmix

我使用此网站的MMIX:http://mmix.cs.hm.edu/ 我用这段代码让控制台打印出来#34; Hello World" "倍"次:

times IS 3

msg BYTE "Hello World",#A,0
Main GETA $255,msg
    SET $91,times
    MUL $91,$91,2
    SUB $91,$91,1 
    TRAP 0,Fputs,StdOut
    BP $91,@-8
    TRAP 0,Halt,0

我想知道为什么这只会产生3个。查看代码,因为我将时间乘以3,它应该打印Hello World 3次。 但仔细观察后,我注意到" 00000701(TRAP)$ 255 = Fputs(StdOut,#c)= 0" AND" 00000701(TRAP)$ 255 = Fputs(StdOut,#0)= 12"会交替。我以为这是原因。但为什么会这样呢?

我对使用这种语言进行编码非常陌生,所以请在术语上轻松一点。

1 个答案:

答案 0 :(得分:1)

这是一个有趣的错误。实际上,输出为:

Hello World
Hello World
Hello World

为什么这样做是由于该玩具程序的组装方式以及MMIX中输出工作方式的结果

当程序在内存中汇编时,它从地址0x0处的字符串开始-字节为:

0  1  2  3  4  5  6  7  8  9  10  11  12  ...
H  e  l  l  o  _  W  o  r  l   d  \n  \0  ...

输出指令是

    TRAP 0,Fputs,StdOut

此指令打印地址位于寄存器$ 255中的字符串,并将返回值置于$ 255中。返回值是成功写入的字节数,错误写入-1的字节数

循环确实按预期运行了6次,但这是怎么回事:

循环从$ 255设置为0开始,即字符串的地址

第一次迭代将打印“ Hello World \ n”,并将$ 255设置为12(即字符串的长度)

第二次$ 255的值为12-用作要打印的字符串的地址。您可以在上面的内存布局中看到,地址12具有NUL字符。这样一来,TRAP不会成功打印任何内容,并且写入的字节数将$ 255设置为0。

第三次$ 255的值是字符串的有效地址0,因此它被打印出来,并且将$ 255的长度设置为12。

您明白了。

因此该字符串每6次打印一次,共3次

解决方法是将$ 255设置为循环内字符串的地址。完整的程序是:

times IS 3

msg   BYTE "Hello World",#A,0
Main  SET $91,times
      MUL $91,$91,2
      SUB $91,$91,1 
      GETA $255,msg
      TRAP 0,Fputs,StdOut
      BP $91,@-12
      TRAP 0,Halt,0