loops - 为什么我的程序没有输出到 8086 模拟器中给定数组中的最小值?
问题描述
我试图找到给定数组中的最小值,我使用的代码是这个
MOV SI,500
MOV CL,[SI]
MOV CH,00
INC SI
MOV AL,[SI]
DEC CL
INC SI
L1:CMP AL,[SI]
JNC SKIP
MOV AL,[SI]
SKIP:INC SI
LOOP L1
MOV [600],AL
HLT
它编译得很好,运行得很好,然后我去“aux”,然后去“memory”输入我的输入值。我将地址设置为 0100:0500,然后在第一行输入“01”“02”“03”“04”“05”,如下所示——https://i.imgur.com/Lrg23B2。 png并单击更新,然后单击“运行”,然后转到辅助-> 内存并检查地址 0600,这是我猜输出的位置,我得到的只是零,就像这样 --- https:/ /i.imgur.com/z2CCtBA.png我的代码有什么问题?为什么我没有得到最小值,而在 0600 中只有零?我是8086编程的初学者,请帮助。
解决方案
您不需要
DS
在程序顶部将段寄存器设置为 0100h 吗?您显然希望在 0100h:0500h 寻址内存。
你不必使用十六进制后缀吗?
MOV SI,500
使用小数 500;你需要MOV SI,0500h
十六进制!注意:如果您使用的是调试器,那么十六进制表示法很可能是默认值。如果您使用的是普通的汇编器,那么使用正确的前缀或后缀是必不可少的。
循环运行时间太长了!
MOV SI,500 MOV CL,[SI] <<<< If THIS reads 01 as is expected... MOV CH,00 INC SI MOV AL,[SI] DEC CL <<<< then THIS will produce 0 INC SI L1:CMP AL,[SI] JNC SKIP MOV AL,[SI] SKIP:INC SI LOOP L1 <<<< So THIS runs 65536 times. MOV [600],AL HLT
为了找到最小值,您必须将
jnc skip
指令更改为jb skip
。目前您正在寻找最大值。
这是您可以尝试的版本。一如既往:不要只是复制,而是要尝试了解它是如何工作的。
mov ax, 0100h
mov ds, ax
mov si, 0500h
mov cx, 5 ;The number of values in the array
mov al, 255 ;This will become the mininum
L1:
cmp al, [si]
jb SKIP
mov al, [si]
SKIP:
inc si
loop L1 ;This now runs 5 times.
mov [0600h], al
hlt
用更随机的数据尝试代码是个好主意。也许使用 3、2、5、1、4。
推荐阅读
- python - 安全的正则表达式从 html 中查找电子邮件
- vb.net - 如何使用管理员权限编写注册表?
- ssl - 让我们加密证书颁发
- vlcj - 带有运行时选项的 MediaList 播放项目
- scala - Scala中的LazyList和List有什么区别?
- odata - 在 OData Web Api 控制器中使用 $expand 的 NullReferenceException
- java - 抛出预期异常后测试响应
- c# - 从每个十进制数中删除字符串中的几个点/逗号
- php - PhpStorm - 如何在文件模板中转义美元符号(php 变量)?
- python - 如何递归比较列和返回值?