这是正确的吗?

时间:2018-12-29 08:52:07

标签: assembly emu8086

正在学习考试,我想知道此代码是否正确。 我刚刚注册了该站点,所以对我的问题有任何疑问感到抱歉。

此代码查找数组中的第一个零值。如果没有找到,它将使SI指向最后一个数组元素。

Data Segment
array DW -3, 7, 20, 10, 0, 4, 9
End Segment

Code Segment

MOV SI, OFFSET array
MOV CX, LENGTHOF array
MOV AX, 0
L1:
MOV AX, [SI]
CMP AX, 0
JE FOUND
JCXZ NOT FOUND
ADD SI, 2
LOOP L1
FOUND:
RET

NOT FOUND: 
MOV SI, 12
END

1 个答案:

答案 0 :(得分:1)

您的程序存在一些问题;

  1. 如果找不到值,程序将立即运行并执行 MOV SI,12
  2. JCXZ 是多余的,因为 LOOP 已在测试CX之后进行查找。
  3. LOOP 仅减少1,因此您要测试的值是预期的两倍。

以下是NASM中的一个示例,除了 OFFSET LENGTHOF 以外,它们基本上是相同的。

         org    0x100               ; Origin of code (Maybe EMU8086 doesn't need this)

         mov    si, Values          ; Nothing wrong with using Array either
         mov    cx, (VEnd-Values)/2 ; Actual number of words in array

    L0:  lodsw                      ; Loads AX with value pointed to by SI and inc's SI.
         cmp    ax, 0
         jz     Done
         loop   L0                  ; Will continue until CX = 0

  Done:  dec    si
         dec    si                  ; Point back to last value read
         ret                        ; Terminate program

Values: dw  -3, 7, 20, 10, 0, 4, 9
VEnd:   db  0   

我不建议将此示例作为您的答案,但是由于您的代码非常接近可行,因此即使使用 mov ax,[si] < / strong>。