Почему я не получаю вывод в мою программу, чтобы найти минимальное значение в данном массиве в эмуляторе 8086? - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь найти наименьшее значение в данном массиве, и я использовал следующий код:

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", а затем к "Память ", чтобы ввести мои входные значения. Я устанавливаю адрес как 0100: 0500, а затем даю ввод «01», «02», «03», «04», «05», затем в первой строке, например, - https://i.imgur.com/Lrg23B2.png, и я нажимаю кнопку «Обновить», изатем "RUN", а затем перейдите в aux -> memory и проверьте адрес 0600, где я предполагаю, что будет вывод, и я получаю только нули, как это --- https://i.imgur.com/z2CCtBA.png что не так смой код? почему я не получаю минимальное значение и просто нули в 0600? Я абсолютный новичок в программировании 8086, пожалуйста, помогите.

1 Ответ

0 голосов
/ 19 октября 2019
  • Вам не нужно устанавливать регистр сегмента 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.

...