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

RFpro.ru: Ассемблер? Это просто! Учимся программировать


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

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

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2671
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2501
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2216
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска: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 (Россия) | Еще номера »
  • Отправить WebMoney:


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

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

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

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

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

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

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



    В избранное