首页 文章

在程序集8086中找到给定数组中的最小值

提问于
浏览
1

我编写了一个代码来计算给定数组中的最小值,并且想法是取第一个元素(考虑它是最小值)并将其与其余元素进行比较然后交换值以防我找到更小的元素,这里是我的代码:

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 回答

  • 1

    mov cx,5

    您处理的数组总共只有5个元素 . 您已经在单独的步骤中删除了第一个元素,因此您的代码只能执行与剩余4个元素的比较!


    inc si

    由于数组包含单词,因此需要将 SI 寄存器增加2才能进入下一个数组元素 . 请记住,在像 mov dx,array[si] 这样的指令中, [si] 部分实际上是数组中的偏移量(以字节数表示的位移) . 它不像通常的高级语言那样的索引 .


    dec cx
    cmp cx,0
    JNE最低限度

    这里的 cmp cx,0 指令非常无用,因为 dec cx 指令已经根据后面的条件跳转定义了零标志 . 将代码缩短为:

    dec cx
    jnz minimum
    

    lastcmp :;将最后一项与最小值进行比较,如果它更小,则交换
    mov dx,array [si]
    cmp ax,dx
    jb endi
    xchg ax,dx

    为什么你认为你最后一节需要这个?结果已经在 AX 寄存器中 . 此外,由于你没有更改 SI 寄存器,这个额外的比较只是重复你在循环中所做的最后一个!

相关问题