В одномерном массиве заменить отрицательные элементы нулями - Assembler

Узнай цену своей работы

Формулировка задачи:

В одномерном массиве заменить отрицательные элементы нулями.Подсчитать число замен. Массив задать в сегменте данных или ввести с клавиатуры. Почти готова . Но не работает. Пишет ерунду. Кто подскажет? Уже запутался.
Листинг программы
  1. одномерном массиве заменить отрицательные элементы нулями.
  2. ;Подсчитать число замен.
  3. ;Массив задать в сегменте данных или ввести с клавиатуры.
  4. MASM
  5. MODEL small
  6. STACK 256
  7. .data
  8. mes db 0ah,0dh,'Массив- ','$'
  9. massiv db 2,-3,4,5,-6,7,8,9,2,4;исходный массив
  10. .code
  11. main:
  12. mov ax,@data; заносим данные
  13. mov ds,ax; в ds
  14. xor ax,ax ;обнуление ax
  15. mov cx,10 ;значение счетчика цикла в cx
  16. mov si,0 ;индекс начального элемента в cx
  17. go: ; приступим к оброботке
  18. mov al,massiv[si] ; заносим в первый символ массива
  19. test al,al; сравнение с нулем число массива
  20. jns show; если не отрицательное то переход на метку show
  21. mov byte ptr massiv[si],0 ;если отрицательное то заменить на ноль
  22. inc si ;продвижение к следующему
  23. ;элементу массива
  24. ;вывод на экран получившегося массива
  25. mov cx,10; счетчик массива
  26. mov si,0; ???
  27. mov ah,09h; ???
  28. lea dx,mes ; вывод сообщения массива
  29. int 21h
  30. show:
  31. mov ah,02h ;функция вывода значения из al на экран
  32. mov dl,massiv[si]
  33. add dl,30h ;преобразование числа в символ
  34. int 21h
  35. inc si; переход к следующему числу
  36. loop show; метка
  37. exit:; выход из программы
  38. mov ax,4c00h ;стандартный выход
  39. int 21h
  40. end main ;конец программы

Решение задачи: «В одномерном массиве заменить отрицательные элементы нулями»

textual
Листинг программы
  1. model small
  2. .stack 256
  3. data segment para public 'data'  ;объявление сегмента данных
  4. mas db 3,-1,2,-4,-2,-4,5,-8,4,3; данный массив, неупакованное BCD-число
  5. num = $ - mas;  ;размер массива в байтах
  6. message db 'nashli otricatelnoe i zamenili na null  $',0ah,0dh ; сообщение если есть отрицательное число
  7. count   db  0; счетчик замен присваем начальное значение 0
  8. data ends; конец данных
  9. code segment ; сам код
  10. assume cs:code, ds:data
  11. start:; начало программы
  12. mov ax,data; заносим данные в ах, далее
  13. mov ds,ax; занести в ds данные ax;
  14. lea bx,mas;берём в bx адрес первого элемента
  15. mov cx,num;счетчик цикла
  16. obrabotka: ; метка обработка
  17. cmp byte ptr [bx],0; сравниваем элемент с нулем
  18. jg neotric; если bx больше и не равно 0
  19. ;то есть положительное число то переходим на метку neotric
  20. mov byte ptr[bx],0; проведем замену отрицательного числа на ноль
  21.  
  22. inc count; считаем количесвто замен отрицательных чисел на ноль
  23. ;если не отрицательное
  24. neotric:
  25. inc bx;  переход к следующему элементу (размер элемента = 1 байту)
  26. loop obrabotka; идем на метку obrabotka
  27. ;вывод количесвто замен на ноль
  28. mov    ah,09h    ;вывод сообщения, если нашли отрицательное число
  29. lea    dx, message ; сообщение nashli otricatelnoe i zamenili na null
  30. int    21h; прирывание для вывода на экран
  31. mov al, count ; заносим данные счетчика в регистр AL
  32. aam ;двоичное число преобразуем в неупакованное BCD число
  33. or ax, 3030h ; преобразуем в символы ASCII
  34. xchg al, ah ; меняем местами
  35. int 29h ; выводим на экран
  36. mov al, ah
  37. int 29h
  38. int 21h
  39. mov ah,4Ch
  40. int 21h        
  41. code ends; конец кода
  42. end start; конец программы

Объяснение кода листинга программы

  1. Объявление сегмента данных.
  2. Объявление массива в сегменте данных.
  3. Вычисление размера массива в байтах.
  4. Объявление переменной для подсчета количества замен.
  5. Начало программы.
  6. Загрузка сегмента данных в регистр AX.
  7. Загрузка адреса первого элемента массива в регистр BX.
  8. Загрузка размера массива в регистр CX.
  9. Организация цикла по всем элементам массива.
  10. Внутри цикла проверка на ноль.
  11. Если элемент не равен нулю, то замена на ноль.
  12. Увеличение счетчика замен.
  13. Выход из цикла.
  14. Вывод сообщения, если были найдены отрицательные числа.
  15. Вывод количества замен на ноль.
  16. Преобразование двоичного числа в неупакованное BCD число.
  17. Преобразование неупакованного BCD числа в символы ASCII.
  18. Вывод результата на экран.
  19. Завершение работы программы.
  20. Код завершения работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы