Подсчитать количество нулевых и ненулевых элементов в заданном векторе - Assembler

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

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

Здравствуйте, не могу разобраться, как вводить знаковые числа в массив.Само задание такое: Подсчитать количество нулевых и ненулевых элементов в заданном векторе и определить, каких элементов в векторе больше а) элементы вектора однобайтовые; б) элементы вектора двухбайтовые. Вот, что получилось для двухбайтового массива
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. Mas dw 10 dup (?)
  5. len dw 10
  6. Sch_0 dw 0 ;счетчик нулевых элементов вектора
  7. Sch_otr dw 0
  8. msg_z db "Null"
  9. msg_o db "Otr"
  10. msg_ravn db "Ravny"
  11. .code
  12. InputInt proc
  13. mov ah,0ah
  14. xor di,di
  15. mov dx,offset buff ; аддрес буфера
  16. int 21h ; принимаем строку
  17. mov dl,0ah
  18. mov ah,02
  19. int 21h ; выводим перевода строки
  20. ; обрабатываем содержимое буфера
  21. mov si,offset buff+2 ; берем аддрес начала строки
  22. cmp byte ptr [si],"-" ; если первый символ минус
  23. jnz ii1
  24. mov di,1 ; устанавливаем флаг
  25. inc si ; и пропускаем его
  26. ii1:
  27. xor ax,ax
  28. mov bx,10 ; основание сc
  29. ii2:
  30. mov cl,[si] ; берем символ из буфера
  31. cmp cl,0dh ; проверяем не последний ли он
  32. jz endin
  33. ; если символ не последний, то проверяем его на правильность
  34. cmp cl,'0' ; если введен неверный символ <0
  35. jb er
  36. cmp cl,'9' ; если введен неверный символ >9
  37. ja er
  38. sub cl,'0' ; делаем из символа число
  39. mul bx ; умножаем на 10
  40. add ax,cx ; прибавляем к остальным
  41. inc si ; указатель на следующий символ
  42. jmp ii2 ; повторяем
  43. er: ; если была ошибка, то выводим сообщение об этом и выходим
  44. mov dx, offset error
  45. mov ah,09
  46. int 21h
  47. int 20h
  48. ; все символы из буфера обработаны число находится в ax
  49. endin:
  50. cmp di,1 ; если установлен флаг, то
  51. jnz ii3
  52. neg ax ; делаем число отрицательным
  53. ii3:
  54. ret
  55. error db "incorrect number$"
  56. buff db 6,7 Dup(?)
  57. InputInt endp
  58. main proc
  59. Mov cx, len ;инициализация счетчика цикла
  60. Xor si,si ;инициализация индексного регистра
  61. Cyc:call InputInt
  62. mov mas[si],ax
  63. inc si
  64. dec cx
  65. jz dal
  66. jmp cyc
  67. dal:Mov cx, len ;инициализация счетчика цикла
  68. mov si,0
  69. Xor si,si ;инициализация индексного регистра
  70. Cycl: cmp mas[si],0 ;сравниваем элемент вектора с 0
  71. Jz zero ;нуль-элементы считаем в блоке zero
  72. Inc Sch_otr ;увеличиваем счетчик элементов <0
  73. Jmp kon_cycl
  74. Zero: Inc Sch_0 ;увеличиваем счетчик нулевых элементов
  75. kon_cycl: inc si ;
  76. loop cycl
  77. mov ax, sch_otr
  78. mov bx, sch_0
  79. cmp ax,bx
  80. jz ravn
  81. Jg pol
  82. mov ax,@data
  83. mov ds,ax
  84. mov ah,9
  85. mov dx,OFFSET msg_z
  86. int 21h
  87. mov ah,4ch
  88. int 21h
  89. jmp konec
  90. pol: mov ax,@data
  91. mov ds,ax
  92. mov ah,9
  93. mov dx,OFFSET msg_o
  94. int 21h
  95. mov ah,4ch
  96. int 21h
  97. jmp konec
  98. ravn: mov ax,@data
  99. mov ds,ax
  100. mov ah,9
  101. mov dx,OFFSET msg_ravn
  102. int 21h
  103. mov ah,4ch
  104. int 21h
  105. konec: nop
  106. main endp
  107. end main

Решение задачи: «Подсчитать количество нулевых и ненулевых элементов в заданном векторе»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4.  
  5. Mas dw 10 dup (?)
  6. Sch_0 dw 0 ;счетчик нулевых элементов вектора
  7. Sch_otr dw 0
  8.  
  9. msg_z db "Null", 13,10,'$'
  10. msg_o db "Otr", 13,10,'$'
  11.  
  12. .code
  13. jmp main
  14. InputInt proc
  15.     mov ah,0ah
  16.     xor di,di
  17.     mov dx,offset buff ; аддрес буфера
  18.     int 21h ; принимаем строку
  19.     mov dl,0ah
  20.     mov ah,02
  21.     int 21h ; выводим перевода строки
  22.    
  23. ; обрабатываем содержимое буфера
  24.     mov si,offset buff+2 ; берем аддрес начала строки
  25.     cmp byte ptr [si],"-" ; если первый символ минус
  26.     jnz ii1
  27.     mov di,1  ; устанавливаем флаг
  28.     inc si    ; и пропускаем его
  29. ii1:
  30.     xor ax,ax
  31.     mov bx,10  ; основание сc
  32. ii2:
  33.     mov cl,[si] ; берем символ из буфера
  34.     cmp cl,0dh  ; проверяем не последний ли он
  35.     jz endin
  36.  
  37.     sub cl,'0' ; делаем из символа число
  38.     mul bx     ; умножаем на 10
  39.     add ax,cx  ; прибавляем к остальным
  40.     inc si     ; указатель на следующий символ
  41.     jmp ii2     ; повторяем
  42.  
  43. ; все символы из буфера обработаны число находится в ax
  44. endin:
  45.     cmp di,1 ; если установлен флаг, то
  46.     jnz ii3
  47.     neg ax   ; делаем число отрицательным
  48. ii3:
  49.     ret
  50.  
  51. buff    db 6,7 Dup(?)
  52. InputInt endp
  53.  
  54. main:
  55. mov ax, @data
  56. mov ds, ax
  57. xor ax,ax
  58. Xor si,si ;инициализация индексного регистра
  59. Mov cx, 10 ;инициализация счетчика цикла
  60.  
  61. cycl1:
  62. push cx
  63. call InputInt
  64. mov mas[si], ax
  65. inc si
  66. pop cx
  67. loop cycl1
  68.  
  69. xor ax,ax
  70. Mov cx, 10 ;инициализация счетчика цикла
  71. Xor si,si ;инициализация индексного регистра
  72.  
  73. Cycl: cmp mas[si],0 ;сравниваем элемент вектора с 0
  74. Jz zero ;нуль-элементы считаем в блоке zero
  75. jl otr
  76. jmp kon_cycl
  77. otr:Inc Sch_otr ;увеличиваем счетчик элементов <0
  78. Jmp kon_cycl
  79. Zero: Inc Sch_0 ;увеличиваем счетчик нулевых элементов
  80. kon_cycl: inc si ;переходим к следующему элементу
  81. ;вектора
  82. loop cycl
  83.  
  84. mov bx, sch_0
  85. mov ax, sch_otr
  86. cmp ax,bx
  87. Jg otrb
  88. mov ax,@data
  89.     mov ds,ax
  90.     mov ah,9
  91. mov dx,OFFSET msg_z
  92.     int 21h
  93.     mov ah,4ch
  94.     int 21h
  95. jmp konec
  96. otrb:
  97. mov ax,@data
  98.     mov ds,ax
  99.     mov ah,9
  100. mov dx,OFFSET msg_o
  101.     int 21h
  102.     mov ah,4ch
  103.     int 21h
  104. konec:
  105. end main

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

  1. Объявляются переменные и задается текстовое сообщение msg_z для вывода Null и msg_o для вывода Otr.
  2. Описывается процедура InputInt, которая считывает числа из ввода пользователя.
  3. Инициализируется массив Mas и переменные Sch_0 (счетчик нулевых элементов вектора) и Sch_otr (счетчик отрицательных элементов вектора).
  4. Создается цикл для считывания 10 чисел и помещения их в массив Mas.
  5. Создается цикл для подсчета количества нулевых и отрицательных элементов вектора. В случае, если элемент равен 0, увеличивается Sch_0; если элемент меньше 0, увеличивается Sch_otr. После этого происходит вывод сообщения Null или Otr в зависимости от результата сравнения.
  6. Определяется момент завершения программы и выводится соответствующее сообщение.

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


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

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

12   голосов , оценка 3.833 из 5

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

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

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