Ввод массива программно - Assembler

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

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

В данной программе массив уже задан , как сделать так , что бы массив нужно было вводить? Сама программа удаляет с массива все элементы которые встречаются больше двух раз. Как организовать ввод я не понимаю Помогите пожалуйста.

Код программы:

Листинг программы
  1. .model tiny
  2. .code
  3. org 100h
  4. .386 ;чтоб условный переход мог перейти дальше
  5.  
  6. begin:
  7. PROGRAM_1:
  8. mov ax,3; очищаю екран
  9. int 10h
  10. mov dx,offset enter_string
  11. mov ah,09h
  12. int 21h
  13. MOV AH,9 ;
  14. MOV DX,offset mess0 ;
  15. INT 21h ;
  16. MOV DI,offset buff ; сюда будем писать
  17. MOV SI,offset massiv ; от сюда - читать
  18. MOV DX,offset size ; кол-во повторов (длина строки)
  19. compare: ;
  20. MOV AH,BYTE[SI] ; Берём число
  21. CALL count_Digit ; сколько раз оно встретилось в массиве?
  22. CMP BX,3 ; проверка на 3.
  23. JAE next ; если больше/равно, то пропускаем число
  24. XCHG AH,AL ; иначе: текущее число у нас в AH
  25. STOSB ; кидаем его в AL, и записываем в буфер!
  26. next: ;
  27. INC SI ; следующее число массива..
  28. DEC DX ; уменьшаем его длину
  29. OR DX,DX ; это последнее число в массиве?
  30. JNZ compare ; нет - мотаем цикл..
  31. MOV CX,DI ; Отсеянные числа у нас в буфере.
  32. dec cx
  33. SUB CX,offset buff ; СХ = его длина
  34. MOV SI,offset buff ; травим SI на буфер (для LODSB)
  35. print: ;
  36. XOR AH,AH ; обнуляем мусор
  37. LODSB ; читаем число из буфера
  38. MOV BX,10 ; выводить на экран будем в DEC
  39. CALL HEX2ASC ; есть контакт!
  40. MOV AL,',' ; вставим разделитель
  41. INT 29h
  42. LOOP print ; мотаем цикл СХ-раз...
  43.  
  44. mov dx,offset probel
  45. mov ah,09h
  46. int 21h
  47. mov dx,offset enter_string
  48. mov ah,09h
  49. int 21h
  50.  
  51. enter_string db 10,13,"$"
  52. probel db " $"
  53.  
  54. mess0 DB 10,13,'RESULT: $'
  55. massiv DB 1,2,3,4,1,2,3,3,3,5,6,2,4,7,8,4,4,5,6
  56. size = $ - massiv ; длина массива
  57. buff DB 64 DUP(0) ; буфер для результата
  58.  
  59. ;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
  60. ; Процедура: "count_Digit" считает кол-во одинаковых символов в строке ;
  61. ; На входе: АН = число/символ для поиска ;
  62. ; СХ = длина строки ;
  63. ; SI = адрес строки ;
  64. ; На выходе: ВХ = количество найденых символов ;
  65. ;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
  66. count_Digit: ;
  67. PUSH SI ; SI нам нужен. сохраним его
  68. MOV SI,offset massiv ;
  69. MOV CX,offset size ;
  70. XOR BX,BX ; сбросим счётчик в нуль
  71. @@1: ;
  72. LODSB ; читаем в AL из SI
  73. CMP AH,AL ;
  74. JNZ @@2 ; прыг, если не совпало с фактором
  75. INC BX ; иначе: счётчик +1
  76. @@2: ;
  77. LOOP @@1 ; обрабатываем строку до конца...
  78. POP SI ;
  79. RET ;
  80.  
  81. HEX2ASC: ;
  82. PUSHA ;
  83. MOV BX,10 ;
  84. XOR CX,CX ;
  85. isDiv: ;
  86. XOR DX,DX ;
  87. DIV BX ;
  88. PUSH DX ;
  89. INC CX ;
  90. OR AX,AX ;
  91. JNZ isDiv ;
  92. isOut: ;
  93. POP AX ;
  94. CMP AL,9 ;
  95. JLE noHex ;
  96. ADD AL,7 ;
  97. noHex: ;
  98. ADD AL,30h ;
  99. INT 29h ;
  100. LOOP isOut ;
  101. POPA ;
  102. RET ;
  103. end begin

Решение задачи: «Ввод массива программно»

textual
Листинг программы
  1. сегмент данных
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;буфер для ввода
  4.      max db 254        ;максимально допустимая
  5.      len db 0          ;действительная длина данных
  6.      buf db 254 dup (0);буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8.  
  9. ;сегмент кода
  10.  
  11. ;запрос на ввод строки
  12.  mov ah,0ah
  13.  lea dx,max
  14.  int 21h
  15.  jc exit
  16.  
  17. ;Вход AH = 0aH
  18. ;DS:DX = адрес входного буфера (смотри ниже)
  19. ;Выход
  20. ;нет = буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)
  21. ;Описание:
  22. ;
  23. ;при входе буфер по адресу DS:DX должен быть оформлен так:
  24. ;    +---+---+---+---+---+---+- - -
  25. ;    ¦max¦ ? ¦ ?   ?   ?   ?   ?     MAX - максимально допустимая
  26. ;    +---+---+---+---+---+---+ -  -  длина ввода (от 1 до 254)
  27.  
  28. ;    при выходе буфер заполнен данными следующим образом:
  29. ;    +---+---+---+---+---+---+- - -
  30. ;    ¦max¦len¦ T   E   X   T   0dH  
  31.  
  32. ;LEN - действительная длина данных
  33. ;    +---+---+---+---+---+---+ -  -  без завершающего CR (здесь - 04H).
  34. ;символы считываются со стандартного ввода вплоть до CR (ASCII 0dH) или
  35. ;до достижения длины MAX-1. если достигнут MAX-1, включается консольный
  36. ;звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).
  37. ;Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR.
  38. ;последний символ в буфере - всегда CR (который не засчитан в байте длины). символы в буфере (включая LEN)

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


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

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

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

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

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

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