Методичка по ассемблеру
Теория
Задача№1
Условие
Калькулятор с меню
Листинг Программы
include macro. lib ;Подключение библиотеки
stec segment ‘stack’ ;Начало сегмента стека
dw 256 dup(?) ;Выделение в памяти 256 двойных байт
stec ends ;Конец сегмента стека
data segment ‘data’ ;Начало сегмента стека
a db? ;Объявление переменной
b db? ;Объявление переменной
a1 db ‘Введите первое число: $’ ;Сообщение
b1 db ‘Введите второе число: $’ ;Сообщение
h1 db ‘продол.-1,выход-2$’;Сообщение
o1 db ‘Ответ: $’ ;Сообщение
z1 db ‘1)Сложение $’ ;Сообщение
z2 db ‘2)Вычитание $’ ;Сообщение
z3 db ‘3)Умножение $’ ;Сообщение
z4 db ‘4)Деление $’ ;Сообщение
z5 db ‘Выбор пункта: $’ ;Сообщение
z6 db ‘Такого пункта нет! $’ ;Сообщение
k db? ;Объявление переменной
data ends ;Конец сегмента данных
code segment ‘code’ ;Начало сегмента код
begin proc far ;Начало программы
Assume ss:stec, ds:data, cs:code ;Задает адрес каждого сегмента
mov ax, data ;Команда начальной инициализации
mov ds, ax ;Команда начальной инициализации
z: ;Метка z
cls ;Очистка экран
move_cursor 0,0 ;Курсор на (0,0)
message a1 ;Вывод сообщения
key_$2bin ;Ввод переменной
mov a, al ;Пересылка в ячейку
crlf ;Переход на след. строку
message b1 ;Вывод сообщения
key_$2bin ;Ввод переменной
mov b, al ;Пересылка в ячейку
crlf ;Переход на след. строку
message z1 ;Вывод сообщения
crlf ;Переход на след. строку
message z2 ;Вывод сообщения
crlf ;Переход на след. строку
message z3 ;Вывод сообщения
crlf ;Переход на след. строку
message z4 ;Вывод сообщения
crlf ;Переход на след. строку
message z5 ;Вывод сообщения
key_$2bin ;Ввод переменной
mov k, al ;Пересылка в ячейку
mov al, k ;Пересылка в ячейку
cmp al,1 ;Сравнение рабочей ячейки
jne m1 ;Если не равно, то на метку m1
mov al, a ;Пересылка в ячейку
add al, b ;Прибавление к рабочей ячейке
jmp con ;Переход на метку
m1: ;Метка m1
mov al, k ;Пересылка в ячейку
cmp al,2 ;Сравнение рабочей ячейки
jne m2 ;Если не равно, то на метку m2
mov al, a ;Пересылка в ячейку
sub al, b ;Вычитание ячейки
jmp con ;Переход на метку
m2: ;Метка m2
mov al, k ;Пересылка в ячейку
cmp al,3 ;Сравнение рабочей ячейки
jne m3 ;Если не равно, то на метку m3
mov al, a ;Пересылка в ячейку
imul b ;Умножение рабочей ячейки
jmp con ;Переход на метку
m3: ;Метка m3
mov al, k ;Пересылка в ячейку
cmp al,4 ;Сравнение рабочей ячейки
jne m4 ;Если не равно, то на метку m4
mov al, a ;Пересылка в ячейку
idiv b ;Деление рабочей ячейки
jmp con ;Переход на метку
m4: ;Метка m4
cls ;Очистка экрана
move_cursor 0,0 ;Курсор на (0,0)
mov al, k ;Пересылка в ячейку
cmp al,4 ;Сравнение рабочей ячейки
jle con ;Переход на метку
message z6 ;Вывод сообщения
crlf ;Переход на след. строку
jmp m5 ;Переход наМеткУ m5
con: ;Конец
cls ;Очистка экрана
move_cursor 0,0 ;Курсор на (0,0)
message o1 ;Вывод сообщения
jmp m5 ;Метка m5
m5: ;Переход на метку
CBW ;Расширить до 2 байт
print_number ;Выводзначения
crlf;Переход на след. строку
messageh1 ;Вывод сообщения
key_$2bin ;Ввод переменной
cmpal,1 ;Сравнение рабочей ячейки
jnecon1 ;Если не равно, то на метку con1
jmpz ;Переход наМетку z
con1: ;Меткаcon1
mov ax,4c00h ;Задание прерывание на выход из DOS
int 21h ;Прерывание
ret ;Возврат
begin endp ;Конец программы
code ends ;Конец сегмента кода
end begin ;Конец
Скриншот Программы
Отчёт №2
Условные безусловные операторы
Теория
Задача №1
ЛистингПрограммы
include macro. lib ;Подключение библиотеки
stec segment ‘stack’ ;Начало сегмента стека
dw 256 dup(?) ;Выделение в памяти 256 двойных байт
stec ends ;Конец сегмента стека
data segment ‘data’ ;Начало сегмента данных
a db? ;Объявление переменной
b db? ;Объявление переменной
cdb? ;Объявление переменной
xdb? ;Объявление переменной
XKONdb? ;Объявление переменной
DLXdb? ;Объявление переменной
ydb? ;Объявление переменной
const2 db -1 ;Объявление переменной
z1 db ‘ x | y$’ ;Сообщение
z2 db ‘ $ |’ ;Сообщение
z3 db ‘ | $’ ;Сообщение
a1 db’vveditea= $’ ;Сообщение
b1 db’vvediteb= $’ ;Сообщение
s1 db’vveditec= $’ ;Сообщение
a2 db’vvedite x= $’ ;Сообщение
d1 db’vvedite DLX= $’ ;Сообщение
d2 db’vvediteXKON= $’ ;Сообщение
data ends ;Конец сегмента данных
code segment ‘code’ ;Начало сегмента код
begin proc far ;Начало программы
Assume ss:stec, ds:data, cs:code ;Задает адрес каждого сегмента
mov ax, data ;Команда начальной инициализации
mov ds, ax ;Команда начальной инициализации
cls ;Очистка экран
move_cursor 0,0 ;Курсор на (0,0)
message a1 ;Вывод сообщения
key_$2bin ;Ввод переменной
mov a, al ;Пересылка в ячейку
crlf ;Переход на след. строку
message b1 ;Вывод сообщения
key_$2bin ;Ввод переменной
mov b, al ;Пересылка в ячейку
crlf ;Переход на след. строку
messages1 ;Вывод сообщения
key_$2bin ;Ввод переменной
movc, al ;Пересылка в ячейку
crlf ;Переход на след. строку
messagea2 ;Вывод сообщения
key_$2bin ;Ввод переменной
movx, al ;Пересылка в ячейку
crlf ;Переход на след. строку
messaged1 ;Вывод сообщения
key_$2bin ;Ввод переменной
movDLX, al ;Пересылка в ячейку
crlf ;Переход на след. строку
messaged2 ;Вывод сообщения
key_$2bin ;Ввод переменной
movXKON, al ;Пересылка в ячейку
crlf ;Переход на след. строку
messagez1 ;Вывод сообщения
crlf ;Переход на след. строку
m: ;Метка m
moval, c ;Пересылка в ячейку
cmpal,0 ;Сравнение рабочей ячейки
jgm1 ;Если больше, то на метку m1
jem3 ;Если равно, то на метку m3
moval, x ;Пересылка в ячейку
cmpal,0 ;Сравнение рабочей ячейки
jem1 ;Если равно, то на метку m1
moval, x ;Пересылка в ячейку
subal, c ;Вычитание ячейки
imula ;Умножение рабочей ячейки
imulconst2 ;Умножение рабочей ячейки
jmpcon ;Переход на метку
m1: ;Метка m1
moval, x ;Пересылка в ячейку
cmpal,0 ;Сравнение рабочей ячейки
jnem3 ;Если не равно, то на метку m3
moval, x ;Пересылка в ячейку
subal, a ;Вычитание ячейки
imulc ;Умножение рабочей ячейки
imulconst2 ;Умножение рабочей ячейки
jmpcon ;Переход на метку
m3: ;Метка m3
moval, c ;Пересылка в ячейку
subal, a ;Вычитание ячейки
imulb ;Умножение рабочей ячейки
imulx ;Умножение рабочей ячейки
con: ;Метка con
movy, al ;Пересылка в ячейку
messagez2 ;Вывод сообщения
moval, x ;Пересылка в ячейку
CBW ;Расширить до 2 байт
print_number ;Выводзначения
messagez3 ;Вывод сообщения
moval, y ;Пересылка в ячейку
CBW ;Расширить до 2 байт
print_number ;Выводзначения
crlf ;Переход на след. строку
moval, x ;Пересылка в ячейку
addal, DLX ;Прибавление к рабочей ячейке
movx, al ;Пересылка в ячейку
cmpal, XKON ;Сравнение рабочей ячейки
JEcon1 ;Если равно, то на метку con1
jmpm ;Переходнаметку
con1: ;Меткаcon1
mov ax,4c00h ;Задание прерывание на выход из DOS
int 21h ;Прерывание
ret ;Возврат
begin endp ;Конец программы
code ends ;Конец сегмента кода
end begin ;Конец
Скриншот Программы №1
Скриншот Программы №2
Скриншот Программы №3
Отчёт №3
Циклы
Теория
Задача №1
Условие
С клавиатуры вводится последовательность из Nцелых чисел. Определить количество одинаковых соседних элементов.
Листинг Программы
includemacro. lib ;Подключение библиотеки
stecsegment ‘stack’ ;Начало сегмента стека
dw 256 dup(?) ;Выделение в памяти 256 двойных байт
stecends ;Конец сегмента стека
datasegment ‘data’ ;Начало сегмента данных
xdb? ;Объявление переменной
x1 db ‘Vvediteelementi $’ ;Сообщение
ndw? ;Объявление переменной
n1 db ‘Vvediten=$’;Сообщение
ydb? ;Объявление переменной
kdb 0 ;Объявление переменной
o1 db ‘Posledovatelras =$’ ;Сообщение
kon1 db? ;Объявление переменной
dataends ;Конец сегмента данных
codesegment ‘code’ ;Начало сегмента код
beginprocfar ;Начало программы
Assumess:stec, ds:data, cs:code ;Задает адрес каждого сегмента
movax, data ;Команда начальной инициализации
movds, ax ;Команда начальной инициализации
cls ;Очистка экран
move_cursor 0,0 ;Курсор на (0,0)
messagen1 ;Вывод сообщения
key_$2BIN ;Ввод переменной
movn, ax ;Пересылка в ячейку
subax,1 ;Вычитание ячейки
movn, ax ;Пересылка в ячейку
crlf ;Переход на след. строку
movcx, n ;Пересылка в ячейку
messagex1 ;Вывод сообщения
key_$2BIN ;Ввод переменной
movy, al ;Пересылка в ячейку
crlf ;Переход на след. строку
m: ;Метка m
messagex1 ;Вывод сообщения
key_$2BIN ;Ввод переменной
movx, al ;Пересылка в ячейку
crlf ;Переход на след. строку
cmpal, y ;Сравнение рабочей ячейки
jlm1 ;Если меньше, то на метку m1
JGm1 ;Если больше, то на метку m1
inck ;Увеличивает на 1
m1: ;Метка m1
moval, x ;Пересылка в ячейку
movy, al ;Пересылка в ячейку
loopm4 ;организация цикла со счетчиком в регистре cx
JMPm5 ;Переход на метку
m4: ;Метка m4
JMP m ;Переход на метку
m5: ;Метка m5
messageo1 ;Вывод сообщения
moval, k ;Пересылка в ячейку
CBW ;Расширить до 2 байт
cmpax, n ;Сравнение рабочей ячейки
print_number ;Вывод значения
crlf ;Переход на след. строку
movax,4c00h ;Задание прерывание на выход из DOS
int 21h ;Прерывание
ret ;Возврат
beginendp ;Конец программы
codeends ;Конец сегмента кода
endbegin ;Конец
Скриншот программы
Задача №2
Условие
С клавиатуры вводится последовательность из Nцелых чисел, 0-конец последовательности. Определить max элементпоследовательности.
Листинг Программы
includemacro. lib ;Подключение библиотеки
stecsegment ‘stack’ ;Начало сегмента стека
dw 256 dup(?) ;Выделение в памяти 256 двойных байт
stecends ;Конец сегмента стека
datasegment ‘data’ ;Начало сегмента данных
xdb? ;Объявление переменной
x1 db ‘Vvediteelementi $’ ;Сообщение
maxdw -32767 ;Объявление переменной
o1 db ‘max=$’ ;Сообщение
dataends ;Конец сегмента данных
codesegment ‘code’ ;Начало сегмента код
beginprocfar ;Начало программы
Assumess:stec, ds:data, cs:code ;Задает адрес каждого сегмента
movax, data ;Команда начальной инициализации
movds, ax ;Команда начальной инициализации
cls ;Очистка экран
move_cursor 0,0 ;Курсор на (0,0)
m: ;Метка m
messagex1 ;Вывод сообщения
key_$2BIN ;Ввод переменной
movx, ax ;Пересылка в ячейку
crlf ;Переход на след. строку
cmpax,0 ;Сравнение рабочей ячейки
JEcon1 ;Если равно, то на метку con1
crlf ;Переход на след. строку
cmpax, max ;Сравнение рабочей ячейки
JLm1 ;Если меньше, то на метку m1
movmax, ax ;Пересылка в ячейку
m1: ;Метка m1
jmpm ;Переход на метку
con1: ;Меткаcon1
messageo1 ;Выводсообщения
movax, max ;Пересылкавячейку
print_number ;Выводзначения
crlf ;Переходнаслед. Строку
movax,4c00h ;Задание прерывание на выход из DOS
int 21h ;Прерывание
ret ;Возврат
beginendp ;Конец программы
codeends ;Конец сегмента кода
endbegin ;Конец
Скриншот программы
Отчёт №4
Одномерные массивы
Теория
Задача №1
В одномерном массиве найти сумму элементов массива с нечетными номерами.
Листинг Программы
Include macro. lib ;Подключение библиотеки
Stec segment ‘stack’ ;Начало сегмента стека
dw 256 dup(?) ;Выделение в памяти 256 двойных байт
stec ends ;Конец сегмента стека
data segment ‘data’ ;Начало сегмента данных
const1 db 2 ;Объявление переменной
k dw 0 ;Объявление переменной
pr db 0 ;Объявление переменной
mas db 10 dup(?) ;Объявление переменной
mas1 db ‘vvedite massiv $’ ;Сообщение
ndw? ;Объявление переменной
n1 db ‘vvediterazmermassiva $’ ;Сообщение
o1 db ‘otvet $’ ;Сообщение
data ends ;Конец сегмента данных
code segment ‘code’ ;Начало сегмента код
begin proc far ;Начало программы
Assume s:stec, ds:data, cs:code ;Задает адрес каждого сегмента
Mov ax, data ;Команда начальной инициализации
Mov ds, ax ;Команда начальной инициализации
cls ;Очистка экран
move_cursor 0,0 ;Курсор на (0,0)
messagen1 ;Вывод сообщения
key_$2BIN ;Ввод переменной
movn, ax ;Пересылка в ячейку
crlf ;Переход на след. строку
movcx, n ;Пересылка в ячейку
leadi, mas ;смещения
messagemas1 ;Вывод сообщения
m: ;Метка m
key_$2bin ;Ввод переменной
mov [di],al ;Пересылка в ячейку
crlf ;Переход на след. строку
inck ;Увеличивает на 1
movax, k ;Пересылка в ячейку
idivconst1 ;Деление рабочей ячейки
cmpah,0 ;Сравнение рабочей ячейки
jem1 ;Если равно, то на метку m1
movbl,[di] ;Пересылка в ячейку
addpr, bl ;Прибавление к рабочей ячейке
m1: ;Метка m1
incdi ;Увеличивает на 1
loopm2 ;организация цикла со счетчиком в
;регистре cx
jmpm3 ;Переход на метку
m2: ;Метка m2
jmp m ;Переход на метку
m3: ;Метка m3
messageo1 ;Вывод сообщения
moval, pr ;Пересылка в ячейку
CBW ;Расширить до 2 байт
print_number ;Вывод значения
crlf ;Переход на след. строку
movax,4c00h ;Задание прерывание на выход из DOS
int 21h ;Прерывание
ret ;Возврат
beginendp ;Конец программы
codeends ;Конец сегмента кода
endbegin ;Конец
Скриншот программы
Задача №2
В одномерном массиве найти сумму элементов массива, расположенных между первым и последним отрицательными элементами.
Листинг Программы
Include macro. lib ;Подключение библиотеки
stec segment ‘stack’ ;Начало сегмента стека
dw 256 dup(?) ;Выделение в памяти 256 двойных байт
stec ends ;Конец сегмента стека
data segment ‘data’ ;Начало сегмента данных
const1 db 2 ;Объявление переменной
kdw 0 ;Объявление переменной
k1 dw 0 ;Объявление переменной
k2 dw 0 ;Объявление переменной
masdb 10 dup(?) ;Объявление переменной
mas1 db ‘vveditemassiv $’ ;Сообщение
ndw? ;Объявление переменной
n1 db ‘vvediterazmermassiva $’ ;Сообщение
o1 db ‘otvet $’ ;Сообщение
sum db 0 ;Объявление переменной
data ends ;Конец сегмента данных
code segment ‘code’ ;Начало сегмента код
begin procfar ;Начало программы
Assumess:stec, ds:data, cs:code ;Задает адрес каждого сегмента
Mov ax, data ;Команда начальной инициализации
mov ds, ax ;Команда начальной инициализации
cls ;Очистка экран
move_cursor 0,0 ;Курсор на (0,0)
message n1 ;Вывод сообщения
key_$2BIN ;Ввод переменной
mov n, ax ;Пересылка в ячейку
crlf ;Переход на след. строку
mov cx, n ;Пересылка в ячейку
lea di, mas ; смещения
message mas1 ;Вывод сообщения
m: ;Метка m
key_$2bin ;Ввод переменной
mov [di],al ;Пересылка в ячейку
crlf ;Переход на след. Строку
inc di ;Увеличивает на 1
loop m2 ;организация цикла со счетчиком в
;регистре cx
Jmp m3 ;Переход на метку
m2: ;Метка m2
jmp m ;Переход на метку
m3: ;Метка m2
lea di, mas ;смещения
mov cx, n ;Пересылка в ячейку
m4: ;Метка m4
mov al,[di] ;Пересылка в ячейку
cmp al,0 ;Сравнение рабочей ячейки
JLkon ;Если меньше, то на метку kon
Inc di ;Увеличивает на 1
loop m4 ;организация цикла со счетчиком в
;регистре cx
kon: ;Метка kon
mov k1,di ;Пересылка в ячейку
lea di, mas ;смещения
mov cx, n ;Пересылка в ячейку
m5: ;Метка m5
mov al,[di] ;Пересылка в ячейку
cmp al,0 ;Сравнение рабочей ячейки
JG m6 ;Если больше, то на метку m6
Mov k2,di ;Пересылка в ячейку
m6: ;Метка m6
inc di ;Увеличивает на 1
loop m5 ;организация цикла со счетчиком в
;регистре cx
Mov di, k1 ;Пересылка в ячейку
mov si, k2 ;Пересылка в ячейку
cmp di, si ;Сравнение рабочей ячейки
je kon1 ;Если равно, то на метку kon1
inc di ;Увеличивает на 1
m7: ;Метка m7
cmp di, si ;Сравнение рабочей ячейки
JE kon1 ;Если равно, то на метку kon1
Mov al,[di] ;Пересылка в ячейку
add sum, al ;Прибавление к рабочей ячейке
inc di ;Увеличивает на 1
loop m7 ;организация цикла со счетчиком в
;регистре cx
kon1: ;Метка kon1
messag eo1 ;Вывод сообщения
moval, sum ;Пересылка в ячейку
CBW ;Расширить до 2 байт
Print_number ;Вывод значения
crlf ;Переход на след. Строку
key_$2BIN ;Ввод переменной
mov ax,4c00h ;Задание прерывание на выход из DOS
int 21h ;Прерывание
ret ;Возврат
begin endp ;Конец программы
code ends ;Конец сегмента кода
end begin ;Конец
Скриншот программы
Отчёт №5
Двухмерные массивы
Теория
Задача №1
Найти максимальный элемент в каждом столбце.
Текстпрограммы
Include macro. lib ;Подключение библиотеки
textsegment ‘code’ ;Начало сегмента код
assume cs:text, ds:data, ss:stek ;Задает адрес каждого сегмента
start: ;Метка start
mov ax, data ;Команда начальной инициализации
mov ds, ax ;Команда начальной инициализации
cls ;Очистка экран
move_cursor 0,1 ;Курсор на (0,1)
message msg0 ;Вывод сообщения
move_cursor 0,2 ;Курсор на (0,2)
message msg1 ;Вывод сообщения
key_$2bin ;ввод количества строк
mov y, ax ;Пересылка в ячейку
crlf ;Переход на след. строку
message msg2 ;Вывод сообщения
key_$2bin ;вводит количество столбцов и запоминает в ячейке х
mov x, ax ;Пересылка в ячейку
mov ax, y ;Пересылка в ячейку
mul x ;количество строк умножается на количество столбцов
mov y, ax ;Пересылка в ячейку
crlf ;Переход на след. строку
xor di, di ;обнуление di
xor bx, bx ;обнуление bx
l2: ;Метка l2
push di ;размещение содержимого операнда источник в стеке
push bx ;размещение содержимого операнда источник в стеке
crlf ;Переход на след. строку
key_$2bin ;ввод очередного элемента матрицы
pop bx ;извлечение слова или двойного слова из стека
pop di ;извлечение слова или двойного слова из стека
mov array [di][bx],al ;Пересылка в ячейку
cm pbx,0 ;Сравнение рабочей ячейки
jne m10 ;Если не равно, то на метку m10
cmp al, max1 ;Сравнение рабочей ячейки
jlm10 ;Если меньше, то на метку m10
mov max1,al ;Пересылка в ячейку
m10: ;Метка m10
cmp bx,1 ;Сравнение рабочей ячейки
jne m11 ;Если не равно, то на метку m11
cmp al, max2 ;Сравнение рабочей ячейки
jlm11 ;Если меньше, то на метку m11
mov max2,al ;Пересылка в ячейку
m11: ;Метка m11
cmp bx,2 ;Сравнение рабочей ячейки
jne m12 ;Если не равно, то на метку m12
m12: ;Метка m12
cmp al, max3 ;Сравнение рабочей ячейки
jl m12 ;Если меньше, то на метку m12
mov max3,al ;Пересылка в ячейку
add k, al ;сложение элементов в строке
inc bx ;Увеличивает на 1
cmp bx, x ;Сравнение рабочей ячейки
je l1 ; если все столбцы закончились то переходим в метку l2
jmp l2 ;Переход на метку
l1: ;Метка l1
crlf ;Переход на след. строку
mov k,0 ;Пересылка в ячейку
add di, bx ; переход в другую строку
xor bx, bx ; обнуляем количество столбцов
cmp di, y ;Сравнение рабочей ячейки
je l3 ;Если равно, то на метку l3
jmp l2 ;Переход на метку
l3: ;Метка l3
crlf ;Переход на след. строку
messagem1 ;Вывод сообщения
mov al, max1 ;Пересылка в ячейку
cbw ;Расширить до 2 байт
print_number ;Вывод значения
crlf ;Переход на след. строку
messagem2 ;Вывод сообщения
mov al, max2 ;Пересылка в ячейку
cbw ;Расширить до 2 байт
print_number ;Вывод значения
crlf ;Переход на след. строку
message m3 ;Вывод сообщения
mov al, max3 ;Пересылка в ячейку
cbw ;Расширить до 2 байт
print_number ;Вывод значения
crlf ;Переход на след. строку
xor di, di ; обнуляем количество столбцов
xor bx, bx ; обнуляем количество столбцов
l5: ;Метка l5
push di ;размещение содержимого операнда источник в стеке
push bx ;размещение содержимого операнда источник в стеке
mov al, array[di][bx] ;Пересылка в ячейку
cbw ;Расширить до 2 байт
print_number ;Вывод значения
message c ;Вывод сообщения
pop bx ;извлечение слова или двойного слова из стека
pop di ;извлечение слова или двойного слова из стека
inc bx ;Увеличивает на 1
cmp bx, x ;Сравнение рабочей ячейки
jel4 ;Если равно, то на метку l4
jmpl5 ;Переход на метку
l4: ;Метка l4
add di, bx ;Прибавление к рабочей ячейке
crlf ;Переход на след. строку
xor bx, bx ; обнуляем количество столбцов
cmp di, y ;Сравнение рабочей ячейки
jel6 ;Если равно, то на метку l6
jmpl5 ;Переход на метку
l6: ;Метка l6
key_$2bin ;Ввод переменной
mov ax,4c00h ;Задание прерывание на выход из DOS
int 21h ;Прерывание
delay 0,2,0
textends ;Конец сегмента
data segment ‘data’ ;Начало сегмента данных
arraydb 10 dup(10 dup (?)) ;Объявление переменной
msg0 db’HaiTi MAKCiMALHbIi ELEMENT B KAGDOM CTOLbCE $’;Сообщение
msg1 db’vvedite 4islo strok v massive (1-10) $’ ;Сообщение
msg2 db’vvedite 4islo stolbc v massive (1-10) $ ‘ ;Сообщение
s db ‘ summa v stroke $’ ;Сообщение
xdw? ;Объявление переменной
cdb ‘ $’ ;Сообщение
ydw? ;Объявление переменной
kdb? ;Объявление переменной
k1 dw 0 ;Объявление переменной
k2 dw 1 ;Объявление переменной
k4 dw 0 ;Объявление переменной
m1 db ‘maxelementv 1-xstolbc $’ ;Сообщение
m2 db ‘max element v 2-x stolbc $’ ;Сообщение
m3 db ‘max element v 3-x stolbc $’ ;Сообщение
max1 db -127 ;Объявление переменной
max2 db -127 ;Объявление переменной
max3 db -127 ;Объявление переменной
dataends ;Конец сегмента данных
stek segment ‘stack’ ;Начало сегмента стека
dw 128 dup(?) ;Выделение в памяти 128 двойных байт stekends ;Конец сегмента
end start ;Конец
Скриншот программы
Отчёт №6
Строки
эти команды нужны для работы со строками
stroca label byte
maxlen db 130
actlendb?
Задача №1
Найти длину самого длинного слова
Листингпрограммы
Include macro. lib ;Подключениебиблиоте
steck segment ‘stack’ ;Начало сегмента стек
db 12 dup (‘stack’) ;Выделение в памяти 256 двойных байт
steck ends ;Конец сегмента стека
data segment ‘data’ ;Начало сегмента данных
strocalabelbyte
maxl endb 130 ;Объявление переменной
actl endb ? ;Объявление переменной
str1 db 130 dup (‘$’) ;Объявление переменной
max db -127 ;Объявление переменной
p db ‘Найти длину самого длинного слова $’ ;Сообщение
p3 db ‘Ответ: $’ ;Сообщение
p2 db ‘Введите строку: $’ ;Сообщение
s1 dw (0) ;Объявление переменной
k1 dw (1) ;Объявление переменной
n dw 0 ;Объявление переменной
k db 0 ;Объявление переменной
data ends ;Конец сегмента данных
code segment ‘code’ ;Начало сегмента код
begin proc far ;Начало программы
assume cs:code, ds:data, ss:steck ;Задает адрес каждого сегмент
mov ax, data ;Команда начальной инициализации
mov ds, ax ;Команда начальной инициализации
cls ;Очистка экра
move_cursor 0,0 ;Курсор на (0,0)
crlf ;Переход на след. строку
message p ;Вывод сообщения
crlf ;Переход на след. строку
crlf ;Переход на след. строку
message p2 ;Вывод сообщения
crlf ;Переход на след. строку
mov ah,0ah ;Пересылкавячейку
lea dx, stroca ;смещения
int 21h ;Прерывание
crlf ;Переход на след. строку
lea di, str1 ;смещения
mov al, actlen ;Пересылкавячейку
cbw ;Расширить до 2 байт
mov cx, ax ;Пересылка в ячейку
mov n, ax ;Пересылка в ячейку
m: ;Метка m
moval,[di] ;Пересылка в ячейку
cmpal,’ ‘ ;Сравнение рабочей ячейки
jem1 ;Если равно, то на метку m1
inc k ;Увеличивает на 1
jmp m2 ;Переход на метку m2
m1: ;Метка m1
mov al, k ;Пересылка в ячейку
cmp al, max ;Сравнение рабочей ячейки
jl m3 ;Если больше, на метку m3
mov max, al ;Пересылка в ячейку
m3: ;Метка m3
mov al,0 ;Пересылка в ячейку
movk, al ;Пересылка в ячейку
m2: ;Метка m2
incdi ;Увеличивает на 1
loop m ;организация цикла со счетчиком в
;регистре cx
message p3 ;Вывод сообщения
crlf ;Переход на след. строку
mov al, max ;Пересылка в ячейку
print_number ;Выводзначения
crlf ;Переход на след. строку
mov ax,4c00h ;Задание прерывание на выход из DOS
int 21h ;Прерывание
ret ;Возврат
begin endp ;Конец программы
code ends ;Конец сегмента кода
end begin ;Конец
Скриншот программы
Задача №2
Выдавать на экран все символы, которые между первой и последней точкой.
Тестпрограммы
INCLUDE MACRO. LIB ;Подключение библиотеки
Steck SEGMENTPARA ‘STECK’ ;Начало сегмента стека
DW 256 DUP (?) ;Выделение в памяти 128 двойных
STECKE NDS ;Конец сегмента
DATASEGMENTPARA ‘DATA’ ;Началосегментакодa
stroca label bytemaxlen db 130 ;Объявление переменнойactlen db? ;Объявление переменной
str1 db 80 dup (‘$’) ;Объявление переменной
k1 dw 0 ;Объявление переменной
k2 dw 0 ;Объявление переменной
odb ‘vvedite stroky=$’ ;Сообщение
o1 db ‘OTBET=$’ ;Сообщение
ndw? ;Объявлениепеременной
DATA ends ;Конецсегментаданных
CODESEGMENTPARA ‘CODE’ ;Началосегментакод
Begin proc far ;Началопрограммы
assume cs:code, ds:data, ss:steck ;Задаетадрескаждогосегмент
mov ax, data ;Команда начальной инициализации
mov ds, ax ;Команда начальной инициализации
cls ;Очисткаэкра
move_cursor 0,0 ;Курсорна (0,0)
message o ;Вывод сообщения
mov ah,0ah ;Пересылка в ячейку
lea dx, stroka ;смещения
int 21h ;Прерывание
crlf ;Переход на след. строку
lea di, str1 ;смещения
mov al, actlen ;Пересылкавячейку
cbw ;Расширить до 2 байт
mov cx, ax ;Пересылка в ячейку
mov n, ax ;Пересылка в ячейку
m: ;Метка m
mov al,[di] ;Пересылка в ячейку
cmp al,’.’ ;Сравнение рабочей ячейки
JNE m1 ;Если неравно, то на метку m1
Mov k1,di ;Пересылка в ячейку
jmp con ;Переход на метку con
m1: ;Метка m
mov al,’ ‘ ;Пересылка в ячейку
mov [di],al ;Пересылка в ячейку
inc di ;Увеличивает на 1
loop m ;организация цикла со счетчиком в
;регистре cx
con: ;Метка con
mov al,’ ‘ ;Пересылка в ячейку
mov [di],al ;Пересылка в ячейку
lea di, str1 ;смещения
mov cx, n ;Пересылка в ячейку
m2: ;Метка m2
mov al,[di] ;Пересылка в ячейку
cmp al,’.’ ;Сравнение рабочей ячейки
JNE m3 ;Если неравно, то на метку m3
Mov k2,di ;Пересылка в ячейку
m3: ;Метка m3
inc di ;Увеличивает на 1
loop m2 ;организация цикла со счетчиком в
;регистре cx
Lea di, str1 ;смещения
add di, n ;Прибавление к рабочей ячейке
mov si, k2 ;Пересылка в ячейку
m4: ;Метка m4
cmp di, si ;Сравнение рабочей ячейки
JE con1 ;Если равно, то на метку con1
moval,’ ‘ ;Пересылка в ячейку
mov [si],al ;Пересылка в ячейку
inc si ;Увеличивает на 1
jmp m4 ;Переход на метку m4
con1: ;Меткаcon1
message o1 ;Выводсообщения
crlf ;Переходнаслед. строку
message str1 ;Выводсообщения
key_$2bin ;ввод количества строк
movax,4c00h ;Задание прерывание на выход из int 21h ;Прерывание
crlf ;Переход на след. строку
begin endp ;Конец программы
code ends ;Конец сегмента кода
end begin ;Конец
Скриншот программы
Отчёт №7
Теория
Файлы
Задача №1
Найти длину самого длинного слова
(из файла 1.txt)
Листингпрограммы
Include macro. lib ;Подключение библиотеки
Stec segment ‘stack’ ;Начало сегмента стека
dw 30 dup(?) ;Выделение в памяти 30 двойных байт
stec ends ;Конец сегмента стека
data segment ;Начало сегмента стека
filename db ‘1.txt’ ;Имяфайла
handle dw ? ;Ячейкадескриптора
file nam2 db ‘2.txt’ ;Имяфайла
handle1 dw? ;Объявление переменной
str1 db 1024 dup (‘$’) ;Сообщение
buflenequ $-str1 ;Буферобмена
strl endw? ;Объявление переменной
cp2 dw 80 ;Объявление переменной
max db -127 ;Объявление переменной
kdb 0 ;Объявление переменной
odb ‘vveditestroky$’ ;Сообщение
o1 db ‘maxdlinaslova=$’ ;Сообщение
ndw? ;Объявление переменной
data ends ;Конец сегмента данных
code segment ;Начало сегмента код assume cs:code, ds:data, ss:stek ;Задает адрес каждого сегмента
begin proc far ;Начало программы
mov ax, data ;Команда начальной инициализации
mov ds, ax ;Команда начальной инициализации
cls ;Очистка экран
move_cursor 0,0 ;Курсор на (0,0)
crlf ;Переход на след. строку
mov ah,3dh ;Пересылка в ячейку
mov al,2 ;Пересылка в ячейку
lea dx, filename;Адресаименифайла
int 21h ;Прерывание
mov handle, ax;Пересылкавячейку
mov ah,3fh ;Пересылка в ячейку
mov bx, handle ;Пересылка в ячейку
mov cx, buflen ;Пересылка в ячейку
lea dx, str1 ;смещения
int 21h ;Прерывание
mov strlen, ax ;Пересылка в ячейку
mov ah,3eh ;Пересылка в ячейку
mov bx, handle ;Пересылка в ячейку
int 21h ;Прерывание
mov cx, strlen ;Пересылка в ячейку
mov bx, cx ;Пересылка в ячейку
mov str1[bx],al ;Пересылка в ячейку
message str1 ;считалистроку
lea di, str1 ;смещения
mov cx, strlen ;Пересылка в ячейку
mov n, cx ;Пересылка в ячейку
m: ;Метка m
mov al,[di] ;Пересылка в ячейку
cmp al,’ ‘ ;Сравнение рабочей ячейки
JNE m1 ;Если неравно, то на метку m1
Mov al, k ;Пересылка в ячейку
cmp al, max ;Сравнение рабочей ячейки
JL m2 ;Если меньше, то на метку m2
moval, k ;Пересылка в ячейку
movmax, al ;Пересылка в ячейку
m2: ;Метка m2
mov al,0 ;Пересылка в ячейку
mov k, al ;Пересылка в ячейку
m1: ;Метка m1
inc k ;Увеличивает на 1
inc di ;Увеличивает на 1
loop m ;организация цикла со счетчиком в
;регистре cx
crlf ;Переход на след. строку
messageo1 ;Вывод сообщения
moval, max ;Пересылка в ячейку
decal ;Уменьшает на 1
CBW ;Расширить до 2 байт
print_number ;Вывод значения
key_$2bin ;Ввод переменной
movax,4c00h ;Задание прерывание на выход из DOS
int 21h ;Прерывание
ret ;Возврат
begin endp ;Конец программы
code ends ;Конец сегмента кода
end begin ;Конец
Скриншот программы