如何让这个 MARIE(汇编)代码停止在 10 处?让用户输入数字后使用循环和计数器

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

ORG 400 / 从地址 400 开始

输入/从用户处获取号码 存储 X / 将输入存储在内存位置 X

LOAD ONE / 加载常数值1 存储计数器/将其存储在计数器存储位置

LOOP, LOAD X / 加载X的值 输出/显示X的当前值

加一/X 加 1 STORE X / 存储 X 的新值

LOAD Counter / 加载当前计数器值 加一/计数器加 1 STORE Counter / 存储更新的计数器值

LOAD X / 加载X的值 SKIPCOND 000 / 如果 X == 11 则跳过 JUMP LOOP / 跳回循环开头

加载计数器/加载最终计数器值 输出/显示计数器

HALT/终止程序

X, DEC 0 / X 的内存位置(初始化为 0) 计数器,DEC 0 / 计数器的内存位置(初始化为 0) 1、DEC 1 / 常数值 1

我预计循环会在数字为 10 时结束,并且应该打印迭代次数(循环),但它在 10 后继续运行(请查找附件)

在此输入图片描述

assembly marie
1个回答
0
投票

我们的程序存在一些问题:

  • 有一条注释说“如果 X == 11 则跳过”,但您的代码中没有任何内容与 11 进行比较。您只是检查累加器中的值(即 X 的值)是否为负数。您可以通过从 X 中减去 10 并检查它是否严格为正来解决此问题。

  • 您让计数器从 1 开始,但这是不正确的。您还没有计算任何有效的 X,所以您应该从 0 开始。

  • 如果用户输入一个大于10的数字,我认为你不应该输出任何数字,而输出一个计数为0。然而,你的程序总是打印X的初始值,无论它是否在范围与否。您可以通过first执行退出检查来解决此问题,并且只有在该检查之后才继续显示部分的循环。

不是一个大问题,但是:

  • 仅仅说明代码字面意思的注释是没有用的。所以不要这样评论:

    STORE X / Store the new value of X
    

    这是没有帮助的信息,因为

    STORE
    指令的文档已经说了这么多。相反,尝试在更高层次上进行评论,解释一组指令的更高目标是什么。

  • ORG 400
    :如果您不在程序顶部存储数据,这不是很有用。只要放下这个。

这是一个可能的实现:

         INPUT
         STORE X
         LOAD Zero
         STORE Counter
Loop,    LOAD X        / First check if X is within range
         SUBT Eleven   / Subtract 11 
         SKIPCOND 000  / Skip if X - 11 < 0 
         JUMP Exit     / Otherwise we've displayed the whole range
         LOAD X        
         OUTPUT        / Display the current value of X
         ADD One       / Increment X by 1 
         STORE X
         LOAD Counter
         ADD One       / Increment the counter by 1 
         STORE Counter
         Jump Loop
         
Exit,    LOAD Counter
         OUTPUT        / Display the counter
         HALT

X,       DEC 0
Counter, DEC 0
Zero,    DEC 0
One,     DEC 1
Eleven,  DEC 11
© www.soinside.com 2019 - 2024. All rights reserved.