我使用此网站的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"会交替。我以为这是原因。但为什么会这样呢?
我对使用这种语言进行编码非常陌生,所以请在术语上轻松一点。
答案 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