В одномерном массиве заменить отрицательные элементы нулями - Assembler
Формулировка задачи:
В одномерном массиве заменить отрицательные элементы нулями.Подсчитать число замен. Массив задать в сегменте данных или ввести с клавиатуры. Почти готова . Но не работает. Пишет ерунду. Кто подскажет? Уже запутался.
;В одномерном массиве заменить отрицательные элементы нулями. ;Подсчитать число замен. ;Массив задать в сегменте данных или ввести с клавиатуры. MASM MODEL small STACK 256 .data mes db 0ah,0dh,'Массив- ','$' massiv db 2,-3,4,5,-6,7,8,9,2,4;исходный массив .code main: mov ax,@data; заносим данные mov ds,ax; в ds xor ax,ax ;обнуление ax mov cx,10 ;значение счетчика цикла в cx mov si,0 ;индекс начального элемента в cx go: ; приступим к оброботке mov al,massiv[si] ; заносим в первый символ массива test al,al; сравнение с нулем число массива jns show; если не отрицательное то переход на метку show mov byte ptr massiv[si],0 ;если отрицательное то заменить на ноль inc si ;продвижение к следующему ;элементу массива ;вывод на экран получившегося массива mov cx,10; счетчик массива mov si,0; ??? mov ah,09h; ??? lea dx,mes ; вывод сообщения массива int 21h show: mov ah,02h ;функция вывода значения из al на экран mov dl,massiv[si] add dl,30h ;преобразование числа в символ int 21h inc si; переход к следующему числу loop show; метка exit:; выход из программы mov ax,4c00h ;стандартный выход int 21h end main ;конец программы
Решение задачи: «В одномерном массиве заменить отрицательные элементы нулями»
textual
Листинг программы
model small .stack 256 data segment para public 'data' ;объявление сегмента данных mas db 3,-1,2,-4,-2,-4,5,-8,4,3; данный массив, неупакованное BCD-число num = $ - mas; ;размер массива в байтах message db 'nashli otricatelnoe i zamenili na null $',0ah,0dh ; сообщение если есть отрицательное число count db 0; счетчик замен присваем начальное значение 0 data ends; конец данных code segment ; сам код assume cs:code, ds:data start:; начало программы mov ax,data; заносим данные в ах, далее mov ds,ax; занести в ds данные ax; lea bx,mas;берём в bx адрес первого элемента mov cx,num;счетчик цикла obrabotka: ; метка обработка cmp byte ptr [bx],0; сравниваем элемент с нулем jg neotric; если bx больше и не равно 0 ;то есть положительное число то переходим на метку neotric mov byte ptr[bx],0; проведем замену отрицательного числа на ноль inc count; считаем количесвто замен отрицательных чисел на ноль ;если не отрицательное neotric: inc bx; переход к следующему элементу (размер элемента = 1 байту) loop obrabotka; идем на метку obrabotka ;вывод количесвто замен на ноль mov ah,09h ;вывод сообщения, если нашли отрицательное число lea dx, message ; сообщение nashli otricatelnoe i zamenili na null int 21h; прирывание для вывода на экран mov al, count ; заносим данные счетчика в регистр AL aam ;двоичное число преобразуем в неупакованное BCD число or ax, 3030h ; преобразуем в символы ASCII xchg al, ah ; меняем местами int 29h ; выводим на экран mov al, ah int 29h int 21h mov ah,4Ch int 21h code ends; конец кода end start; конец программы
Объяснение кода листинга программы
- Объявление сегмента данных.
- Объявление массива в сегменте данных.
- Вычисление размера массива в байтах.
- Объявление переменной для подсчета количества замен.
- Начало программы.
- Загрузка сегмента данных в регистр AX.
- Загрузка адреса первого элемента массива в регистр BX.
- Загрузка размера массива в регистр CX.
- Организация цикла по всем элементам массива.
- Внутри цикла проверка на ноль.
- Если элемент не равен нулю, то замена на ноль.
- Увеличение счетчика замен.
- Выход из цикла.
- Вывод сообщения, если были найдены отрицательные числа.
- Вывод количества замен на ноль.
- Преобразование двоичного числа в неупакованное BCD число.
- Преобразование неупакованного BCD числа в символы ASCII.
- Вывод результата на экран.
- Завершение работы программы.
- Код завершения работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д