В одномерном массиве заменить отрицательные элементы нулями - 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.
- Вывод результата на экран.
- Завершение работы программы.
- Код завершения работы программы.