Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MMIX陷阱每隔一段时间不工作_Assembly_Mmix - Fatal编程技术网

Assembly MMIX陷阱每隔一段时间不工作

Assembly MMIX陷阱每隔一段时间不工作,assembly,mmix,Assembly,Mmix,我使用这个网站上的MMIX: 我使用此代码让控制台打印“Hello World”“times”时间: 我想知道为什么这只产生了三个。看看代码,因为我乘以3,它应该打印Hello World 3次。 然而,仔细检查后,我注意到“00000701(陷阱)$255=Fputs(标准输出,#c)=0”和“00000701(陷阱)$255=Fputs(标准输出,#0)=12”将交替出现。我想这就是原因。但为什么会发生这种情况 我对这种语言的编码非常陌生,所以请不要太在意术语。这是一个有趣的bug。事实上,

我使用这个网站上的MMIX: 我使用此代码让控制台打印“Hello World”“times”时间:

我想知道为什么这只产生了三个。看看代码,因为我乘以3,它应该打印Hello World 3次。 然而,仔细检查后,我注意到“00000701(陷阱)$255=Fputs(标准输出,#c)=0”和“00000701(陷阱)$255=Fputs(标准输出,#0)=12”将交替出现。我想这就是原因。但为什么会发生这种情况


我对这种语言的编码非常陌生,所以请不要太在意术语。

这是一个有趣的bug。事实上,结果是:

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字符。这使得陷阱打印不成功,写入的字节数$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

你能找到陷阱0文档吗?(懒得去寻找它)。。。有人会期望它返回输出的字符数,所以交替使用0/12值使mul逻辑性增加2,但为什么它每隔一次输出0字节是奇怪的。(这就是你要问的吗?)是的,这就是我要找的。在trap
Fputs
之后,
$255
寄存器是否保持它的值?也许你应该在每次调用
trap
之前将其设置为
msg
地址。但是为什么它每秒钟都能工作。。。不知道。抱歉,我不想研究这个程序集变体到底是如何工作的,它似乎与我已经知道的CPU有太大的不同,所以这基本上就是我所拥有的。您是否尝试过在调试器中单步执行代码,并观察寄存器值?我假设有一个带调试器的MMIX模拟器。
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