Emu8086 копирование значений из массива в другой - PullRequest
2 голосов
/ 05 апреля 2019

Для моей курсовой работы мне нужно написать программу, которая копирует все значения ниже 1000h из массива 16-разрядных чисел со знаком (называемых inputArray) в другой массив (называемый outputArray).В этом упражнении мне необходимо использовать строковые инструкции lods и stos.

. И единственная проблема, которую я имею в качестве примера, заключается в следующем:

org 100h
jmp init
value equ 8000h
numbers dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h
init: lea SI, numbers
mov CX, (init-numbers)/2
mov DX, 0h
cld
compare: lodsw
cmp AX, value
ja insert
nextElem: loop compare
lea DI, numbers
mov CX, DX
extract: pop AX
stosw
loop extract
end: int 20h
insert: push AX
inc DX
jmp nextElem

1 Ответ

2 голосов
/ 06 апреля 2019

Для моей курсовой работы мне нужно написать программу, которая копирует все значения ниже , чем 1000h из массива со знаком 16-битчисла (называемые inputArray) в другой массив (называемый outputArray).В этом упражнении я должен использовать строковые инструкции lods и stos .

Давайте рассмотрим все ключевые элементы вашей задачи относительно программыкод, который вы получили / нашли (я думаю) .

. ниже и подписано
Поскольку соответствующие числа являются числами со знаком, вам необходимоиспользуйте соответствующие условные инструкции.К ним относятся jl (JumpIfLess) и jg (JumpIfGreater).В примере программы использовалась ja (JumpIfAbove), которая подходит для работы с беззнаковыми числами!

. 1000h
Просто измените строку value equ 8000h.

. другой массив
Пример программы сохраняет результаты поверх исходных чисел.Для вашей задачи вам нужно определить второй массив.Этот дополнительный массив должен быть способен вместить самое большее количество элементов, что и входной массив:

inputArray    dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h
outputArray   dw 0, 0, 0, 0, 0, 0

Вместо того, чтобы писать его, как указано выше, вы можете использовать оператор dup:

inputArray    dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h
outputArray   dw 6 dup (0)

. lods and stos
Программа, которую вы получили, уже использует эти инструкции.


Давайте напишем лучший пример программы (сохраняя этот глупый обход через стек).

. Если вы поместите раздел данных под разделом кода, он вам больше не понадобится jmp init.
. Сделайте метки выделенными, сделав отступ кода.
.операнды также выровнены.
. Избегайте прыгать вокруг.Не ja insert, а jna nextElem и поместите инструкции по вставке рядом.
. Избегайте медленной инструкции loop.dec cx jnz ... Замените это красиво.Вы даже можете использовать другой счетный регистр в целом (*).

org 100h
value equ 8000h

  lea  SI, numbers
  mov  CX, (init-numbers)/2
  mov  DX, 0h
  cld
compare:
  lodsw
  cmp  AX, value
  jna  nextElem
  push AX         ;insert
  inc  DX         ;insert
nextElem:
  dec  cx
  jnz  compare
  lea  DI, numbers
                           ;No need to setup CX, just use DX (*)
extract:
  pop  AX
  stosw
  dec  dx                  ;(*)
  jnz  extract
end:
  int 20h

numbers dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h

Как это должно быть записано.

org 100h

  mov  si, offset inputArray
  mov  di, offset outputArray
  cld
Again:
  lodsw
  cmp  ax, 1000h
  jnl  IsNotLess
  stosw
IsNotLess:
  cmp  si, offset outputArray  ;Arrays must be adjacent for this to work!
  jb   Again

  int  20h

inputArray    dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h
outputArray   dw 6 dup (0)

Выходной массив будет иметь 5 элементов:

  1. Отрицательное число 8933h
  2. Положительное, но меньше 1000h число 0328h
  3. Отрицательное число 99A0h
  4. Отрицательное число 0F422h
  5. Положительное число меньше 1000ч 0101ч
...