assembly - 如何打印值列表 + 最大值/最小值
问题描述
我在看这个小人电脑问题:
用户将首先输入数据的大小,然后输入单个数字。
我必须打印 (
OUT
) excatcly 输入的内容,然后是数据值的最大值和最小值
例子:
- 第一个输入: 2 // 数据的数量
- 第二个输入:5 //第一个数据
- 第三个输入:7 //第二个数据
- 输出:2、5、7、5(最小)、7(最大)
我必须在最后打印所有内容(当用户完成输入所有输入时)
我的尝试:
IN # Acc = number of values to read (N)
STO M
LOOP BRZ PRG
SUB ONE
STO N # N=N-1
IN # values
ST STO PRG # Store it in the program starting at PRG
LDA ST # Get current store command (ST)
ADD ONE # add one to store command to increment memory location
STO ST # Update store command (ST)
LDA N # Put current value of N in accumulator
BRZ PRINT
BRP LOOP # Continue loop - 12
#My problem is here
PRINT LDA M
OUT
LDA PRG
OUT
FIN HLT
M DAT 0
N DAT 0 # Number of values to read
ONE DAT 1 # Value 1
PRG DAT 0 # We will store all of the values from this point onward
问题
我试图解决这个问题,但如您所见,我只成功打印了第一个值。我还将输入保存在内存中,但是如何循环地址以获取输出值?
解决方案
您用于存储输入的自修改代码模式也可用于输出它。STO PRG
您将拥有动态指令,而不是修改动态LDA PRG
指令。
您的尝试没有显示用于确定最小值和最大值的代码。您可以在输入循环期间或在输出循环期间收集此信息。
请考虑以下附加说明:
- 用代码初始化变量(不是常量),这样如果 LMC 被重置(没有完全重新组装),它仍然可以正常工作。
- 使用更具描述性的标签和变量名。
ST
并且PRG
是相当不起眼的名字......
所以它可以像下面那样工作。此代码使用Wikipedia上描述的 LMC 助记符。所以 STA = STO 和 INP = IN。你可以在这里运行程序:
#input: 5 3 9 6 2 4
INP # data size
BRZ halt # nothing to do
; initialise (so program still runs correctly when reset)
STA size
LDA halt # =zero
STA max
LDA big
STA min
LDA staArray
STA store
LDA ldaArray
STA load
; input loop
LDA size
SUB one
nextInput STA counter
INP # get data value
store STA array # self-modified
STA value
SUB min
BRP checkmax
LDA value
STA min
checkmax LDA max
SUB value
BRP incInput
LDA value
STA max
incInput LDA store
ADD one
STA store # modify code
LDA counter
SUB one
BRP nextInput
LDA size
OUT # output input size
SUB one
outputLoop STA counter
load LDA array # self-modified
OUT # output data value
LDA load
ADD one
STA load # modify code
LDA counter
SUB one
BRP outputLoop
LDA min
OUT
LDA max
OUT
halt HLT
# constants
one DAT 1
big DAT 999
staArray STA array
ldaArray LDA array
# variables
size DAT
counter DAT
min DAT
max DAT
value DAT
array DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.812/lmc.js"></script>
评论:
如果不要求仅在所有输入完成后才产生输出,则不需要自修改代码。请参阅此答案,其中在处理输入时生成输出。
推荐阅读
- python - 错误:(-215:Assertion failed) npoints > 0 在使用 OpenCV 处理轮廓时
- gradle - Gradle:在多个子项目中包含相同的 SourceSet
- sas - 警告:无法扫描列的文本长度或时间类型
- perl - 如何从 anaconda 修复 Perl 而不安装 bioperl?`拯救 BioPerl-1.007002 的安装。`
- django - 将多边形或线保存到数据库 django/mapbox
- git - 使用 github 操作通过 git push production 推送生产
- python - Docplex 添加约束太慢
- java - Java比较值,最好的方法
- multithreading - 多线程实现中的错误
- symfony - Doctrine(Symfony4) 将数据存储为无效的 HEX 值