Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1435 | Дата выхода: | 08.04.2011, 15:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 213 / 66 | Вопросов / ответов: | 1 / 1 | Вопрос № 182708: Здравствуйте! У меня возникли сложности с таким вопросом: Задача состоит в соединение Паскаля и ассемблера. Имеется код паскаля вызывающий файл ассемблера через процедуру: {$L lab6} uses crt; var str1,str2,n,z,dest:string; str1s:in... Вопрос № 182708: Здравствуйте! У меня возникли сложности с таким вопросом: Задача состоит в соединение Паскаля и ассемблера. Имеется код паскаля вызывающий файл ассемблера через процедуру:
{$L lab6} uses crt; var str1,str2,n,z,dest:string; str1s:integer; procedure Posstr;Far;External; begin clrscr; writeln('-=Obrabotka strok=-'); writeln('I-stroka:',str1); writeln('II-stroka:',str2); writeln('S kakogo el. delete:',n); dest:=length(str1)+length(str2); str1s:=length(str1); posstr; writeln('Rezultat:'); z:=posstr; writeln(z); readkey; end.
Отправлен: 03.04.2011, 14:48 Вопрос задал: JohnyWayne (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, JohnyWayne! Программа на Паскале (тестировал в TP 7.1) Ваши ошибки: 1) n должно быть целым (байт, слово - без разницы) 2) Писать сообщение и вводить значение надо так, как в программе 3) Незачем использовать переменную z, у нас же есть dest (это не ошибка, просто лишнее)
Код: {$L lab6} uses crt; var str1,str2,dest:string; var n:integer; procedure Posstr;Far;External; begin clrscr; writeln('-=Obrabotka strok=-'); write('I-stroka: '); readln(str1); write('II-stroka: '); readln(str2); write('S kakogo el. vstavl: '); readln(n); posstr; writeln('Rezultat:' ); writeln(dest); readkey; end.
Программу на ассемблере lab6.asm я полностью переделал. Обратите внимание, строки организованы следующим образом: Первый байт - длина, следом за ним сама строка. Непонимание этого дало совершено неработоспособный код И если хотели вернуть адрес строки, то надо было это делать в регистрах DX:AX (сегмент:смещение), а не в DX Впрочем, в данном случае, это лишнее, т.к. нам требуется процедура, а не функция.
Учитываем, что все переменные находятся в сегменте данных Паскаля Плюс используются строковые команды Сделал проверку на случай, если позиция вставки будет больше длины первой строки, в таком случае просто копируем первую строку.
Код: .model small
.data extrn str1:byte, str2:byte, n:byte extrn dest:byte
.code public posstr posstr proc far xor cx, cx ;счетчик байт lea di, dest+1 ;адрес результирующей строки lea si, str1 ;первая строка (адрес длины) lodsb ;длина первой строки cmp al, n ;если первая строка короче позиции вставки, jb OnlyStr1 ;то просто копируем первую строку ;копируем часть первой строки mov cl, n ;длина подстроки rep movsb ;копируем [ds:si]->[es:di] push si ;сохраним адрес второй части первой строки lea si, str2 ;адрес второй строки (адрес длины) mov cl, [si] ;длина второй строки inc si ;на позицию самой строки rep movsb ;копируем mov cl, al ;длина первой строки sub cl, n ;длина оставшейся подстроки pop si ;восстановим адрес подстроки CopySubStr: r ep movsb ;копируем ;сформируем длину выходной строки mov ax, di ;адрес за строкой sub ax, offset dest + 1 ;длина mov dest, al ;установим в первой позиции ret OnlyStr1: ;только копируем первую строку mov cl, al ;длина первой строки jmp CopySubStr ;на копирование posstr endp
end
----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 04.04.2011, 12:05 Номер ответа: 266531 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Комментарий к оценке: спасибо за помощь и за то, что указали мои ошибки Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 266531 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий