Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1438 | Дата выхода: | 11.04.2011, 17:00 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 213 / 67 | Вопросов / ответов: | 1 / 1 | Вопрос № 182750: Здравствуйте! Прошу помощи в следующем вопросе: Есть код ассемблера, нужно устроить ввод через процедуру в паскале: ... Вопрос № 182750: Здравствуйте! Прошу помощи в следующем вопросе: Есть код ассемблера, нужно устроить ввод через процедуру в паскале: Отправлен: 05.04.2011, 21:04 Вопрос задал: JohnyWayne (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, JohnyWayne! Программа на Паскале. Сначала вводим строку. Для ввода нулевых байт используем тот факт, что функциональные клавиши сначала дают код 0, для отображения 0 выводим <0> Затем вызываем функцию, написанную на ассемблере, которая ищет индекс первого ненулевого элемента Проверено в TP 7.1 Чтобы в среде TP правильно отображались комментарии, требуется переконвертирровать текст программы в ASCII
Код: program a1; {$L NotZero} uses crt; var str1:string; {строка} var ch:char; {символ} var i:integer; {индекс ненулевого элемента} function NotZero(str:string):integer;external; begin clrscr; {Вводим строк у. Для задания нулевых элементов используем любую из F1-F12} write('Enter string (F1 for 0, Enter for finish): '); repeat ch:=ReadKey; {читаем поток ввода} if ord(ch)=0 then {функциональные клавиши сначала дают нулевой байт} begin ReadKey; {гасим второй байт клавиши} write('<0>'); {выведем для наглядности} end else write(ch); {выведем ненулевой символ} str1:=str1+ch; {добавляем в строку} until ord(ch)=13; {выход по Enter}
i:=NotZero(str1); {получаем позицию первого ненулевого символа} writeln; if i<>Length(str1) then {проверим, а есть ли вообще ненулевые символы} writeln('First not zero symbol: str1[',i,'] = ',str1[i]) else writeln('Not zero symbol not found'); readkey; end. Внешний модуль NotZero, написанный на ассемблере
Код: .model large, pascal .code public NotZero ;функция, ищущая в паскалевской строке первый ненулевой символ ;индекс которого возвращается в AX ;если все символы равны 0, то вернется длина строки ;параметр - длинный указатель на строку NotZero proc array:dword push es ;сохраним сегментный регистр ES les di, array ;ES:DI - адрес строки xor cx, cx mov cl, es:[di] ;CX - длина строки inc di ;DI - адрес самой строки mov dx, di ;сохраним для дальнейших вычислений xor ax, ax ;будем искать AL=0 repe scasb ;ищем в ES:DI mov ax, di sub ax, dx ;AX - индекс (с 1) первого ненулевго символа pop es ret NotZero endp end
Примерный вывод на экран:Код: Enter string (F1 for 0, Enter for finish): <0><0><0>qwerty First not zero symbol: str1[4] = q
----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 08.04.2011, 10:53 Номер ответа: 266597 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Комментарий к оценке: спасибо вам большое) Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 266597 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий