Vladus | |
|
Задача такая: Определите номера всех отрицательных элементов массива и сформируйте из них массив, расположенный сразу после заданного В принципе все не так сложно, но что то клинит меня... а) как определить номера? б) как сформировать массив из имеющихся элементов (нужно ли в разделе данных задать неинициализированый массив с заранее неизвестным числом переменных?) в) самое главное, какой командой записать массив, сразу после заданного? Как найти адрес куда писать это понятно: .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 | |
|
а) № элемента массива это смещение/размер_элемента_массива. Если размер элемента 2, то получается SI/2, разумеется, чтобы не использовать деление, достаточно просто воспользоваться сдвигом вправо на 1 разряд, это эквивалентно целочисленному делению на 2. На 4 - 2 разряда и т.д. б) Насколько я понимаю исходный массив фиксированной длины и, поскольку в заданном массиве все элементы могут быть отрицательными, надо объявлять 2 массива одинаковой длины. Судя по заданию, сразу после заданного массива. в) mov "{как задать неиниц. массив?}" Используйте оператор повторения: array dw dup(0) Правда, здесь массив инициализируется нулями. "{какой нужен цикл, чтобы проверить номера?}" Любой цикл с предусловием. См. справочник. "{как записать массив по адресу, который сейчас в bx?}" не понятный вопрос |
Vladus | |
|
Спасибо большое за совет! Меня осенило! Если кому интересно то вот, привожу текст: .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 [bx],ax jg m2 mov [di],si add di,2 m2: loop m1 mov ah,4ch int 21h end begin |
Le_noch_ka | |
|
Вообще-то Твоя программа работает не верно ты в цикле не изменяеш 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 //Вот и вся программа |
Рекомендуем почитать также топики: Сотовые операторы Деление сети Системный анализ Подскажите пожалуйста Помогите выбрать хост-нейм... |