Маленький вопрос по ASM

Vladus
10/31/2006, 8:34:30 PM
Задача такая:

Определите номера всех отрицательных элементов массива и сформируйте из них массив, расположенный сразу после заданного


В принципе все не так сложно, но что то клинит меня...

а) как определить номера?
б) как сформировать массив из имеющихся элементов (нужно ли в разделе данных задать неинициализированый массив с заранее неизвестным числом переменных?)
в) самое главное, какой командой записать массив, сразу после заданного?

Как найти адрес куда писать это понятно:

.model small
.data
array dw -1,5,-4,9,-3
N dw 5
{как задать неиниц. массив?}
.code
begin
mov ax,@data
mov ds,ax
lea bx,array
mov cx,N
m1: {какой нужен цикл, чтобы проверить номера?}
loop m1
{формируем массив}
lea bx,a+10 ; Находим адрес для записи второго массива
{как записать массив по адресу, который сейчас в bx?}
mov ah,4ch
int 21h
end begin


Заранее благодарю, надеюсь услышать рациональные советы по решению данной задачи, а не голый текст программы. ;-)
Roman
11/1/2006, 6:42:12 PM
а) № элемента массива это смещение/размер_элемента_массива. Если размер элемента 2, то получается SI/2, разумеется, чтобы не использовать деление, достаточно просто воспользоваться сдвигом вправо на 1 разряд, это эквивалентно целочисленному делению на 2. На 4 - 2 разряда и т.д.

б) Насколько я понимаю исходный массив фиксированной длины и, поскольку в заданном массиве все элементы могут быть отрицательными, надо объявлять 2 массива одинаковой длины. Судя по заданию, сразу после заданного массива.

в) mov

"{как задать неиниц. массив?}"
Используйте оператор повторения:
array dw dup(0)
Правда, здесь массив инициализируется нулями.

"{какой нужен цикл, чтобы проверить номера?}"
Любой цикл с предусловием. См. справочник.

"{как записать массив по адресу, который сейчас в bx?}"
не понятный вопрос
Vladus
11/1/2006, 8:57:02 PM
Спасибо большое за совет! Меня осенило! Если кому интересно то вот, привожу текст:

.model small
.data
array1 dw -1,5,-4,9,-3
array2 dw ?,?,?,?,?
N dw 5
.code
begin:
mov ax,@data
mov ds,ax
mov ax,0
xor si,si
lea bx,array1
lea di,array2
mov cx,N
m1: inc si
cmp ,ax
jg m2
mov ,si
add di,2
m2: loop m1
mov ah,4ch
int 21h
end begin
Le_noch_ka
2/23/2007, 6:18:47 AM
Вообще-то Твоя программа работает не верно ты в цикле не изменяеш Bx поетому всё время сравниваеш только первый элемент масива.
Вот мой вариант программы. Проверено под отладчиком рабочий на все 100%

.model small
.data
array1 dw -1,5,-4,9,-3
array2 dw ?,?,?,?,?
N dw 5
.code
begin:
mov ax,@Data //инициализируем сегментные регистры
Push Ax
Push Ax
Pop Ds
Pop Es
mov cx,n //заносим в Сх количество проходов цикла
lea si,Array1 //загружаем адреса масивов
lea di,Array2 //
mov dx,cx // запоминаем общее количество елементов в dx
xor bx,bx // обнуляем Вх
m1: //цикл
lodsw // загружаем в Ах следующий елемент масива 1
cmp ax,bx // сравниваем с 0
jg m2 //если >0 то ничего никуда не записиваем, а сразу
//переходим к следующиму елементу
// иначе
Mov ax,dx // подщитываем индекс елемента
sub ax,cx
// если нужно нумеровать елементы не с 0 а с 1 то роскоментируй
// следующую линию, тоесть убери две косые чёрточки в начале
// inc ax
stosw //и сохраняем его в масиве 2
m2:
loop m1 // повторяем цикл
xor al,al // программа завершилась без ошибки (код 0)
mov ah,4ch // подфункция 4с - завершить програму
int 21h // выити в DOS
end begin

//Вот и вся программа