В приведённых ниже вариантах заданий способ передачи па-раметров в процедуру выбирать произвольно. Зациклить про-грамму по вводу строки, а признаком окончания работы считать ввод пустой строки.
- Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке, и если да, то начиная с какой позиции. Разработать программу, которая вводит с клавиатуры две строки и сообщает содержится ли одна в другой и сколько раз.
- Разработать две подпрограммы, одна из которых преобразует любую заданную букву в заглавную (в том числе для русских букв), а другая преобразует букву в строчную. Разработать программу, которая вводит с клавиатуры строку и замещает первые буквы всех слов заглавными, а остальные строчными буквами.
- Разработать две подпрограммы, одна из которых соединяет две строки в одну, а другая обрезает строки до заданной длины (или допол-няет пробелами, если длина строки меньше заданной). Разработать программу, которая вводит с клавиатуры число N, затем вводит несколь-ко строк (конец ввода пустая строка) и формирует новую строку, состо-ящую из первых N символов каждой введённой строки.
- Разработать две подпрограммы, одна из которых сравнивает две строки по лексикографическому порядку, а другая обменивает значения двух строк. Разработать программу, которая вводит с клавиатуры не-сколько строк (конец ввода пустая строка) и сортирует их в лексикогра-фическом порядке.
- Разработать подпрограмму, которая разбивает заданную строку на две части: первое слов (до первого пробела) и остальная часть строки (пробелы в начале строки убираются). Разработать программу, которая вводит с клавиатуры строку и выводит каждое слово с новой строки.
- Разработать подпрограмму, которая переставляет символы задан-ной строки в обратном порядке. Разработать программу, которая вводит с клавиатуры строку и переставляет в обратном порядке символы в каж-дом слове.
- Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке и, если да, то, начиная с какой позиции. Разработать программу, которая вводит с клавиатуры две строки и сообщает содержится ли одна в другой и сколько раз.
- Разработать подпрограмму, которая подсчитывает, сколько раз за-данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и число N и выдаёт список символов, кото-рые встречаются в строке не менее N раз.
- Разработать подпрограмму, которая преобразует заданное деся-тичное число в двоичную систему. Разработать программу, которая вво-дит с клавиатуры строку десятичных цифр и выводит на экран её экви-валент в двоичной системе. Если строка не является числом, то сооб-щает об этом.
- Разработать подпрограмму, которая преобразует заданное шест-надцатеричное число в десятичную систему. Разработать программу, которая вводит с клавиатуры строку шестнадцатеричных цифр и выво-дит на экран её эквивалент в десятичной системе. Если строка не явля-ется числом, то сообщает об этом.
- Разработать подпрограмму, которая определяет, сколько раз за-данная подстрока встречается в строке. Разработать программу, кото-рая вводит с клавиатуры две строки и определяет сколько раз вторая строка встречается в первой.
- Разработать подпрограмму, которая разбивает заданную строку на слова (слово считается от пробела до пробела, но в состав слова не входят). Разработать программу, которая вводит с клавиатуры строку и выводит каждое слово с новой строки.
- Разработать две подпрограммы, одна из которых преобразует лю-бую заданную букву в заглавную (в том числе для русских букв), а другая преобразует букву в строчную. Разработать программу, которая вводит с клавиатуры строку и заменяет первые буквы после точки на заглавные, а остальные на прописные.
- Разработать подпрограмму, которая определяет, содержится ли одна строка в другой и если да то с какой позиции. Разработать про-грамму, которая вводит с клавиатуры две строки и определяет содер-жится ли вторая строка в первой и с какой позиции.
- Разработать подпрограмму, которая каждой букве ставит в соот-ветствие число равное её порядковому номеру в алфавите. Разработать программу, которая вводит с клавиатуры строку и выводит через пробел числа, кодирующие введённую строку символов.
- Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке, и если да, то начиная с какой позиции. Разработать программу, которая вводит с клавиатуры две строки и сообщает содержится ли одна в другой и сколько раз.
- Разработать две подпрограммы, одна из которых преобразует лю-бую заданную букву в заглавную (в том числе для русских букв), а другая преобразует букву в строчную. Разработать программу, которая вводит с клавиатуры строку и замещает первые буквы всех слов заглавными, а остальные строчными буквами.
- Разработать две подпрограммы, одна из которых соединяет две строки в одну, а другая обрезает строки до заданной длины (или допол-няет пробелами, если длина строки меньше заданной). Разработать программу, которая вводит с клавиатуры число N, затем вводит несколь-ко строк (конец ввода пустая строка) и формирует новую строку, состо-ящую из первых N символов каждой введённой строки.
- Разработать две подпрограммы, одна из которых сравнивает две строки по лексикографическому порядку, а другая обменивает значения двух строк. Разработать программу, которая вводит с клавиатуры не-сколько строк (конец ввода пустая строка) и сортирует их в лексикогра-фическом порядке.
- Разработать подпрограмму, которая разбивает заданную строку на две части: первое слов (до первого пробела) и остальная часть строки (пробелы в начале строки убираются). Разработать программу, которая вводит с клавиатуры строку и выводит каждое слово с новой строки.
- Разработать подпрограмму, которая переставляет символы задан-ной строки в обратном порядке. Разработать программу, которая вводит с клавиатуры строку и переставляет в обратном порядке символы в каж-дом слове.
- Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке и, если да, то, начиная с какой позиции. Разработать программу, которая вводит с клавиатуры две строки и сообщает содержится ли одна в другой и сколько раз.
- Разработать подпрограмму, которая подсчитывает, сколько раз за-данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и число N и выдаёт список символов, кото-рые встречаются в строке не менее N раз.
- Разработать подпрограмму, которая преобразует заданное деся-тичное число в двоичную систему. Разработать программу, которая вво-дит с клавиатуры строку десятичных цифр и выводит на экран её экви-валент в двоичной системе. Если строка не является числом, то сооб-щает об этом.
- Разработать подпрограмму, которая преобразует заданное шест-надцатеричное число в десятичную систему. Разработать программу, которая вводит с клавиатуры строку шестнадцатеричных цифр и выво-дит на экран её эквивалент в десятичной системе. Если строка не явля-ется числом, то сообщает об этом.
.model small
.data
input_str db 80, ?, 80 dup('$')
enter_msg db 0dh,0ah, "Enter string:", 0dh,0ah, "$"
output_msg db 0dh,0ah, "Output string:", 0dh,0ah, "$"
next_msg db 0dh,0ah, "----Next----", 0dh,0ah, "$"
stop_msg db 0dh,0ah, "----Stop----", 0dh,0ah, "$"
.code
start:
mov ax, @data
mov ds, ax
main_loop:
; выводим сообщение для ввода строки
mov ah, 09h
lea dx, enter_msg
int 21h
; считываем строку из консоли
mov ah, 0Ah
lea dx, input_str
int 21h
; проверяем, не была ли введена пустая строка
cmp byte ptr [input_str+1], 0
je exit_program ; если пустая - выходим
; вызываем подпрограмму
call echo_proc
; Выводим сообщение разделитель итерация работы прграммы
mov ah, 09h
lea dx, next_msg
int 21h
jmp main_loop ; идём на следующий проход
echo_proc proc
; Не забудьте о необходимости использовать pusha и popa где это нужно!
;;;; -- тут ваша логика --
; выводим сообщение
mov ah, 09h
lea dx, output_msg
int 21h
; В качестве примера - "Эхо"
; выводим строку
mov ah, 09h
lea dx, input_str+2
int 21h
;;; -- конец логики --
ret
echo_proc endp
exit_program:
; выводим сообщение о том, что программа завершается
mov ah, 09h
lea dx, stop_msg
int 21h
mov ah, 4Ch ; выходим из программы
int 21h ; и передаём управление потоком обратно MS DOS
end start
Часть 1. Разработать подпрограмму, которая разбивает заданную строку на две части: первое слов (до первого пробела) и остальная часть строки (пробелы в начале строки убираются)
Код
.model small
.data
input_str db 80, ?, 80 dup('$') ; тут заполняем всю строку знаком конца строки заранее
first_word db 80, ?, 80 dup('$')
other_str db 80, ?, 80 dup('$')
enter_msg db 0dh,0ah, "Enter string:", 0dh,0ah, "$"
output_msg db 0dh,0ah, "Output string:", 0dh,0ah, "$"
fword_msg db 0dh,0ah, "First word:", 0dh,0ah, "$"
other_msg db 0dh,0ah, "Other string:", 0dh,0ah, "$"
next_msg db 0dh,0ah, "----Next----", 0dh,0ah, "$"
stop_msg db 0dh,0ah, "----Stop----", 0dh,0ah, "$"
blnk_msg db 0dh,0ah, "----Only spaces.not work to do----", 0dh,0ah, "$"
space db ' ' ; знак пробела
s_end db '$' ; знак конца строки
.code
start:
mov ax, @data
mov ds, ax
main_loop:
; выводим сообщение для ввода строки
mov ah, 09h
lea dx, enter_msg
int 21h
; считываем строку из консоли
mov ah, 0Ah
lea dx, input_str
int 21h
; проверяем, не была ли введена пустая строка
cmp byte ptr [input_str+1], 0
je exit_program ; если пустая - выходим
; проверям, есть ли в строке что-то, кроме пробелов
call check_is_blank
cmp ax, 0h
jne only_blank
; вызываем подпрограмму логики
call logic
next:
; Выводим сообщение-разделитель итераций работы прграммы
mov ah, 09h
lea dx, next_msg
int 21h
jmp main_loop ; идём на следующий проход
only_blank:
; выводим сообщение о том, что в строке только пробелы
mov ah, 09h
lea dx, blnk_msg
int 21h
jmp next ; идём на след проход main_loop
; подпрограмма проверки на то, есть ли в строке что-то кроме пробелов
; ставит в регистр ax 1-только пробелы, 0-есть и другие символы
check_is_blank proc
; подготавливаем регистр для индексации исходной строки
xor di, di
mov di, 2h
; ax будем использовать как промежуточный буфер
xor ax, ax
; устанавливаем кол-во итераций цикла
xor cx, cx
mov cl, [input_str+1]
check_lbody:
; проверяем пробел ли это
mov al, [input_str+di]
cmp al, space
jne it_not_space ; если не пробел
check_loop:
; инкреминтируем для след итерации
inc di
loop check_lbody
; если мы тут, то по всей строке уже прошлись, а встретились лишь пробелы
xor ax, ax
mov ax, 1h
ret
it_not_space:
; если не пробел - ставим ax в 0 и выходим
xor ax, ax
mov ax, 0h
ret
check_is_blank endp
logic proc
; регистром di будем индексировать input_str
xor di, di
mov di, 2h
; регистром si будем индексировать first_word
xor si, si
; ax в качестве промежуточного буфера
xor ax, ax
; 1. Отсеиваем первые пробелы
lo_body:
mov al, [input_str+di]
cmp al, space
jne start_calc_fword ; если символ не пробел
; на след итерацию если символ оказался пробелом
inc di
jmp lo_body
; 2. Обработка первого слова
start_calc_fword:
call fword_copy
; выводим сообщение о том, что это первое слово
mov ah, 09h
lea dx, fword_msg
int 21h
; выводим первое слово
mov ah, 09h
lea dx, first_word
int 21h
; 3. Обработка остальной части строки
start_calc_other:
; +1, так как в input_str+di сейчас пробел
inc di
call other_copy
; выводим сообщение о том, что это other_str
mov ah, 09h
lea dx, other_msg
int 21h
; выводим other_str
mov ah, 09h
lea dx, other_str
int 21h
ret ; завершение подпрограммы. возврат в вызывающую программу (main_loop)
logic endp
fword_copy proc
; регистром si будем индексировать first_word
xor si, si
; ax в качестве промежуточного буфера
xor ax, ax
; копирование первого слова
f_copy_loop:
; если символ пробел - копирование первого слова завершено
mov al, [input_str+di]
cmp al, space
je f_end_copy
; иначе - это всё ещё первое слово, копируем его
mov al, [input_str+di]
mov byte ptr [first_word+si], al
; след итерация копирования
inc di
inc si
jmp f_copy_loop
; когда завершили копирование первого слова
f_end_copy:
ret ; завершение подпрограммы. возврат в вызывающую программу (logic)
fword_copy endp
other_copy proc
; регистром si будем индексировать other_str
xor si, si
; ax в качестве промежуточного буфера
xor ax, ax
; утсанавливаем кол-во итераций цикла, чтобы программа не ушла дальше конца строки
xor cx, cx
mov cl, [input_str+1]
sub cx, di
add cx, 2h
; копирование
o_copy_loop:
; копируем
mov al, [input_str+di]
mov byte ptr [other_str+si], al
lo_beg:
; след итерация копирования
inc di
inc si
loop o_copy_loop
; когда завершили копирование
o_end_copy:
; добавляем в конец знак конца строки, так как в исходной его может и не быть
mov al, s_end
mov byte ptr [other_str+si], al
ret ; завершение подпрограммы. возврат в вызывающую программу (logic)
other_copy endp
exit_program:
; выводим сообщение о том, что программа завершается
mov ah, 09h
lea dx, stop_msg
int 21h
mov ah, 4Ch ; выходим из программы
int 21h ; и передаём управление потоком обратно MS DOS
end start
Часть 2. Разработать программу, которая вводит с клавиатуры строку и выводит каждое слово с новой строки.
Код
.model small
.data
input_str db 80, ?, 80 dup('$') ; тут заполняем всю строку знаком конца строки заранее
word_str db 80, ?, 80 dup('$')
enter_msg db 0dh,0ah, "Enter string:", 0dh,0ah, "$"
output_msg db 0dh,0ah,0dh,0ah, "Words:", 0dh,0ah, "$"
ln_msg db 0dh,0ah, "$"
next_msg db 0dh,0ah, "----Next----", 0dh,0ah, "$"
stop_msg db 0dh,0ah, "----Stop----", 0dh,0ah, "$"
notw_msg db 0dh,0ah, "----not work to do----", 0dh,0ah, "$"
space db ' ' ; знак пробела
s_end db '$' ; знак конца строки
.code
start:
mov ax, @data
mov ds, ax
main_loop:
; выводим сообщение для ввода строки
mov ah, 09h
lea dx, enter_msg
int 21h
; считываем строку из консоли
mov ah, 0Ah
lea dx, input_str
int 21h
; проверяем, не была ли введена пустая строка
cmp byte ptr [input_str+1], 0
je exit_program ; если пустая - выходим
; проверям, есть ли в строке что-то, кроме пробелов
call check_is_blank
cmp ax, 0h
jne only_blank
; вызываем подпрограмму логики
call logic
next:
; Выводим сообщение-разделитель итераций работы прграммы
mov ah, 09h
lea dx, next_msg
int 21h
jmp main_loop ; идём на следующий проход
only_blank:
; выводим сообщение о том, что в строке только пробелы
mov ah, 09h
lea dx, notw_msg
int 21h
jmp next ; идём на след проход main_loop
; подпрограмма проверки на то, есть ли в строке что-то кроме пробелов
; ставит в регистр ax 1-только пробелы, 0-есть и другие символы
check_is_blank proc
; подготавливаем регистр для индексации исходной строки
xor di, di
mov di, 2h
; ax будем использовать как промежуточный буфер
xor ax, ax
; устанавливаем кол-во итераций цикла
xor cx, cx
mov cl, [input_str+1]
check_lbody:
; проверяем пробел ли это
mov al, [input_str+di]
cmp al, space
jne it_not_space ; если не пробел
check_loop:
; инкреминтируем для след итерации
inc di
loop check_lbody
; если мы тут, то по всей строке уже прошлись, а встретились лишь пробелы
xor ax, ax
mov ax, 1h
ret
it_not_space:
; если не пробел - ставим ax в 0 и выходим
xor ax, ax
mov ax, 0h
ret
check_is_blank endp
logic proc
; регистром di будем индексировать input_str
xor di, di
mov di, 2h
; ax в качестве промежуточного буфера
xor ax, ax
; 0. Выводим сообщение о том, что дальше идёт результат
mov ah, 09h
lea dx, output_msg
int 21h
; 1. Отсеиваем первые пробелы
lo_body:
mov al, [input_str+di]
cmp al, space
jne calc ; если символ не пробел
; на след итерацию если символ оказался пробелом
inc di
jmp lo_body
; 2. Обработка слов
calc:
call word_copy
; выводим знак переноса строки
mov ah, 09h
lea dx, ln_msg
int 21h
; выводим слово
mov ah, 09h
lea dx, word_str
int 21h
; будем использовать регистр bx для уточнения, закончили ли мы проходиться по всей строке
xor bx, bx
mov bx, di
sub bx, 2
cmp [input_str+1], bl
ja lo_body ; если нет -> идём на след итерацию
ret ; завершение подпрограммы. возврат в вызывающую программу (main_loop)
logic endp
word_copy proc
; регистром si будем индексировать word_str
xor si, si
; ax в качестве промежуточного буфера
xor ax, ax
; копирование слова
copy_loop:
; если символ пробел - копирование слова завершено
mov al, [input_str+di]
cmp al, space
je end_copy
; проверка на то, дошли ли мы до конца исходной строки
xor bx, bx
mov bx, di
sub bx, 2
cmp [input_str+1], bl
jbe end_copy
; иначе - это всё ещё слово, копируем его
mov al, [input_str+di]
mov byte ptr [word_str+si], al
; след итерация копирования
inc di
inc si
jmp copy_loop
; когда завершили копирование слова
end_copy:
mov al, s_end
mov byte ptr [word_str+si], al
ret ; завершение подпрограммы. возврат в вызывающую программу (logic)
word_copy endp
exit_program:
; выводим сообщение о том, что программа завершается
mov ah, 09h
lea dx, stop_msg
int 21h
mov ah, 4Ch ; выходим из программы
int 21h ; и передаём управление потоком обратно MS DOS
end start
Часть 1. Разработать две подпрограммы, одна из которых преобразует любую заданную букву в заглавную (в том числе для русских букв), а другая преобразует букву в строчную.
Код
.model small
.data
letter db 2, ?, dup('$')
option db 2, ?, dup('$')
buffer db 80, ?, dup('$')
menu_top db 0B0h, 0B0h, 0B1h, 0B1h, 0B1h, 0B2h, 0B2h, 0B2h, " Supa Menu ", 0B2h, 0B2h, 0B2h, 0B1h, 0B1h, 0B1h, 0B0h, 0B0h, "$"
menu_option_hint db 0Ah, 0Ah, 0Dh, " Type 1 or 2 for select: $",
menu_option_one db 0Ah, 0Dh, " [1] - for make low case letter $",
menu_option_two db 0Ah, 0Dh, " [2] - for make HIGH case letter $",
menu_select_option db 0Ah, 0Ah, 0Dh, 5Bh, 0Ch, 7Ch, 0Bh, 5Dh, ' Select: $'
menu_input_letter db 0Ah, 0Dh, 5Bh, 0Ch, 7Ch, 0Bh, 5Dh, ' Input letter: $'
menu_output db 0Ah, 0Dh, 5Bh, 03h, 5Dh, ' Output: $'
menu_interept db 0Ah, 0Dh, ' Please press any key to continue: $'
.code
mov ax, @data
mov ds, ax
jmp menu
menu:
xor ax, ax ; clear
MOV AH, 0
MOV AL, 3
INT 10H
xor ax, ax ; clear
; output
lea dx, menu_top
mov ah, 09h ; view data into screan
int 21h ; inerapt
lea dx, menu_option_hint
mov ah, 09h
int 21h
lea dx, menu_option_one
mov ah, 09h
int 21h
lea dx, menu_option_two
mov ah, 09h
int 21h
lea dx, menu_select_option
mov ah, 09h
int 21h
; ask stdin
lea dx, option
mov ah, 0Ah
int 21h
mov [option + 3], 24h
lea dx, menu_input_letter
mov ah, 09h
int 21h
; ask stdin
lea dx, letter
mov ah, 0Ah
int 21h
mov [letter + 3], 24h
cmp [option + 2], 31h
je sub1
cmp [option + 2], 32h
je sub2
cmp [option + 2], 24h
je jmp exit
cont:
lea dx, menu_interept
mov ah, 09h
int 21h
; ask stdin
lea dx, buffer
mov ah, 0Ah
int 21h
jmp menu
sub2:
sub [letter + 2], 32
; finally
lea dx, menu_output
mov ah, 09h
int 21h
lea dx, letter + 2
mov ah, 09h
int 21h
jmp cont
sub1:
add [letter + 2], 32
; finally
lea dx, menu_output
mov ah, 09h
int 21h
lea dx, letter + 2
mov ah, 09h
int 21h
jmp cont
exit:
mov ah, 4Ch
int 21h
end
Часть 2. Разработать программу, которая вводит с клавиатуры строку и замещает первые буквы всех слов заглавными, а остальные строчными буквами.
Код
.model small
.data
str1 db 80, ?, 80 dup ("$")
msg1 db 5Bh, 0Ch, 7Ch, 0Bh, 5Dh, ' Input string: $'
msg2 db 0Dh, 0Ah, 5Bh, 03h, 5Dh, ' Output: $'
is_start_word db 1h
.code
mov ax, @data
mov ds, ax
; ask input (stdout)
lea dx, msg1
mov ah, 09h ; view data into screan
int 21h ; inerapt
; ask stdin
lea dx, str1
mov ah, 0Ah
int 21h
xor ax, ax ; clear
lea di, str1 + 2 ; pointer
xor cx, cx ; counter
; load string length into CX
mov cl, [str1 + 1] ; str + 1 -> len of str in 2 byte
mov ch, 0
beg:
; if [di] == space then lo
cmp [di], 20h
je lo
; if is_start_word == 0 then lo
cmp is_start_word, 0
je cool_block
cmp [di], 91
jb cool_block
cmp [di], 123
jge cool_block
cmp [di], 97
jbe cool_block
sub [di], 32
jmp cool_block
cool_block:
; is_start_word = 0
mov is_start_word, 0
; if [di + 1] != space then lo
cmp [di + 1], 20h
jne lo
; is_start_word = 1
mov is_start_word, 1
lo:
; loop
inc di
loop beg
next:
; finally
lea dx, msg2
mov ah, 09h
int 21h
; finally
lea dx, str1 + 2
mov ah, 09h
int 21h
exit:
mov ah, 4Ch
int 21h
end