编写一个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所以我有这个,但在我不知道如何做列表之后。我能得到一些帮助吗?
发布于 2016-03-09 23:06:42
您的列表实际上是一个以null结尾的数字数组。您可以使用BLKW声明内存空间,后跟要保留的字数
list: .BLKW 1000您可以通过LEA获取list的地址,存储并递增计数器变量,然后使用LDR将内存加载到寄存器中,从而读取该内存。
发布于 2017-08-14 00:50:37
.orig x3000和R0,R0,#0;Clear R0 LEA R1,N1;R1是指向N1 LDR R5,R1,#0的指针;R5是最大循环
LDR R2, R1, #0 ; load numbers into R2 ADD R1, R1, #1 ; Increment pointer添加R2,R2,#0 BRz Exit;如果number为cero BRn Exit,则跳转到Exit;如果number为负数,则跳到Exit
;数字为正数,请检查哪个为最大值
AND R3, R3, #0 ; Clear R3 ADD R3, R2, #0 ; Calc 2-complementNOT R3, R3 ADD R3, R3, #1 ADD R6, R3, R5 BRp Loop BRz Loop ; new max AND R5, R5, #0 ADD R5, R2, #0 BR Loop退出停止
N1 .FILL #10 N2 .FILL #20 N3 .FILL #15 N4 .FILL #-1
.END
https://stackoverflow.com/questions/35877405
复制相似问题