Это правильно? - PullRequest
       12

Это правильно?

0 голосов
/ 29 декабря 2018

Готовлюсь к экзамену, и я хочу знать, правильный ли этот код.Я только что зарегистрировался на этом сайте, поэтому извините, если что-то не так с моим вопросом.

Этот код находит первое нулевое значение в массиве.Если ничего не найдено, 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 голосов
/ 29 декабря 2018

Есть несколько проблем с вашей программой:

  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   

Я бы порекомендовал не отправлять этот пример в качестве своего ответа, но, поскольку ваш код очень близок к работоспособности, модифицировать ваш код для работы даже при использовании может оказаться слишком сложной задачей. Мовор, [си] .

...