Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 15 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Moderator
Статус: Не в сети
Регистрация: 27.06.2008
Откуда: Таганрог
#77
Собственно 2 формулы, нужна программа на паскале с ассемблерной вставкой (ассемблер х80287 сопроцессора). С паскалем я бы и сам без проблем за пару минут написал бы, а вот со вставкой огромная проблема, в ассемблере разбираюсь очень плохо, как передать из паскаля данные в ассемблер, да и сама реализация функции. Там реализация, сначала считается на паскале, потом тоже самое в ассемблере, но в теле самой паскалевской программы. Выражения под корнями берутся по модулю.
Надеюсь на вашу помощь в общем.
Есть ещё вопрос, кто нибудь хорошо разбирается в vhdl и quartus 2 в частности ?



Партнер
 

Member
Статус: Не в сети
Регистрация: 25.09.2009
Откуда: Тула
MaD!CaT писал(а):
потом тоже самое в ассемблере

Попробуйте asm...end; ( на делфи так) переменные задаются как обычно с помощью var. А с написанием мат формулы надо думать.


 

Moderator
Статус: Не в сети
Регистрация: 27.06.2008
Откуда: Таганрог
VBIF542
Да синтаксис я знаю, как раз проблема с мат. формулой, там вроде через стек делается.
Уточнение, формулы можно в разных программах, так даже лучше, они не связанны между собой.


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
MaD!CaT писал(а):
Да синтаксис я знаю, как раз проблема с мат. формулой, там вроде через стек делается

Если в версии с ассемблерной вставкой всё делается в самой вставке, то да, через стек. Вроде как ничего сложного, меня только смущает

MaD!CaT писал(а):
ассемблер х80287 сопроцессора


Добавлено спустя 4 минуты 4 секунды:
Тут помню читал статью отличную по тому, как юзать стек. Как вызывать функции там же всё есть. Как через регистры процессора проводить математические вычисления можно и нагуглить
Но всё равно вот это "ассемблер х80287 сопроцессора" меня напрягает


 

Moderator
Статус: Не в сети
Регистрация: 27.06.2008
Откуда: Таганрог
Industrialice
Чуть попозже или завтра, скину свои наброски, там команды вида fmul, fadd, finit вроде есть спец команда которая косинус считает fcos. По крайне мере препод в таком виде показывал.


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
MaD!CaT писал(а):
там команды вида fmul, fadd, finit

Да, это команды для операций с вещественными числами. Проблема в том, что 80287, насколько я помню, 16-ти битный, а float имеет размер 32 бита. Сейчас хоть убей не вспомню имеет ли это значение при написании ассемблерных операций - всё-таки нечасто таких садистов встретишь которым 287-ой нужно запрограммить. Вроде как не нужно париться - не помню проблем при использовании double на х86


 

Moderator
Статус: Не в сети
Регистрация: 27.06.2008
Откуда: Таганрог
Кажись не имеет значения, там вся лаба, вообще заключается в построении в Qurtus, при помощи vhdl сопроцессора и его моделирование, а паскаль с ассемблерной вставкой для проверки работы. Предмет ппц полный у меня с ним... А для начала препод просил написать эту самую программу на паскале с ассемблером и отладить её, а уже на основе полученного алгоритма городить сопроцессор. Вспомнил, там кажись 80287 80 битный вообще, так что проблем возникнуть не должно, интел городил с запасом, 16 битный его старший "брат" 80286. Хотя кажется препод говорил можно использовать и более поздние сопроцессоры (ассемблер), ибо в написании с времён 80287 ничего особо не поменялось.


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
MaD!CaT писал(а):
Вспомнил, там кажись 80287 80 битный вообще

Наверное вы правы - по крайней мере все современные процессоры операции с вещественными числами производят с 80-ю разрядами, то есть тот же 32-х битный float перед вычислениями приводится к длине 80 битов

Добавлено спустя 4 минуты 3 секунды:
VBIF542 писал(а):
переменные задаются как обычно с помощью var

Так можно сделать, но вряд ли препод одобрит - это уже будет, получается, часть программы на Паскале, а часть - в ассемблерной вставке. А нужно все операции сделать в самой вставке


 

Moderator
Статус: Не в сети
Регистрация: 27.06.2008
Откуда: Таганрог
Industrialice ъ
Насколько помню, x можно задать в паскале, хоть фиксированный, хоть вводом с клавы (read (x)) в общем неважно, и только потом его загнать а ассемблер, так я не совсем пойму, как его туда отправить (во вставку). + с самой реализацией формулы затыки. В общем главное, что бы x попал в ассемблер и там уже реализовывалась вся формула.


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
MaD!CaT писал(а):
Industrialice ъ
Насколько помню, x можно задать в паскале, хоть фиксированный, хоть вводом с клавы (read (x)) в общем неважно, и только потом его загнать а ассемблер, так я не совсем пойму, как его туда отправить (во вставку). + с самой реализацией формулы затыки. В общем главное, что бы x попал в ассемблер и там уже реализовывалась вся формула.

Ну, вот вам пример одинакового по функционалу кода на чистом С++ и с ассемблерной вставкой (переменные в обоих случаях объявляются до вставки)

чистый С++
Код:
int a = 10, b = 15;
a += b;


с ассемблерной вставкой
Код:
int a = 10, b = 15;
asm
{
     mov eax, a;
     add eax, b;
     mov a, eax;
};

После того как компилятор переведёт код на ассемблер, оба варианта будут выглядеть идентично


 

Moderator
Статус: Не в сети
Регистрация: 27.06.2008
Откуда: Таганрог
Код:
program one;
uses crt;
var
   x,y,z,k:single;
   p:single;
Begin

x:=3;
k:=cos(x);
k:=k*k;
   clrscr;
asm
     finit
    fld x
    fld x
    fmul st(0),st(1)
    fld1
    fld1
    fadd st(0),st(1)
    fadd st(0),st(1)

    fdiv st(0),st(2)
    fstp z
    fld k
    fadd st(0),st(1)
    fstp y

end;
    ClrScr;
   WriteLn(y:4:6);
    WriteLn(z:4:6);
   WriteLn(k:4:6);
      ReadKey;
end.

Вот набросок мой, компилится, но если ф-цию, косинуса добавить, не считает. Это так кривой набросок, лучшее не получается, ну и естественно косинус в ассемблере а не паскале считать надо ((.


Последний раз редактировалось MaD!CaT 06.12.2011 20:29, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Код:
x:=
k:=cos(x);
k:=k*k;

До этого места дошёл и уже возникли локальные взрывы в мозгу. Тут точно всё правильно?
х - не инициализирован
k сначала инициализируется cos(x), а затем ему же присваивается k*k


Последний раз редактировалось Industrialice 06.12.2011 20:27, всего редактировалось 1 раз.

 

Moderator
Статус: Не в сети
Регистрация: 27.06.2008
Откуда: Таганрог
Да это фигня, сейчас перепишу под более человеческий вид до ассемблерной вставки. Блин при копировании косякнул, не обратил внимания когда вставлял. а где k*k это возведение в квадрат так реализовал, вообще это всё в ассемблере надо было делать, только хз как...


 

Moderator
Статус: Не в сети
Регистрация: 27.06.2008
Откуда: Таганрог
АП темы, в общем как ни пытался, не хочет fcos работать, может у кого, какие идеи ?


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
MaD!CaT писал(а):
может у кого, какие идеи ?

Есть только одна идея толковая - гуглить и гуглить
Вот, наткнулся на такую ветку форума, почитав которую становится понятно почему в задании указание сопроцессора 80287 имеет значение


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 15 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan