Ввод массива программно - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д