Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

lamed
Статус: Профессионал
Рейтинг: 2754
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2494
∙ повысить рейтинг »
star9491
Статус: Профессионал
Рейтинг: 2266
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Pascal (Паскаль)

Номер выпуска:1105
Дата выхода:11.06.2010, 00:00
Администратор рассылки:Boriss, Академик
Подписчиков / экспертов:203 / 176
Вопросов / ответов:2 / 2

Вопрос № 178852: Здравствуйте уважаемые эксперты! Интересует как в паскале передать строку на обработку в ассемблерную вставку, делаю следующее: asm mov di, offset strr mov ah, [di] end; strr типа string. При этом в ah записыв...


Вопрос № 178925: Уважаемые эксперты. Помогите мне исправить или подредактировать программу, для нахождения значение интегралла методом Трапеции. для интеграла ∫1/ sqrt(2*x*x+0.3) a=0.7 b= 1.3 (это граница) ξ=10-3 ответ должен получитьс...

Вопрос № 178852:

Здравствуйте уважаемые эксперты! Интересует как в паскале передать строку на обработку в ассемблерную вставку, делаю следующее:
asm
mov di, offset strr
mov ah, [di]
end;
strr типа string.
При этом в ah записывается 0, собственно интересуют варианты передачи строки на обработку в ассемблерную вставку для строки типа string или символьного массива типа char. Заранее спасибо.

Отправлен: 04.06.2010, 15:16
Вопрос задал: Steplervas, 1-й класс
Всего ответов: 1
Страница вопроса »


Отвечает amnick, Студент :
Здравствуйте, Steplervas.

Вот пример того, как это сделать в разных случаях:
Код:
{ передать строку на обработку в ассемблерную вставку }
program q178852;

{ обращение к строке, передаваемой как VAR-параметр
в функцию передается сегмент:смещение }
procedure strcpy( var dest, src: string );
begin
asm
lds si,src
les di,dest
xor cx,cx
cld
lodsb
stosb
mov cl,al
rep movsb
end;
end;

{ Обращение к строке, передаваемой по значению и
к локальной переменной. Переменная находится в стеке. }
procedure display( s1: string );
var s2: string;
begin
asm
push DS
lea si,s1
lea di,s2
mov ax,SS
mov DS,ax
mov ES,ax
{можно также (на 2 байта короче, но медленнее):
push SS
push SS
pop DS
pop ES
}
xor cx,cx
cld
lodsb
stosb
mov cl,al
rep movsb
pop DS
end;
writeln( s2 );
end;

var str1, str2: string;

begin
str1 := '1234567890';
{ обращение к строке как к глобальной переменной }
asm
lea si,str1
lea di,str2
push DS { переменные в сегменте данных }
pop ES
xor cx,cx
cld
lodsb
stosb
mov cl,al
rep movsb
end;
writeln( str2 );

str1 := 'var parameter';
strcpy( str2, str1 );
writeln( str2 );
display( 'parameter by value' );
end.


Проверено в Borland Pascal 7.0.

Успехов!
По просьбе автора
-----
∙ Отредактировал: Victor Pyrlik, Модератор
∙ Дата редактирования: 08.06.2010, 17:57 (время московское)

Ответ отправил: amnick, Студент
Ответ отправлен: 04.06.2010, 15:46
Номер ответа: 261876

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261876 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Вопрос № 178925:

    Уважаемые эксперты. Помогите мне исправить или подредактировать программу, для нахождения значение интегралла методом Трапеции. для интеграла ∫1/ sqrt(2*x*x+0.3)
    a=0.7 b= 1.3 (это граница) ξ=10-3

    ответ должен получиться 0,404258493. у меня почему то не получается.
    Помогите пожалуйста.

    Отправлен: 05.06.2010, 18:46
    Вопрос задал: Сибриков Вова, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Шичко Игорь, Практикант :
    Здравствуйте, Сибриков Вова.
    Есть ошибки в алгоритме.
    Вот новый код.
    Необходимо вводить n=600

    program Integral;

    var a,b,h,s,x,y: real;
    i,n: integer;

    function f(c: real): real;
    begin
    f:=1/(sqrt(2*sqr(x)+0.3));
    end;

    begin
    writeln('a=');
    readln(a);
    writeln('b=');
    readln(b);
    writeln('n=');
    readln(n);

    s:=0;
    h := (b-a)/n;

    for i:=1 to n-1 do
    begin
    x:= a + i* h;
    s:= s + f(x);
    end;
    y:= h*((f(a)+f(b))/2+s);
    writeln ('n=',n, ' y=',y: 8: 3);
    readln;

    end.

    добавьте в начале очистку экрана.
    Удачи.

    Ответ отправил: Шичко Игорь, Практикант
    Ответ отправлен: 05.06.2010, 19:26
    Номер ответа: 261901

    Оценка ответа: 5

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261901 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное