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