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

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

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

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

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

.model  tiny
          
.code
org 100h
.386   ;чтоб условный переход мог перейти дальше

begin:
 
PROGRAM_1:
 mov ax,3; очищаю екран
 int 10h
 
  mov dx,offset enter_string
 mov ah,09h
 int 21h
 
 MOV   AH,9               ;
   MOV   DX,offset mess0           ;
   INT   21h                ;
   MOV   DI,offset buff            ; сюда будем писать
   MOV   SI,offset massiv          ; от сюда - читать
   MOV   DX,offset size            ; кол-во повторов (длина строки)
 
compare:                    ;
   MOV   AH,BYTE[SI]        ; Берём число
   CALL  count_Digit        ; сколько раз оно встретилось в массиве?
   CMP   BX,3               ; проверка на 3.
   JAE   next               ; если больше/равно, то пропускаем число
   XCHG  AH,AL              ; иначе: текущее число у нас в AH
   STOSB                    ; кидаем его в AL, и записываем в буфер!
next:                       ;
   INC   SI                 ; следующее число массива..
   DEC   DX                 ; уменьшаем его длину
   OR    DX,DX              ; это последнее число в массиве?
   JNZ   compare            ; нет - мотаем цикл..
   MOV   CX,DI              ; Отсеянные числа у нас в буфере.
   dec   cx
   SUB   CX,offset buff            ; СХ = его длина
   MOV   SI,offset buff            ; травим SI на буфер (для LODSB)
print:                      ;
   XOR   AH,AH              ; обнуляем мусор
   LODSB                    ; читаем число из буфера
   MOV   BX,10              ; выводить на экран будем в DEC
   CALL  HEX2ASC            ; есть контакт!
   MOV   AL,','             ; вставим разделитель
   INT   29h 
   LOOP  print              ; мотаем цикл СХ-раз...

   mov dx,offset probel   
    mov ah,09h      
    int 21h
 
 mov dx,offset enter_string
 mov ah,09h
 int 21h

 enter_string     db  10,13,"$"
 probel           db  " $"

mess0    DB  10,13,'RESULT: $'
massiv   DB  1,2,3,4,1,2,3,3,3,5,6,2,4,7,8,4,4,5,6
size     =   $ - massiv     ; длина массива
buff     DB  64 DUP(0)      ; буфер для результата

;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
; Процедура:  "count_Digit" считает кол-во одинаковых символов в строке   ;
;  На входе:  АН = число/символ для поиска                                ;
;             СХ = длина строки                                           ;
;             SI = адрес строки                                           ;
; На выходе:  ВХ = количество найденых символов                           ;
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
count_Digit:                ;
   PUSH  SI                 ; SI нам нужен. сохраним его
   MOV   SI,offset massiv          ;
   MOV   CX,offset size            ;
   XOR   BX,BX              ; сбросим счётчик в нуль
@@1:                        ;
   LODSB                    ; читаем в AL из SI
   CMP   AH,AL              ;
   JNZ   @@2                ; прыг, если не совпало с фактором
   INC   BX                 ; иначе: счётчик +1
@@2:                        ;
   LOOP  @@1                ; обрабатываем строку до конца...
   POP   SI                 ;
RET                         ;

HEX2ASC:                    ;
   PUSHA                    ;
   MOV   BX,10              ;
   XOR   CX,CX              ;
isDiv:                      ;
   XOR   DX,DX              ;
   DIV   BX                 ;
   PUSH  DX                 ;
   INC   CX                 ;
   OR    AX,AX              ;
   JNZ   isDiv              ;
isOut:                      ;
   POP   AX                 ;
   CMP   AL,9               ;
   JLE   noHex              ;
   ADD   AL,7               ;
noHex:                      ;
   ADD   AL,30h             ;
   INT   29h                ;
   LOOP  isOut              ;
   POPA                     ;
RET                         ;
 
end begin

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

textual
Листинг программы
сегмент данных
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;буфер для ввода
     max db 254        ;максимально допустимая
     len db 0          ;действительная длина данных
     buf db 254 dup (0);буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 
;сегмент кода
 
;запрос на ввод строки
 mov ah,0ah
 lea dx,max
 int 21h
 jc exit
 
;Вход AH = 0aH
;DS:DX = адрес входного буфера (смотри ниже)
;Выход
;нет = буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)
;Описание:
;
;при входе буфер по адресу DS:DX должен быть оформлен так:
;    +---+---+---+---+---+---+- - -
;    ¦max¦ ? ¦ ?   ?   ?   ?   ?     MAX - максимально допустимая
;    +---+---+---+---+---+---+ -  -  длина ввода (от 1 до 254)
 
;    при выходе буфер заполнен данными следующим образом:
;    +---+---+---+---+---+---+- - -
;    ¦max¦len¦ T   E   X   T   0dH   
 
;LEN - действительная длина данных
;    +---+---+---+---+---+---+ -  -  без завершающего CR (здесь - 04H).
;символы считываются со стандартного ввода вплоть до CR (ASCII 0dH) или 
;до достижения длины MAX-1. если достигнут MAX-1, включается консольный 
;звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).
;Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. 
;последний символ в буфере - всегда CR (который не засчитан в байте длины). символы в буфере (включая LEN)

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


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

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

11   голосов , оценка 4 из 5
Похожие ответы