Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1375 | Дата выхода: | 24.10.2010, 08:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 227 / 66 | Вопросов / ответов: | 1 / 1 | Вопрос № 180367: Здравствуй эксперты, возник вопрос по заданию. Основное: х86(специальных функций не нужно), платформа доса, Тасм, размер переменных вот тут с проблемой. для работы с программой необходимо ввести дескриптор на клавиатуру. задание вот как звуч... Вопрос № 180367: Здравствуй эксперты, возник вопрос по заданию. Основное: х86(специальных функций не нужно), платформа доса, Тасм, размер переменных вот тут с проблемой. для работы с программой необходимо ввести дескриптор на клавиатуру. задание вот как звучит: " Необходимо реализовать программу работы со строками. Исходная строка вводится с клавиатуры, результат выводится на экран. Слова в строке могут быть разделены пробелами и знаками препинания.В каждом слове строки заменить 1-ую букву на последнюю, 2-ую на предпоследнюю и т.д. " Идею предложить не могу, все мысли отходят к си++. Отправлен: 19.10.2010, 08:22 Вопрос задал: Мельников (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, Мельников! Вот Вам программа под Tasm, расчитана под формат COM Т.е. компилируем так: Удачи в освоении языка Ассемблера! PS Все операции ввода-вывода сделал через работу с устройствами stdin, stdout
Код: .model tiny .code .startup mov bx, 1 ;выведем соо бщение через стандартное выходное устройство - монитор lea dx, prompt mov cx, len_prt mov ah, 40h int 21h
xor bx, bx ;строку считываем через стандартное входное устройство - клавиатуру lea dx, string mov cx, 256 ;длину взял побольше, чтобы наверняка хватило :) mov ah, 3fh int 21h
lea si, string ;адрес строки mov bx, ax ;длина принятой строки sub bx, 2 ;последние 0dh, 0ah нам не нужны
push bx ;сохраним длину строки для вывода на экран
start_sep: ;старт с позиции разделителя mov dl, 0 ;dl=0: предыдущее состояние - разделитель main_loop: ;цикл считывания очередного символа lodsb ;читаем, si автоматом инкрементируется cmp al, 0dh ;проверим на конец строки je finish ;прошли до конца call separator ;проверим код на разделитель jz sep_cmp_step ;FZ=1 - встретился разделитель cmp dl, 0 ;не разделитель, проверяем предыдущее состояние jne main_loop ;не разделитель - на чтение следующего символа lea bx, [si+1] ;разделитель - начинается новое слово, запоминаем позицию ; на 2 больше начала слова! (для чего - см дальше) mov dl, 1 ;и помечаем состояние слова jmp main_loop ;на ввод следующего символа sep_cmp_step: ;встретили разделитель cmp dl, 0 ;если были в позиции разделителя, je main_loop ; то на ввод следующего символа call rotate ;были в позиии слова - значит оно закончилось ; при этом si указывает на символ за первым разделителем за словом ; т.к. адрес последнего символа слова = [si-2], ; отсюда и начало слова по адресу [bx-2] jmp start_sep ;опять начинаем с позиции разделителя finish: ;дошли до конца call rotate ;последнее слово надо тоже перевернуть
mov bx, 1 ;выводим заголовок строки lea dx, result mov cx, len_res mov ah, 40h int 21h
pop cx ;сохраненная длина введеной строки mov bx, 1 ;выведем преобразованную строку lea dx, string mov ah, 40h int 21h
mov bx, 1 ;сообщение "Press any key" lea dx, press_any mov cx, len_press mov ah, 40h int 21h
mov ah, 8 ;ждем "any key" :) int 21h
.exit 0 ;выход
;проверка на разделители ;результат: FZ=1 - код в al - разделитель separator proc lea di, sep_string ;строка кодов разделителей mov cx, len_sep_string ;длина repne scasb ;ищем ret separator endp
;переворот слова ;[bx-2] - адрес первого символа слова ;[si-2] - адрес последнего rotate proc push si ;сохраним для продолжения анализа rotate_loop: cmp bx, si ;адреса "встретились"? jae rotate_ret ;да, выходим mov al, [bx-2] ;меняем местами xchg al, [si-2] mov [bx-2], al inc bx ;"голову" вперед dec si ;"хвост" назад jmp rotate_loop ;на повтор rotate_ret: pop si ;восстановим адрес конца lea bx, [si] ; необходимо для случая, когда строка заканчивается разделителями ret rotate endp
;данные .data press_any db 0dh,0ah, 39;Press any key for exit' len_press equ $-press_any
;все возможные разделители sep_string db 9,' ,.:;?!-+=\/()[]{}' len_sep_string equ $-sep_string
prompt db 'Enter string: ' len_prt equ $-prompt
result db 'Result: ' len_res equ $-result
;зарезервируем буфер для вводимой строки в неинициализируемом сегменте, ; чтобы не занимать место в результируещем EXE-файле .data? string db 256 dup (?)
end
----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 19.10.2010, 15:34 Номер ответа: 263551 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 263551 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий