为什么我没有输出到程序中以找到8086仿真器中给定数组中的最小值?

问题描述 投票:-1回答:1

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

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

loops assembly x86-16 emu8086
1个回答
0
投票
  • 您是否不需要在程序顶部将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
    
  • 为了找到minimum,您必须将jnc skip指令更改为jb skip。目前,您正在寻找maximum


这是您可以尝试的版本。一如既往:不要只是复制而是尝试了解其工作原理。

  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。

© www.soinside.com 2019 - 2024. All rights reserved.