【问题标题】:find the min value in a given array in assembly 8086在程序集 8086 中找到给定数组中的最小值
【发布时间】:2017-01-03 14:58:59
【问题描述】:

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

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),任何帮助!

【问题讨论】:

  • 该死...从不使用array[si]从不!你不知道你在做什么。您的数组是单词数组而不是字节!汇编中没有索引数组访问!
  • 你的意思是最后一步“lastcmp”! ,但我把它移到 dx 寄存器以便能够比较!?
  • 不,我是说inc si
  • @MargaretBloom 试图告诉你的是array[si] 使用字节偏移量。尽管它看起来像数组索引,例如在 C 中它会自动按项目大小缩放。在组装中并非如此,您必须自己手动解决。在这种情况下,这意味着每次将si 增加2
  • @jester 非常感谢它现在可以正常工作了;)

标签: assembly emu8086 x86-16


【解决方案1】:
mov cx,5

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


inc si

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


dec cx 
cmp cx,0
JNE minimum

这里的cmp cx,0 指令毫无用处,因为dec cx 指令已经根据随后的条件跳转的需要定义了零标志。将代码缩短为:

dec cx
jnz 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

您认为为什么需要最后一部分?结果已经在AX 寄存器中。此外,由于您没有更改 SI 注册,因此这个额外的比较只会复制您在循环中所做的最后一个!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多