Ввод массива программно - 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)