写一个LC-3 汇编代码,用于查找内存中正数列表的最大值。 R0 包含列表开头的内存中的位置,以及列表的结尾 数字由零或负数表示。代码应该是最好的 将列表中的值放入寄存器R5中。如果列表的第一个数字为零或 否定,R5应该包含零。 例如,如果R0包含值x4000,则内存包含以下内容 值: x4000:10 x4001:20 x4002:15 x4003:-1
问题是书中有一个例子,但我没有发现任何帮助,我之前为这个问题写了一些代码,
.orig x3000
LD R1, NUMBER1 ;load NUMBER1 into R1
LD R2, NUMBER2 ;load NUMBER2 into R2
BRz Equals ;we jump to Equals if NUMBER1 = NUMBER2 (we can just jump directly to END)
BRn GreaterR2 ;we jump to GreaterR2 if NUMBER1 < NUMBER2
BRp GreaterR1 ;we jump to GreaterR1 if NUMBER1 > NUMBER2
Equals BRnzp End ;
GreaterR2 ADD R5, R5, #2 ;R0 = -1
BRnzp End
GreaterR1 ADD R5, R5, #6 ;R0 = 1
BRnzp End
End HALT ;THE END
NUMBER1 .FILL #2 ;
NUMBER2 .FILL #6 ;
.END
所以我有这个但是在我不知道怎么做列表之后。我可以得到一些帮助吗?
答案 0 :(得分:0)
您的列表实际上是一个空终止的数字数组。您可以使用BLKW声明内存空间,后跟要保留的单词数
list: .BLKW 1000
您可以通过获取带有LEA的列表地址,存储和递增计数器变量,然后将存储器加载到具有LDR的寄存器中来读取此存储器。
答案 1 :(得分:0)
.orig x3000
AND R0,R0,#0;清除R0
LEA R1,N1; R1是指向N1的指针
LDR R5,R1,#0; R5是最大值
环
LDR R2,R1,#0;将数字加载到R2中
添加R1,R1,#1;增量指针
ADD R2,R2,#0 BRz退出;如果数字是cero,请跳至退出 BRn退出;如果数字为负,则跳至退出
数字是正数,所以检查哪个是最大的
AND R3,R3,#0;清除R3
添加R3,R2,#0; Calc 2-complement
不是R3,R3
添加R3,R3,#1
添加R6,R3,R5
BRp循环
BRz Loop
;新的最大
AND R5,R5,#0
添加R5,R2,#0
BR Loop
退出 HALT
N1 .FILL#10 N2 .FILL#20 N3 .FILL#15 N4 .FILL#-1
.END