寻找数组中最小的数字。结果不正确

问题描述 投票:0回答:2

我正在尝试编写一个程序来查找内存中数组的最小值。这是我的代码:

    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(在累加器中),这显然是错误的。我的错误在哪里?

arrays assembly marie
2个回答
0
投票

这看起来很可疑:

   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

我猜程序应该找到最小值,但它根本不起作用。


0
投票

当我只是汇编并运行您提供的代码时,累加器最终得到的值为 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
    :这个评论强调了潜在的问题:如果你修改程序,这个地址可能会改变。遗憾的是您必须手动计算它。 MARIE 有
  • ADR

    指令,您可以在此处使用:

    Start,  ADR Array
    
    
    

    如果程序能够
    输出
  • 结果,那是很实用的,所以在
  • Output

    之前添加一个Halt指令。

    
    
    变量的名称

    J
  • 不太具有描述性。
  • CountDown

    会更具描述性。

    
    
    指令

    Org 100
  • 并不是真正需要的;如果你的程序是从内存位置 0 开始加载的,那就没问题了。放下它。
  • 您可以在没有计数器的情况下执行循环(

    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

© www.soinside.com 2019 - 2024. All rights reserved.