2012-09-21 35 views
3

发布之前的编辑:所以我有点基本上都认为这一切都是在我自己完成之后才完成的,整个freakin的问题被打出来并整齐排列。为了不为无功而工作,无论如何我都会发布这个消息,询问这是否正确,并征求任何建议/意见。我仍然不确定一件事。制作一个简单的汇编程序语言程序需要帮助

好的,所以我是计算机科学的完全noob。现在我正在学习汇编语言和机器语言编程。这是一个家庭作业问题,所以请帮助我理解,不要把答案扔在我的脸上。我试图编写一个程序,使用分支条件(一个循环)从1到20(答案是210)的数字总和。使用

的口诀是:

L for load 
A for Add 
St for store 
BC for branch on condition 
C for compare 
CH for channel 

有10个寄存器放东西进去。所以基本上我必须做2件事:1)找出一种方法来合计从1到20的所有数字(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + ...) +20),其中包括制作一个循环,并且2)创建一个计数器,以便当它达到二十时知道停止。这是正确的吗??

START L R1,COUNT 
     A R1,ONE 
     ST R1,COUNT 
     A R2,COUNT 
     C R1,TWENTY 
     BC 3,??? 
     ST R2,SUM 
     CH SUM 
     STOP 
COUNT DC F'0' 
ONE  DC F'1' 
TWENTY DC F'20' 
     END START 

所有这一切都是说:将COUNT的内容(以0开头)加载到Register1。将ONE添加到Register1的内容(即1)。将这个在Register1中的新号码存入COUNT。将这个新号码添加到Register2。将COUNT的内容与TWENTY的内容(即20)进行比较。如果COUNT内部的数字小于或等于20,则分支(/重复)(3是条件代码)。一旦计数器达到20,条件将被破坏,指令将进入下一行,即:将寄存器2中的数字(现在应该是210)存储到变量SUM中。然后调用CHannel在I/O设备上显示SUM的内容。然后停止。

现在......我不知道如何指定分支/返回到开始,所以它重复该过程,直到计数器达到20为止。我也不确定是否应该将COUNT指定为0或不。

感谢您的任何/所有帮助。

+1

+1写得很好的第一个问题!您可以投票或接受您认为有用的答案。 –

回答

3

我看到了一些东西。由于我没有测试过,所以我建议你自己测试一下。

您需要初始化寄存器2,以便在添加计数值时,寄存器2以已知值开始。

通常情况下,条件分支要求您指定条件以及条件满足时分支到的标签。不确定你的汇编器对此需要什么。

所以我会考虑以下更改。我在每行上都使用类似于C的两个斜杠来注释。我假定Branch on Condition指令有两个操作数,一个条件操作数,指示要测试哪些标志以及汇编程序计算标签的偏移量。我假设AD指令将设置BC指令可以测试的条件标志。我为条件标志放了一个3来测试BC指令,但是我不确定操作数实际上应该如何,所以我对该行进行了评论。

如果您的汇编程序允许添加两个寄存器并且允许寄存器作为操作数的XOR指令,那么您可以通过将XOR寄存器2与自身以及寄存器1与其自身进行置零操作来清零,然后执行操作来取消变量COUNT使用这两个寄存器的ADD。 XOR的工作原理是,一位异或的一位变为零,零异或的零保持为零。

条件分支BC指令可能允许或不允许向后分支。如果它不存在或者对它有某种约束,则可能必须使用跳转或JMP指令通过BC指令返回到循环的顶部,然后跳转到跳过JMP的一次COUNT达到20.

START L R2,COUNT // initialize Register 2 to zero as Count starts with zero 
     L R1,COUNT // initialize Register 1 to zero as Count starts with zero 
LOOP  A R1,ONE  // add one as part of incrementing Count for the next sequence 
     ST R1,COUNT // save current Count back. 
     A R2,COUNT // add the current value of Count into Register 2 for the sum 
     C R1,TWENTY // compare Register 1, Count, to end of loop condition 
     BC 3,LOOP  // branch if less than back to loop. if 20 we are done. 
     ST R2,SUM 
     CH SUM 
     STOP 
COUNT DC F'0' 
ONE  DC F'1' 
TWENTY DC F'20' 
SUM  DC F'0' 
     END START 
+0

谢谢理查德。我不知道你在大多数帖子中都在谈论什么,但是你的代码是有道理的。事实上,教授昨天在他的演讲中向我展示了完全一样的东西。在他分配作业之前,哈达告诉我们,哈哈。无论如何,谢谢! – Tur1ng