Для моей курсовой работы мне нужно написать программу, которая копирует все значения ниже , чем 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 элементов:
- Отрицательное число 8933h
- Положительное, но меньше 1000h число 0328h
- Отрицательное число 99A0h
- Отрицательное число 0F422h
- Положительное число меньше 1000ч 0101ч