2016-03-08 155 views
0

编写一个LC-3 汇编代码,用于查找内存中正数列表的最大值。 R0 包含列表开始的内存中的位置,并且 数字列表的末尾由零或负数表示。代码应将列表中值最大的 放入寄存器R5中。如果列表的第一个数字为零或 为负数,则R5应该包含零。 例如,如果R0内容为X4000,存储包含以下 值: X4000:10 x4001:20 x4002:15 x4003:-1如何编写LC-3汇编代码来查找列表的最大值?

的问题说,有书中的例子但我发现没有什么帮助,我写了一些代码之前,

.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

您的列表实际上是一个以数字结尾的空数组。您可以BLKW其次是要通过获得与LEA列表中的地址,存储和递增计数器变量,然后装入存储到保留

list: .BLKW 1000 

你可以从这个存储器中读取单词的数量申报内存空间在LDR注册。

0

.orig x3000 AND R0,R0,#0;清除R0 LEA R1,N1; R1是指向N1的指针 LDR R5,R1,#0; R5是最大值 回路
LDR R2,R1,#0;加载数字到R2 ADD R1,R1,#1;增量指针

ADD R2,R2,#0 BRz Exit;如果号码是cero,跳到退出 BRn退出;如果编号为负,则跳至退出

;数字是正数,因此检查哪一个是最大的,并且R3,R3,#0;清除R3 ADD R3,R2,#0;计算值2补
NOT R3,R3 ADD R3,R3,#1 ADD R6,R3,R5 BRP环路 BRZ环路 ;新的最高 和R5,R5,#0 ADD R5,R2,#0 BR环路

退出 HALT

.fill伪N1#10 .fill伪N2#20 .fill伪N3#15 N4 .FILL#-1

.END