我正在尝试编写一个程序来查找内存中数组的最小值。这是我的代码:
Org 100 /Find minimum
Load Start
Add Num
Subt One
Store Loc
Loadi Loc
Store Min
Load Num
Subt One
Store J
Loop, Load J
Skipcond 00
Jump After
Jump Done
After, Load Loc
Subt One
Store Loc
Subt Min
Skipcond 00
Jump After2
Loadi Loc
Store Min
After2, Load J
Subt One
Store J
Jump Loop
Done, Load Min
Halt
Min, Dec 0 /where we save the min
Num, Dec 10 /Numbers of value in array
One, Dec 1
J, Dec 0 /Loop variable
Loc, Dec 0
Start, Hex 121 /Be sure to start off values in array
Array, Dec 5
Dec 20
Dec 11
Dec 15
Dec 83
Dec 2
Dec 7
Dec 1
Dec 13
Dec 15
我尝试运行它,但它没有正确地将 1 识别为最小值。相反,它得到 15(在累加器中),这显然是错误的。我的错误在哪里?
这看起来很可疑:
Loadi Loc
Store Min
你在零地址有什么?
[编辑] 啊,是的,但另一件事:它不是跳过第 9 个数组元素吗?
我理解它的初始化方式是: 将第 10 个元素存储为(当前)min,将 ptr 设置为第 9 个元素并将循环计数设置为 9。
然后循环中的第一件事 - 在检查循环计数器之后,它在检查“下一个”元素之前再次递减指针。
还是我理解错了?
[编辑#2]
啊哈哈,我给出的链接后面的玛丽不明白间接的指示。 确实如此。 http://computerscience.jbpub.com/ecoa/3e/simulators.aspx
看起来还有其他问题:
这没有意义:
After, Load Loc
Subt One
Store Loc
Subt Min / here 'Min' is subtracted from the element's address
Skipcond 00
我猜程序应该找到最小值,但它根本不起作用。
当我只是汇编并运行您提供的代码时,累加器最终得到的值为 15,这显然不是数组的最小值。
有两个问题:
Store Loc
后跟Subt Min
的序列没有任何意义,因为Loc
是地址而Min
是数组值。减去这些来进行比较是没有帮助的:这就像比较苹果和梨一样。您想要发生的事情是,Loc
处的值将被读入累加器,并且那个值将与Min
进行比较。要实现这一点,您需要在这两条指令之间插入 Loadi Loc
。
J
表示仍要访问的数组值的数量,但当它变为 0 时,仍会再进行一次循环迭代。这意味着将读取不属于数组的值,该值“可能”可能小于数组的最小值(不在本例中)并导致错误的结果。进行额外的迭代是因为当累加器小于零时Skipcond 00
将跳过,而当累加器为零时则不会。有多种方法可以修复此错误,例如将此指令替换为 Slipcond 400
,当累加器为零时,该指令将跳过。这给出了期望的结果。
通过这两个修复,它就可以工作了。
Start, Hex 121 /Be sure to start off values in array
ADR
指令,您可以在此处使用:
Start, ADR Array
如果程序能够输出
Output
之前添加一个Halt
指令。
J
CountDown
会更具描述性。
指令Org 100
您可以在没有计数器的情况下执行循环(
J
修改后的计划
Load ArrayAdr
Add ArraySize
Subt One
Store CurrentAdr / Refers to last array value
UpdateMin, Loadi CurrentAdr
Store Minimum
Loop, Load CurrentAdr
Subt ArrayAdr
Skipcond 800 / Skip when current address greater than start of array
Jump Done / Otherwise we are done
Load CurrentAdr
Subt One
Store CurrentAdr
LoadI CurrentAdr / Compare current value with Minimum
Subt Minimum
Skipcond 000 / Skip when array value < Min
Jump Loop / Otherwise loop without updating Minimum
Jump UpdateMin
Done, Load Minimum
Output
Halt
/ Constants
One, Dec 1
ArraySize, Dec 10 / Number of values in array
ArrayAdr, Adr Array / Address of Array
Array, Dec 800
Dec 600
Dec 810
Dec 650
Dec 830
Dec 650
Dec 700
Dec 522
Dec 530
Dec 450
/ Variables
Minimum, Dec 0 / The minimum value in the array so far
CurrentAdr, Dec 0 / The address of the current array value