使用LC2K指令集,有人能给我解释一下这个程序是做什么的吗?
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行用-1加载reg2?-1是从哪里来的?
第3行上的"start“是什么意思,为什么该行在使用add时会递减reg1?另外,4-5和7-9行是如何工作的?
如果有人能简明扼要地解释这个程序,我将不胜感激。
谢谢。
发布于 2013-01-19 17:33:47
这看起来像是用于学术目的的一个虚构的指令集,但它似乎足够明显:
“symbol”和“numeric”之间的区别在于,符号大小写使用符号(名称)来表示事物,而数字大小写则使用数字。符号在汇编时被它们的数值替换,因此在最终代码中没有区别。符号five指向某些数据,因此在汇编代码时将替换该数据的地址。
(我假设reg0是数字0的快捷方式,否则寄存器总是包含0-这对于一些真实的体系结构是正确的,似乎在这里也是如此)
第二行似乎取第一行加载的寄存器的内容(包含5,因为这是存储在符号five指示的位置的数据),加3,然后在这个新计算的地址加载数据。3+5= 8,如果我们假设每一行占用内存中的一个位置,从0开始编号,那么位置8的数据就是表示为neg1的行,它包含-1。
第3行上的start是另一个符号,它允许程序员从其他地方引用这部分代码。在这种情况下,它显然是一个循环。
该行在添加-1时递减寄存器。(它似乎再次引用了寄存器1、2和1-因此假设reg1既是输入又是输出,而包含-1的reg2是另一个输入)。
代码的其余部分只是循环( beq指令似乎允许比较-它检查两个寄存器是否相等,如果相等,则进行分支)。第一个分支检查reg1 ==是否为0,并使用数值分支目标2,这可能只是向前跳转2条指令。第二个分支是检查if 0 == 0,这始终是真的,然后跳到符号start,它在汇编时将再次转换为数字值(可能是-2,以返回两条指令到start实际所在的位置)。
最后三行只是声明了程序使用的一些数据(实际上最后一行似乎是多余的,但我不知道这个虚构的架构)。
https://stackoverflow.com/questions/14411279
复制相似问题