РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты в разделе Номер выпуска: | 1671 | Дата выхода: | 03.12.2017, 15:45 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 49 / 18 | Вопросов / ответов: | 1 / 2 | Консультация # 191922: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В исходную строку вставить после заданного символа все символы предшествующие ему. Оставшуюся часть оставить без изменения. Платформа ДОС. На TASM, модель памяти SMALL. Заранее спасибо)... Консультация # 191922: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В исходную строку вставить после заданного символа все символы предшествующие ему. Оставшуюся часть оставить без изменения. Платформа ДОС. На TASM, модель памяти SMALL. Заранее спасибо) Дата отправки: 28.11.2017, 15:24 Вопрос задал: varinkovaalina (Посетитель) Всего ответов: 2 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, varinkovaalina! Держите код. Будут вопросы - обращайтесь в мини-форум
;В исходную строку вставить после заданного символа все символы предшествующие ему. ;Оставшуюся часть оставить без изменения model small stack 100h .data MaxLen equ 79 Prompt1 db 'stroka: ',13,10,36 Prompt2 db 13,10,'char: ',36 Result db 13,10,'result: $' sNotFound db 13,10,'Symbol not found$' Buffer db MaxLen + 1 LenStr db ? String db MaxLen + 1 dup (?) .code main proc mov AX,@data ;настройка сегментных mov DS,AX ;регистров на mov ES,AX ;сегмент данных mov ah,9 lea dx,Prompt1 ;загружаем адрес строки int 21h inc ah ;ah=0ah lea dx,Buffer ;загружаем адрес строки int 21h dec ah ;ah=9 lea dx,Prompt2 int 21h mov ah,1 int 21h mov dl,al ;введенный символ mov cl,LenStr ;длина введенной строки xor ch,ch mov bx,cx ;сохраним длину строки lea di,String ;кладем в Di адрес строки(index) lea si,[bx+di-1] ;адрес последнего символа в строке FindLoop: ;цикл поиска символа dl в строке mov al, [di] ;очередной символ inc di ;инкремент адреса cmp al,dl ;сравниваем je Found ;если равно, то нашли loop FindLoop ;циклим столько, чему равна длина строки jmp NotFound ;прошли всю строку и не нашли Found: ;символ найден ;скопируем символы строки за найденным, сместив их на количество символов перед найденным ;тем самым освободив место, чтобы скопировать символы перед сразу за найденным dec cx ;количество символов за найденным sub bx, cx ;количество до и сам символ mov byte ptr [bx+si], '$' ;bx+si - адрес за последним символом новой строки. Закроем строку для вывода cmp bx, 1 ;если найден первый символ je PrintResult ; то вставлять нечего! Сразу на вывод результата! jcxz CopyHead ;если найден последний символ, то на копирование передних за найденным CopyTailLoop: ;собственно, копируем символы строки за найденным в конец новой строки ;освобождая тем самым место для передних символов mov al,[si] ;идем с хвоста старой строки dec si ;смещаемся к началу mov [bx+si],al ;bx+si адрес хвоста новой строки loop CopyTailLoop ;по всем символам за найденным CopyHead: ;копируем символы перед найденным сразу за ним в освободившееся место mov cx, bx ;количество до найденного плюс сам символ dec cx ;исключим сам символ в количестве копируемых ;продолжаем копировать с хвоста CopyHeadLoop: dec si ;начинаем с уменьшения адреса, чтобы обойти сам символ mov al,[si] ;читаем очередной mov [bx+si],al ;и копируем на новое место loop CopyHeadLoop ;по всем символам спереди найденного PrintResult: ;вывод результата lea dx,Result mov ah,9 int 21h lea dx,String ;новая строка print: ;вывод, в том числе и сообщения о том, что символ не найден mov ah,9 int 21h xor ax,ax ;ждем нажатия на клавишу int 16h mov ax, 4c00h int 21h NotFound: lea dx, sNotFound jmp print endp main end main  | Консультировал: Лысков Игорь Витальевич (Старший модератор) Дата отправки: 28.11.2017, 19:00 5 Спасибо, Вам, огромное! Все работает! ----- Дата оценки: 28.11.2017, 19:16 | Рейтинг ответа: +1 | Консультирует Зенченко Константин Николаевич (Модератор): Здравствуйте, varinkovaalina!
Строковые команды. Добавлен ещё один случай, пользователь ввел пустую строку.
model small szStr equ 250 data dbInpStr db 10,13,'Enter string:$' dbInpSim db 10,13,'Enter simbol:$' dbRes db 10,13,'Result:$' dbErr db 10,13,'String not found$' dbNot db 10,13,'Simbol not found$' dbMax db szStr dblen db ? dbStr db 2*szStr dup(?) stack 256 code ;настариваем сегментные регистры begin: mov ax,@data mov ds,ax mov es,ax ;просим ввести строку mov ah,9 lea dx,dbInpStr int 21h ;вводим mov ah,10 lea dx,dbMax int 21h ;просим ввести символ mov ah,9 lea dx,dbInpSim int 21h ;вводим mov ah,1 int 21h ;читаем длину введенной строки xor ch,ch mov cl,dbLen lea si,dbStr mov bx,cx ;для функции вывода строки mov byte ptr [bx+si],'$' ;пустая стока lea dx,dbErr jcxz outStr ;начнем работу со строковыми командами mov di,si cld repne scasb ;нет символа в строке lea dx,dbNot or cx,cx jz outStr ;начинаем копирование mov dx,si push di push cx add si,bx;в конец строки mov di,si add di,bx;освобождаем свободное место dec di;адресация с нуля - коррекция sub di,cx inc cx;кооректируем адресацию с нуля ;копируем строку std rep movsb; ;востанавливаем параметры поиска pop cx pop si dec si;корректируем от куда копируем sub bx,cx;считаем количество копируемых символов mov cx,bx ;копируем начальнуе символы rep movsb ;выводим результат outStr: push dx mov ah,9 lea dx,dbRes int 21h mov ah,9 pop dx int 21h xor ax,ax int 16h mov ax,4C00h int 21h end begin Удачи!  | Консультировал: Зенченко Константин Николаевич (Модератор) Дата отправки: 28.11.2017, 19:45 5 нет комментария ----- Дата оценки: 29.11.2017, 19:50 | Рейтинг ответа: +1 |
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий