Ввод с клавиатуры или считывание 10 двухбайтных чисел и вывод на экран все четные числа с сохранением в файл

Страницы работы

5 страниц (Word-файл)

Содержание работы

Цель задания: Ввод с клавиатуры или считывание 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

Похожие материалы

Информация о работе