首页 > 解决方案 > 为什么我的程序没有输出到 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编程的初学者,请帮助。

标签: loopsassemblyx86-16emu8086

解决方案


  • 您不需要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。


推荐阅读