
- •1) Найти сумму цифр трёхзначного числа
- •2) Дано четырёхзначное число. Вывести число, полученное при прочтении его цифр справа налево.
- •3) Дано четырёхзначное число. Определить является ли сумма двух его первых цифр сумме двух вторых.
- •4) Если сумма первых двух его цифр больше суммы его двух последних цифр, вывести сообщение «Больше», иначе «Меньше»
- •5) Найти максимальную цифру в записи четырёхзначного числа.
- •12) Указать символ для поиска. Ввести с клавиатуры строку символов. Вывести количество вхождений указанного символа в строке.
- •13) Ввести строку символов. Вывести ее в обратном порядке.
- •14) Ввести строку символов. Вывести строку, исключая буквы (латиницу).
- •15) Ввести две строки. Вывести совпадающие (по позициям и значениям) символы в двух строках.
- •21) Определить косинус угла
- •22) Определить длину окружности
- •23) Определить длину гипотенузы по двум катетам
- •24) Вычислить значение выражения (X-z)*(2x*z)
- •25) Вывести число пи с точностью до пятого знака
13) Ввести строку символов. Вывести ее в обратном порядке.
Единственная задача, сделанная при помощи цепочечных команд.
.model small
.stack
.data
crlf db 0Dh, 0Ah, '$'
a db 9 dup(0), '$' ;тут будет переписанная задом на перёд новая строка
b db 10,0,10 dup(0) ;тут будет вводимая строка
.code
ASSUME DS:@data, es:@data
start:
mov ax, @data
mov ds, ax
mov es, ax
lea si, b+10 ;в si источник
lea di, a ;в di приёмник
mov ah, 0Ah ;вводим строку
lea dx, b
int 21h
lea dx, crlf ;абзац
mov ah, 9
int 21h
mov cx, 9 ; в cx записываем длину цепочки
let:
std ;установить флаг направления (Direction flag) = 1. Значит обработка цепочки будет идти с конца
lods b ; извлекает элемент из цепочки b, начиная с конца и помещает его в ax
cld ;установить флаг направления (Direction flag) = 0. Обработка цепочки будет идти с начала
stos a ;извлекает элемент из ax, и помещает его в цепочку a.
loop let ;повторять пока не обнулится cx.
lea dx, a ;вывод получившейся цепочки на экран.
mov ah, 9
int 21h
mov ah, 4ch
int 21h
end start
14) Ввести строку символов. Вывести строку, исключая буквы (латиницу).
Задача сводится к тому, чтобы из ряда всех символов имеющихся на клавиатуре, вычленить буквы (прописные и строчные) и оставить всё остальное. Сложность заключается в том, что в памяти компьютера прописные и строчные буквы идут не подряд а через группу символов. Это можно изобразить вооот так: 123A-Z89a-z12. Сначала идут символы, потом прописные буквы, потом снова символы, потом строчные буквы, потом опять символы. Плюс в том, что коды всех символов идут по порядку, и мы можем сравнивать их, чтобы определить в какой зоне (условно красной или жёлтой) находится элемент строки. Используя косвенную адресацию, проверяем по отдельности каждый элемент на подходит/не подходит, и, в зависимости от этого, либо отправляем его на вывод, либо переходим к следующему, пока не встретим символ конца строки.
.model small
.386
.stack 256h
.data
str_1 db 15,0,15 dup ('$')
str_2 db 0Ah,'$'
.code
start:
mov ax, @data
mov ds, ax
lea dx, str_1 ; вводим строку символов
mov ah, 0Ah
int 21h
lea dx, str_2
mov ah, 09h
int 21h
mov di,1 ;задаём счётчик для косвенной адресации
pins:
inc di
cmp di, 15
jz exit
;шныряем по строке в поисках букв
cmp str_1[di], '$' ;когда находим символ конца строки, выходим из цикла.
jz exit
cmp str_1[di], 40h ;@ - символ перед большим A
jbe label_2 ;если меньше или равно, переходим на label_2
cmp str_1[di], 5Ah ; буква Z
jbe pins ; если меньше или равно, переходим на pins, т.е. на начало, т.к. символ
; не подошёл
cmp str_1[di], 61h ; буква a
jae label_1 ; если больше или равно, переходим на label_1
jmp label_2 ; иначе на label_2, т.е. на вывод, т.к. символ подходит
label_1:
cmp str_1[di], 7Ah ; буква z
jbe pins ; если меньше или равно, переходим на pins, т.е. на начало, т.к. символ
; не подошёл
label_2: ; выводим подходящий символ на экран
lea dx, str_1[di]
mov ah, 40h
mov cx, 1
int 21h
jmp pins ; пиздуем проверять следующий
;-------------------------------------------------
exit:
mov ah, 4ch
int 21h
end start