使用LC2K ISA,有人可以向我解释这个程序在做什么吗?
lw 0 1 five load reg1 with 5 (symbolic address)
lw 1 2 3 load reg2 with -1 (numeric address)
start add 1 2 1 decrement reg1
beq 0 1 2 goto end of program when reg1==0
beq 0 0 start go back to the beginning of the loop
noop
done halt end of program
five .fill 5
neg1 .fill -1
stAddr .fill start will contain the address of start (2)
符号和数字地址有什么区别?例如,为什么第2行将reg2加载为-1? -1来自哪里?
“开始”在第3行意味着什么,为什么该行在使用add时会减少reg1?另外,4-5和7-9行如何工作?
如果有人能够简明扼要地解释这个节目,我会非常感激。
谢谢。
答案 0 :(得分:2)
这看起来像是用于某些学术目的的这些制作指令集之一,但它似乎显而易见:
'symbolic'和'numeric'之间的区别在于符号大小写使用符号(名称)来引用某些内容,而数字大小写使用数字。在汇编时,符号将被其数值替换,因此最终代码没有区别。符号five
指向某些数据,因此在汇编代码时将替换该数据的地址。
(我假设reg0是数字0的快捷方式,否则该寄存器总是包含0 - 这对于一些真实的体系结构来说是正确的,并且似乎在这里反映出来)
似乎第二行获取第一行中加载的寄存器的内容(其中包含5,因为这是存储在符号five
所指示的位置的数据),添加3,然后在这个新计算的地址加载数据。 3 + 5 = 8,如果我们假设每一行占用内存中的一个位置,从0开始编号,那么位置8的数据就是表示为neg1
的行,其中包含-1。
start
是另一个符号,它允许程序员从其他地方引用这部分代码。在这种情况下,它显然是一个循环。
该行在添加-1
时递减寄存器。 (它似乎再次引用寄存器1,2和1 - 所以假设reg1既是输入又是输出,而包含-1的reg2是另一个输入。)
其余的代码只是循环(beq指令似乎允许比较 - 它检查两个寄存器是否相等,如果它们是,则它分支)。第一个分支是检查reg1 == 0,并使用数字分支目标2,这可能只是跳过2个指令。第二个分支是检查0 == 0,它总是为真,然后跳转到符号start
,这个符号在组合时将再次转换为数值(也许-2,返回两个指令到其中start
实际上是。)
最后三行只是声明程序使用的一些数据(实际上最后一行似乎是多余的,但我不知道这个虚构的架构)。