Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1463 | Дата выхода: | 18.06.2011, 23:00 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 210 / 64 | Вопросов / ответов: | 1 / 1 | Вопрос № 183608: Здравствуйте! У меня возникли сложности с таким вопросом: Уважаемый Игорь Витальевич и другие эксперты! Повторяю свой вопрос за №183348 от 25,05,2011 года- требуется написать 3 варианта заданной подпрограммы ( на встроенном ассемблере, с использовани... Вопрос № 183608: Здравствуйте! У меня возникли сложности с таким вопросом: Уважаемый Игорь Витальевич и другие эксперты! Повторяю свой вопрос за №183348 от 25,05,2011 года- требуется написать 3 варианта заданной подпрограммы ( на встроенном ассемблере, с использованием модели памяти PASCAL (листинг) и без использования директивы MODEL (листинг)). Программу, вызывающую эти подпрограммы с указанием автора и варианта задания . Задание- копирование строк. АСС- TASM.Извините, но в мини-форум в свое время не смог войти. Поэтому отвечаю-речь идет о программе на Паскале, не на С. Ответ за № 267396 дал Зенченко Константин Николаевич, очень ему благодарен-но второй код с директивой MODEL, а нужен без. Помогите пожалуйста. Прошу помощи в исправлении второго кода и очень необходимы комментарии на каждой строке всех программ.С благодарностью, Canijke Отправлен: 13.06.2011, 22:36 Вопрос задал: Сanijke Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, Сanijke!
Вот Вам прокомментированные тексты. Вы зарегистрировались как "Посетитель - 377629". Это правильно. Рекомендую переименоваться в Canijke и в будущем задавать вопросы под этим ником. Дело в том, что временная регистрация - она и есть временная, только для ознакомления. Работать с ней очень неудобно.
Будут вопросы, пишите в личку. С посетителя Вы не сможете написать в "чужую" консультацию...
Код на Паскале:
Код : {строки, используемые в программе} var a,b,c,d:string; {внешние подпрограммы} procedure CopyStrA(var x,y:string);external; {подгружаем внешний модуль q183348a.obj} {$L q183348a} procedure CopyStrB(var x,y:string);external; {подгружаем внешний модуль q183348b.obj} {$L q183348b} {процедура со встроенным Ассемблером} {параметры: x-исходная строка, y-выходная} procedure CopyStrC(var x,y:string); begin {начало процедуры} asm {задаем включение блока на асме} cld {задаем автоинкремент для строковых команд} lds si,dword ptr x {загружаем длинный адрес исходной строки в ds:si} les di,dword ptr y {загружаем длинный адрес выходной строки в es:di} lodsb {первый байт-длина строки, al = ds:[si], si=si+1} stosb {сохраняем es:[di] = al, di=di+1} mov cl,al {длина строки в счетчик cx} xor ch,ch {байт превращаем в слово} rep movsb {копируем в повторе cx байт строки es:[di]=ds:[si], si=si+1, di=di+1} end {конец блока на асме} end; {конец процедуры} begin {начало программы} Writeln('Canijke, 5 variant');{автор} repeat {ждем, пока не введем непустую строку} write('Enter string:'); {приглашение на ввод} readln(d) {читаем с консоли/клавиатуры} until length(d)>0; {проверяем, чтобы была непустая строка} CopyStrA(d,a); {вызываем процедуру со встроенным Ассемблером, a=d} writeln('Result A:',a); {выводим результат} CopyStrB(d,b); {вызываем процедуру, которая описана с MODEL, b=d} Writeln('Result B:',b); {выводим результат} CopyStrC(d,c); {вызываем процедуру, которая описана без MODEL, c=d} writeln('Result C:',c); {выводим результат} readln; {ждем нажатия на Enter, чтобы окно не закрылось сразу} end. {конец программы}
С директивой MODEL и упрощенным описанием сегментов:
Код : model small,pascal ;модель памяти и способ передачи параметров code ;сегмент кода public CopyStrA ;имя будет вызываться из другого модуля proc CopyStrA ;имя процедуры push bp ;сохраним регистр, с его помощью будем адресовать параметры mov bp,sp ;в bp кадр стека cld ;задаем автоинкремент для строковых команд ;загрузим адреса строк, которые является длинными указателями mov di,[bp+04] ;адрес в кадре стека для смещения выходной строки mov es,[bp+06] ;адрес в кадре стека для сегмента выходной строки mov si,[bp+08] ;адрес в кадре стека для смещения исходной строки mov ds,[bp+10] ;адрес в кадре стека для сегмента исходной строки lodsb ;первый байт-длина строки, al = ds:[si], si=si+1 stosb ;сохраняем es:[di] = al, di=di+1 mov cl,al ;длина строки в счетчик cx xor ch,ch ;байт превращаем в слово rep movsb ;копируем в повторе cx байт строки es:[di]=ds:[si], si=si+1, di=di+1 pop bp ;восстанавливаем содержимое bp ret 8 ;выход из подпрограммы с удалением из стека параметров - 4 слов endp ;конец процедуры end ;конец модуля
Полное описание сегмента:
Код : _TEXT segment word public 'CODE';сегмент кода public CopyStrB ;имя будет вызываться из другого модуля assume cs:_TEXT ;связываем сегментный регистр с сегментом кода proc CopyStrB ;имя процедуры push bp ;сохраним регистр, с его помощью будем адресовать параметры mov bp,sp ;в bp кадр стека cld ;задаем автоинкремент для строковых команд ;загрузим адреса строк, которые является длинными указателями mov di,[bp+04] ;адрес в кадре стека для смещения выходной строки mov es,[bp+06] ;адрес в кадре стека для сегмента выходной строки mov si,[bp+08] ;адрес в кадре стека для смещения исходной строки mov ds,[bp+10] ;адрес в кадре стека для сегмента исходной строки lodsb ;первый байт-длина строки, al = ds:[si], si=si+1 stosb ;сохраняем es:[di] = al, di=di+1 mov cl,al ;длина строки в счетчик cx xor ch,ch ;байт превращаем в слово rep movsb ;копируем в повторе cx байт строки es:[di]=ds:[si], si=si+1, di=di+1 pop bp ;восстанавливаем содержимое bp ret 8 ;выход из подпрограммы с удалением из стека параметров - 4 слов endp ;конец процедуры _TEXT ends ;конец сегмента end ----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 14.06.2011, 12:37 Номер ответа: 267721 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 267721 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий