M2:
add dl,al ;сложение: (dl)=(dl)+(al)
mov bl,dl
mov dx,offset message_1 ;ввывод пробела
mov ah,09h
int 21h
mov ax,r
dec ax ;общий цыкл уменьшаем на 1
mov r,ax
cmp ax,0
je M_2
jmp M_1
M_2:
mov dx,offset message_2
mov ah,09h
int 21h
mov ax,minim ;в ах заносим минимальное число
mov dx,minim
shr dx,4h ;сдвиг содержимого dx на 4 разряда вправо
and ax,0000000000001111b ;логическое умножение
mov rr,ax
add dl,30h ;сложение (dl)=(dl)+30h
cmp dl,39h ;сравнить (dl) с 39h
jle M4 ;перейти на метку M4 если dl<39h или dl=39h
add dl,7h ;сложение (dl)=(dl)+7h
M4:
mov ah,02h
int 21h
xor dx,dx
xor ax,ax
mov ax,rr
mov dl,al
add dl,30h ;сложение (dl)=(dl)+30h
cmp dl,39h ;сравнить (dl) с 39h
jle M5 ;перейти на метку M5 если dl<39h или dl=39h
add dl,7h ;сложение (dl)=(dl)+7h
M5:
mov ah,02h
int 21h
mov ax,4c00h ;формирование функции стандартного выхода
int 21h ;формирование прерывания типа 21h и стандартный выход
main endp ;конец процедуры main
code ends ;конец сегмента кода
end main ;конец программы с точкой входа main
2)
model small
.stack 100h
.data
N=10 ;макрос
mass dw 10 dup(0)
file_name db 'input.txt',0
file_name2 db 'salary.txt',0
handle dw 0 ;манипулятор файла
handle2 dw 0 ;манипулятор файла
minimum dw 0 ;выделение памяти под переменную
buffer db 4 dup(0) ;буфер
.code
.startup
;открываем файл
xor ax,ax
mov ax,3D00h ;будем открывать файл для чтения
mov dx,offset file_name ;DS:DX указывают на путь к файлу
int 21h
mov handle,ax ;запомним номер файла в переменной Handle
;цикл
mov di,0 ;указывает на текущий элемент mass
mass_cicle: ; обший цикл копирования-преобразования
mov cx,4
mov bx,handle ;будем читать
mov dx,offset buffer ;DS:DX указывает на буфер в памяти для чтения
mov ah,3Fh ;функция 3Fh - чтение файла
int 21h
;преобразавание из ASCII кода в число
mov si,3 ;позиция в источнике
mov bx,1 ;bx будем испльзовать как множитель
transform: ;цикл преобразования
xor ax,ax ;подготовка для mul
mov al,buffer[si]
sub al,30h
cmp al,9h
jle past
sub al,7h
past:
mul bx ;если операнд, указанный в команде - слово,
;то второй сомножитель должен располагаться в ax
;результат помещается в пару dx:ax
;прибавляем к нашему результату
shl di,1 ; не нужно начиная с ~286
add mass[di],ax
shr di,1
shl bx,4 ;следующий разряд x16
dec si
jnl transform ;переходим если si <> -1
inc di
cmp di,N
jnz mass_cicle
;обработка массива
mov si,0 ;инициализация нулем индекса массива si
mov cx,10 ;инициализация числом 10 счетчика циклов cx
mov ax,mass[0] ;запись в регистр ax первого элемента массива mass
mov minimum,ax ;запись в переменную minimum содержимого регистра ax
cycle:
mov ax,mass[si] ;запись в регистр ax si-ого элемента массива mass
cmp ax,minimum ;сравнение
jbe max ;если ax меньше или равно minimum, то переходим на метку min
add si,2 ;в противном случае увеличиваем si на 2 (так как массив типа word)
loop cycle ;если cx не равен нулю, то cx уменьшается на 1 и переходим к cycle
jmp endmass ;в противном случае переходим к метке конца программы endmass
min:
mov minimum,ax ;запись в переменную minimum содержимого регистра ax
add si,2 ;увеличение si на 2
dec cx
jne cycle ;если cx не равен нулю, то переходим к cycle
endmass:
;закрытие файла input.txt
mov ah,3eh
mov bx,handle ;bx содержит номер файла handle
int 21h ;DS:dx адресса для чтения/записи
;запись результата обработки массива в файл
;открываем файл
mov ax,3D02h ;будем открывать файл для чтения/записи
mov dx,offset file_name2 ;DS:DX указывают на путь к файлу
int 21h
mov handle2,ax ;запомним номер файла в переменной Handle2
;преобразование из числа в ASCI код
mov bx,minimum
;преобразование первого символа
mov bx,minimum ;в bх заносим максимальное число
and bx,1111000000000000b ;логическое умножение
shr bx,4h ;сдвиг содержимого dx на 4 разряда вправо
add bh,30h ;сложение (bh)=(bh)+30h
cmp bh,39h ;сравнить (bh) с 39h
jle M4 ;перейти на метку M4 если bh<39h или bh=39h
add bh,7h ;сложение (bh)=(bh)+7h
M4:
mov ah,bh
shl ah,4h
;преобразование второго символа
mov bx,minimum ;в bх заносим максимальное число
and bx,0000111100000000b ;логическое умножение
add bh,30h ;сложение (bh)=(bh)+30h
cmp bh,39h ;сравнить (bh) с 39h
jle M5 ;перейти на метку M4 если bh<39h или bh=39h
add bh,7h ;сложение (bh)=(bh)+7h
M5:
and bx,0000111100000000b ;логическое умножение
add ah,bh
;преобразование третьего символа
mov bx,minimum ;в bх заносим максимальное число
and bx,0000000011110000b ;логическое умножение
shr bl,4h ;сдвиг содержимого dx на 4 разряда вправо
add bl,30h ;сложение (bl)=(bl)+30h
cmp bl,39h ;сравнить (bl) с 39h
jle M6 ;перейти на метку M6 если bl<39h или bl=39h
add bl,7h ;сложение (bl)=(bl)+7h
M6:
mov al,bl
shl al,4h
;преобразование четвертого символа
mov bx,minimum ;в bх заносим максимальное число
and bx,0000000000001111b ;логическое умножение
add bl,30h ;сложение (bl)=(bl)+30h
cmp bl,39h ;сравнить (bl) с 39h
jle M7 ;перейти на метку M7 если bl<39h или bl=39h
add bl,7h ;сложение (bl)=(bl)+7h
;M7:
and bx,0000000000001111b ;логическое умножение
and bx,0000000011110000b ;логическое умножение
add al,bl
mov minimum,ax
xor ax,ax
mov ah,40h ;запись в фаил
mov bx,handle2
mov cx,2
mov dx,offset minimum ;DS:DX адрес записи
int 21h
;закрытие файла salary.txt
mov ah,3eh
mov bx,handle2
int 21h
.exit 0
Задание № 3 (вариант № 14):
Написать программу преобразования однобайтного числа в соответствующий ему код ASCII.
Текст программы:
masm ;режим работы TASM
model small ;тип используемой модели памяти
stack 256 ;выделение памяти для стека
.data ;начало сегмента данных
input db 4 dup(0)
.code ;начало сегмента кода
main: ;начало процедуры main
mov ax,@data ;заносим адрес сегмента данных в регистр AX
mov ds,ax ;AX в DS
xor ax,ax ;очистка регистров
xor bx,bx
xor dx,dx
xor cx,cx
m0:
mov ah,01h
int 21h ;чтение данных с клавиатуры
mov input[bx],al
inc bx
cmp bx,03h
jle m0
call LF0D ;вызов процедуры "перевод строки-возврат каретки"
xor bx,bx ;очистка регистров
mov ah,02h ;определение функции прерывания int21h
man: ;преобразование ASCII-кода в цифры
mov dl,input[bx] ;запись в dl ASCII-кода из массива input
cmp dl,60h
jle man0
sub dl,57h ;если разряд равен a...f, то вычесть из него 57h
jmp man2
man0: ;сравнение разряда с 40h
cmp dl,40h
jle man1
sub dl,37h ;если разряд равен A...F, то вычесть из него 37h
jmp man2
man1: ;если разряд равен 0...9, то вычесть из него 30h
sub dl,30h
man2:
inc bx ;вывод данных на экран
int 21h
inc dh
cmp dh,03h ;сравнение младшего разряда с 09h
jle man
exit:
mov ax,4c00h ;стандартный выход
int 21h ;генерация прерывания с номером 21h
LF0D proc ;процедура "перевод строки-возврат каретки"
mov ah,02h
mov dl,0Ah
int 21h
mov dl,0Dh
int 21h
ret
LF0D endp
end main ;конец программы с точкой входа main
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.