assembly 如何在玛丽的汇编语言中打印最小和最大用户输入?

euoag5mw  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(106)

所以在下面的代码中,我写了。我能够得到最大值输出后,用户输入8个随机整数,与一个上限32000在积极的一面和-32000在消极的一面,但我似乎不能得到最小值。对于最小值,它保持打印0
验证码:-

ORG 100

Main,     LOAD Count    
          STORE Count

Loop,     Input            
          STORE Value   
          LOAD Count
          ADD One       
          STORE Count 

CheckMin, LOAD Value   
          SUBT Smallest  
          SKIPCOND 800  
          JUMP Continue 
          LOAD Value  
          STORE Smallest

CheckMax, LOAD Value    
          SUBT Largest  
          SKIPCOND 400  
          JUMP Continue 

          LOAD Value    
          STORE Largest

Continue, LOAD Count  
          SUBT Seven
          SKIPCOND 800 
          JUMP Loop

Print,    LOAD Smallest 
          Output
          LOAD Largest 
          Output

          HALT
Value,    Dec 0
Count,    Dec 0
Smallest, Dec 0   
Largest,  Dec 0   
One,      Dec 1
Seven,    Dec 7

END

字符串
我试图改变“小数”(12月)的值,但它没有工作。保持他们在0除了“七,12月7日”,这是循环计数器设置为8为8个用户输入。这是家庭作业,所以任何帮助是赞赏!

4ktjp1zp

4ktjp1zp1#

你有一些逻辑错误,我想一次解决一个。
假设初始最小值为0,因此,代码将仅捕获小于0的值作为最小值-如果您输入所有正数,则最小值将是给定该变量的初始值,即0。
此外,如果你只输入负数,最大的也会显示为0,这是你对最大值的初始假设。
有三种可能的修复方法:
1.不管比较中的最小/最大,捕获第一个输入作为最初已知的最小值(和最大值),以忽略初始化假设为零。我们将在循环之外这样做,所以在C/pseudo代码中,类似于这样。

int smallest = 0;    // this 0 will never be used
        int largest = 0;     //   ditto
        int count = 8;

        int x = input ();
        smallest = x;        // this will capture the first input as smallest & largest
        largest = x;         //   which then ignores the zero initializations

        for ( int i = 1; i < count; i++ ) {   // start at 1 instead of 0
           int x = input ();
           if ( x < smallest ) 
               smallest = x;
           if ( y > largest )
               largest = x;
        }

字符串
这种方法适用于任何数量的输入,其中输入的计数>= 1,但是如果你想处理一个支持值为0的变量输入计数(例如,一个零元素的列表是一个合理的数学构造),它将不起作用,因为它需要至少一个输入。简单地检查计数以跳过包括第一个输入在内的整个事情可以缓解这种情况。
1.使用布尔值来判断一个值是否已被捕获。

bool smallestCaptured = false;
        int smallest = 0;
        ...
            if ( !smallestCaptured || x < smallest ) {
                smallestCaptured = true;
                smallest = x;
            }
        ...


这是精确的,但需要在循环中有更多的逻辑,并且,该逻辑涉及短路析取运算符,所以有点复杂。或者,它可以用if-then-else-if来完成。
1.对于最小(和最大)的初始假设使用不同的值

...
        smallest, DEC 32001
        largest, DEC -32001
        ...


由于这些初始化超出了您的预期范围,因此第一个输入将始终被捕获为最小值和最大值。(使用最大值也可以,例如32000,-32000。)
另一个问题是,当你对最小值检查执行if-then时,在某些情况下它会跳过最大值检查,所以你的代码看起来有点像这样:

if ( x < smallest ) {
        smallest = x;
        if ( x > largest )
            largest = x;
    }


这是一个控制流逻辑错误。应该将最小值和最大值作为单独的顺序语句独立检查,而不是作为嵌套语句。

相关问题