Консультация № 178698
27.05.2010, 16:51
43.11 руб.
0 2 1
Здравствуйте уважаемы эксперты! Помогите пожалуйста написать программу:

Задана строка символов. Составить программу, выясняющую, имеется ли в ней все буквы из слова "end". Причем порядок наличия символов в проверяемой строке должен быть обратным их порядку в "end".

В ассемблере я не очень, так что прошу с подробными комментами! Программа Tasm.

Обсуждение

Неизвестный
27.05.2010, 20:48
общий
это ответ
Здравствуйте, Петров Юрий Иванович.
если Я правильно понял задачу, то так
Код:
.model small	; модель пямяти для программы типа EXE
.286 ; разрешить использовать команда 80286
.stack 200h ; сегмент стека

.data ; сегмент данных

mR_Yes db 'Yes',10,13,'$' ; строка вывода если условие выполняется
mR_No db 'No',10,13,'$' ; строка вывода если условие не выполняется

MyStr db 'sdfdgawfekldjklnss' ; заданная строка
SizeS=$-MyStr ; длина строки

mGood db 10,13,'Работа программы окончена! ',10,13,'$' ; строки с сообщениями об успешном завершении программы

.code ; сегмент кода

@start: ; точка входа в программу
mov ax,@data; инициализация семента данных
mov ds,ax
mov es,ax
mov cx,SizeS ; cx=длина строки
mov dx,offset mR_No ; занести в dx адрес строки с предполагаемым результатом
mov di,offset MyStr ; di=адрес заданной строки
mov al,'d' ; al='d'
repne scasb ; поиск символа в строке
je @next1 ; нашли продолжить поиск
jmp @no ; если не нашли переход
@next1:
mov al,'n' ; al='n'
repne scasb ; поиск символа в строке
je @next2 ; нашли продолжить поиск
jmp @no
@next2:
mov al,'e' ; al='e'
repne scasb ; поиск символа в строке
jne @no ; не нашли переход
mov dx,offset mR_Yes ; занести в dx адрес строки с полученным результатом

@no:
; вывод результата
mov ax,0900h ; вывести заголовок для ввода элемента массива
int 21h ; вызов DOS

@end_prog:
mov ax,0900h ; вывести заголовок для ввода элемента массива
mov dx, offset mGood ; адрес выводимой строки
int 21h ; вызов DOS
mov ax,0c07h ; ожидаем нажатие клавиши
int 21h ; вызов DOS
;выход из программы
mov ax,4c00h; функция DOS завершение программы
int 21h ; вызов DOS
end @start
Неизвестный
27.05.2010, 20:49
общий
забыл добавить сброс флага направления
Код:
cld 

Код:
.model small	; модель пямяти для программы типа EXE
.286 ; разрешить использовать команда 80286
.stack 200h ; сегмент стека

.data ; сегмент данных

mR_Yes db 'Yes',10,13,'$' ; строка вывода если условие выполняется
mR_No db 'No',10,13,'$' ; строка вывода если условие не выполняется

MyStr db 'sdfdgawfekldjklnss' ; заданная строка
SizeS=$-MyStr ; длина строки

mGood db 10,13,'Работа программы окончена! ',10,13,'$' ; строки с сообщениями об успешном завершении программы

.code ; сегмент кода

@start: ; точка входа в программу
mov ax,@data; инициализация семента данных
mov ds,ax
mov es,ax
mov cx,SizeS ; cx=длина строки
mov dx,offset mR_No ; занести в dx адрес строки с предполагаемым результатом
mov di,offset MyStr ; di=адрес заданной строки
mov al,'d' ; al='d'
cld ; направление на увеличение адресов
repne scasb ; поиск символа в строке
je @next1 ; нашли продолжить поиск
jmp @no ; если не нашли переход
@next1:
mov al,'n' ; al='n'
repne scasb ; поиск символа в строке
je @next2 ; нашли продолжить поиск
jmp @no
@next2:
mov al,'e' ; al='e'
repne scasb ; поиск символа в строке
jne @no ; не нашли переход
mov dx,offset mR_Yes ; занести в dx адрес строки с полученным результатом

@no:
; вывод результата
mov ax,0900h ; вывести строку
int 21h ; вызов DOS

@end_prog:
mov ax,0900h ; вывести строку
mov dx, offset mGood ; адрес выводимой строки
int 21h ; вызов DOS
mov ax,0c07h ; ожидаем нажатие клавиши
int 21h ; вызов DOS
;выход из программы
mov ax,4c00h; функция DOS завершение программы
int 21h ; вызов DOS
end @start
Форма ответа