Цель задания: Ввод с клавиатуры или считывание 10 двухбайтных чисел и вывод на экран все четные числа с сохранением в файл.
Блок схема
ПРОГРАММА
code_ segment para 'code'
assume cs:code_,ds:data_.
.386
main:
mov ax,data_ ; инициализация
mov ds,ax ; сегментного регистра
call create ; вызовы подпрограмм создания массива
call obrabot
call vivod
mov ax,4c00h ; стандартное завершение программы
int 21h
;---Создание массива 10-ти 2-хбайтовых чисел---
create proc
mov ah,9
lea dx,mes0
int 21h ; выдача сообщения mes0
mov ah,1
int 21h ; считывание символа ("1" или "2")
cmp al,31h ; если нажали "1",
je met4 ; прыгнуть на met4
mov f,1 ; иначе установить флаг f в 1
mov ax,3d00h ; и открыть файл
lea dx,name_file
int 21h
mov bx,ax
mov cx,10
lea di,mas1
jmp met1
met4:
mov ah,9 ; если была нажата "2",
lea dx,mes1 ; то выдать сообщение mes1
int 21h
mov cx,10
lea di,mas1
met1:
cmp f,1
jne met5 ; если считываем не из файла, прыгнуть на met5
mov word ptr buf,cx ; сохранение регистра cx в неиспользуемой части буфера buf
mov ah,3fh
mov cx,6 ; иначе, считывать из файла по 6 байт
lea dx,buf ; (вместе с символами перевода строки)
add dx,2 ; и записывать данные по адресу buf+2
int 21h
mov cx,word ptr buf ; восстановление сохраненного состояния регистра cx
jmp met6
met5:
mov ah,0ah ; если числа вводим вручную, то
lea dx,buf ; записываем их по адресу buf+2
int 21h
mov ah,9
lea dx,buf
add dx,6 ; перевод строки после ввода очередного числа
int 21h
met6:
mov ax,word ptr buf+2 ; считываем старшие 2 цифры числа
call binar ; преобразуем в бинарный код
mov ds:[di+1],ah ; сохраняем в старший байт числа
mov ax,word ptr buf+4 ; считываем младшие 2 цифры числа
call binar ; преобразуем в бинарный код
mov ds:[di],ah ; сохраняем в младший байт числа
add di,2
loop met1
mark3:
cmp f,1
jne mark4
mov ah,3eh ; если считывание идет из файла, закрываем его
int 21h
mark4:
ret
create endp
;---Подпрограмма преобразования числа из ASCII кода в бинарный код---
; входной ASCII код - в регистре ax
; выходной бинарный код - в регистре ah
preobr proc
cmp ah,39h
ja metka1
sub ah,30h
jmp lo
metka1:
sub ah,37h
lo:
cmp al,39h
ja metka2
sub al,30h
jmp mark
metka2:
sub al,37h
mark:
shl al,4
add ah,al
xor al,al
ret
preobr endp
;---Подпрограмма обработки массива---
obrabot proc
mov cx,10
lea si,mas1
lea di,mas2
met2:
mov ax,ds:[si] ; записываем в ax очередное 2-хбайтовое число из mas1
clc ; сбрасываем флаг cf
ror ax,1 ; осуществляем циклический сдвиг вправо через флаг cf
jc next ; если младший бит числа=1 (нечетное), то cf=1 - переходим на next
rol ax,1 ; выполняем обратный сдвиг (восстанавливаем число)
mov ds:[di],ax ; переписываемчисло во 2-й массив
add di,2
inc n ; увеличиваем счетчик чисел 2-го массива
next:
add si,2
loop met2
ret
obrabot endp
;---Подпрограмма отображения 2-го массива---
vivode proc
cmp f,1
jne met7 ; если считывали не из файла - переход на met7
mov ah,3ch ; иначе, создаем файл с именем в name_file2
xor cx,cx
lea dx,name_file2
int 21h
mov bx,ax
met7:
mov ah,9 ; выводим сообщение mes2
lea dx,mes2
int 21h
mov cl,n ; записываем в cl кол-во элементов 2-го массива
lea si,mas2
met3:
mov al,ds:[si+1] ; записываем в al старший байт числа
call inv_preobr ; выполняем обратное преобразование
mov word ptr buf+2,ax ; записываем ASCII код в буфер по адресу buf+2
mov al,ds:[si] ; записываем в al младший байт числа
call inv_preobr ; выполняем обратное преобразование
mov word ptr buf+4,ax ; записываем ASCII код в буфер по адресу buf+4
lea dx,buf
add dx,2 ; записываем в dx адрес=buf+2
cmp f,1
jne met8 ; если данные считывали не из файла, переход на met8
mov ah,40h ; иначе, скидываем 6 байт (с символами перевода строки) в файл
mov word ptr buf,cx ; сохранение регистра cx в неиспользуемой части буфера buf
mov cx,6
int 21h
mov cx,word ptr buf ; восстановление сохраненного состояния регистра cx
met8:
mov ah,9 ; выводим очередное число 2-го массива на экран
int 21h
add si,2
loop met3
cmp f,1
jne mark5 ; если данные считывали не из файла, переход на mark5
mov ah,3eh ; иначе, закрываем файл
int 21h
mark5:
ret
vivod endp
;---Подпрограмма обратного преобразования из бинарного кода в ASCII-код
; входной бинарный код - в регистре al
; выходной ASCII код - в регистре ax
inv_preobr proc
mov ah,al
and ah,0fh
shr al,4
cmp al,9
ja be1
add al,30h
jmp lo1
be1:
add al,37h
lo1:
cmp ah,9
ja be2
add ah,30h
jmp mark2
be2:
add ah,37h
mark2:
ret
inv_preobr endp
code_ ends ; конец сегмента кода
data_ segment para use16 'data' ; сегмент данных, выровненный на границу параграфа
name_file db 'vhod.txt',0
name_file2 db 'vihod.txt',0
mes0 db 'Ввод с клавиатуры "1" Ввод из фаила "2"',0dh,0ah,'$'
mes1 db 'Введите массив двухбайтовых чисел разделенных клавишей ENTER',0dh,0ah,'$'
mes2 db 'Второй массив:',0dh,0ah,'$'
buf db 5,0,4 dup (0),0dh,0ah,'$'
mas1 dw 10 dup (0)
mas2 dw 10 dup (0)
n db 0
f db 0
data_ ends ; конец сегмента данных
end main
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.