【问题标题】:Why am I not getting an output to my program to find the minimum value in a given array in 8086 emulator?为什么我的程序没有输出到 8086 模拟器中给定数组中的最小值?
【发布时间】:2019-10-18 07:27:38
【问题描述】:

我试图找到给定数组中的最小值,我使用的代码是这样的

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-->memory 并检查地址 0600,这是我猜输出的位置,我得到的只是零,就像这样 --- https://i.imgur.com/z2CCtBA.png 我的代码有什么问题?为什么我没有得到最小值,而在 0600 中只有零?我是 8086 编程的初学者,请帮助。

【问题讨论】:

    标签: loops assembly x86-16 emu8086


    【解决方案1】:
    • 您不需要在程序顶部将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。

    【讨论】:

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