我编写了一个代码来计算给定数组中的最小值,并且想法是取第一个元素(考虑它是最小值)并将其与其余元素进行比较然后交换值以防我找到更小的元素,这里是我的代码:
array dw 7,4,12,5,1
mov si,00h
mov ax,array[si]
mov cx,5
minimum:
inc si ;find the minimum value
mov dx,array[si]
cmp ax,dx
jb nochange
swap:
xchg ax,dx
nochange:
dec cx
cmp cx,0
JNE minimum
lastcmp: ; to compare the last item with the minimum value and swap if it's smaller
mov dx,array[si]
cmp ax,dx
jb endi
xchg ax,dx
end
但似乎我有一个问题,因为它比较所有元素,但不是最后一个,所以它总是给我(4),它是给我(1),任何帮助!
1 回答
您处理的数组总共只有5个元素 . 您已经在单独的步骤中删除了第一个元素,因此您的代码只能执行与剩余4个元素的比较!
由于数组包含单词,因此需要将
SI
寄存器增加2才能进入下一个数组元素 . 请记住,在像mov dx,array[si]
这样的指令中,[si]
部分实际上是数组中的偏移量(以字节数表示的位移) . 它不像通常的高级语言那样的索引 .这里的
cmp cx,0
指令非常无用,因为dec cx
指令已经根据后面的条件跳转定义了零标志 . 将代码缩短为:为什么你认为你最后一节需要这个?结果已经在
AX
寄存器中 . 此外,由于你没有更改SI
寄存器,这个额外的比较只是重复你在循环中所做的最后一个!