Скачиваний:
64
Добавлен:
15.06.2014
Размер:
123.39 Кб
Скачать

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

Соседние файлы в папке asma