我试图在给定数组中找到最小值,而我使用的代码是这个
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,然后单击“更新”,然后单击“运行”。然后转到aux->内存并检查地址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
为了找到minimum,您必须将jnc skip
指令更改为jb skip
。目前,您正在寻找maximum。
这是您可以尝试的版本。一如既往:不要只是复制而是尝试了解其工作原理。
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。