Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Jan 27, 2021 2:35 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 166 posts ]  Go to page Previous 1 2 3 4 5 612 Next
Author Message
 Post subject: Re: Начинающий
PostPosted: Tue Aug 25, 2009 1:27 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 756
результат принято передавать в регистре eax (хотя никто не запрещает использовать другие регистры - лишь бы они не использовались в основной программе, а если используются, то нужно сохранять их, например, в стеке). но во-первых, ты написал, что ф-ция ничего не возвращает (void), а во-вторых, речь шла о входных параметрах, а не выходных. так что поконкретнее плиз.


Top
   
 Post subject: Re: Начинающий
PostPosted: Tue Aug 25, 2009 1:29 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 756
вообще, почти все компиляторы могут создавать ассемблерный листинг. так что изучай его.


Top
   
 Post subject: Re: Начинающий
PostPosted: Tue Aug 25, 2009 1:43 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 891
Интересует преобразование дробных чисел в целые, и обратно.
Как можно преобразовать 2-х байтное целое число в 4-х байтное дробное (с плавающей точкой). И как потом обратно из плавающего записать в 2-х байтное целое.
Хочу сделать программу, которая будет выводить на экран графическую информацию, предварительно расчитав координаты. Дело в том что сопроцесор работает с дробными числами, а при выводе на экран нужны целочисленные координаты.
Пока нигде подобного не нашел, но ведь должны быть какие-то способы это делать? Писать свою функцию для преобразования не хочу, потому-что это неэфективно, и наверняка должны быть какие-то другие способы.

Например на С++ делается так:
Code:
float a=1.2345; // дробное число
short int b;
//a=... // пошли вычисления
b=(short int)a; // приведение дробного к целому, как оно его делает ???

Как то же самое будет выглядеть на asm? Думал что так:
Code:
  fldpi ;загрузка дробного числа
  fist word [bx] ;преобразовать к 2-х байтному ???

но ничего не получаеться. В справочнике информации мало:
Quote:
FIST Запись целого значения.
...
FIST приемник


Top
   
 Post subject: Re: Начинающий
PostPosted: Tue Aug 25, 2009 2:03 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1600
IgorA wrote:
Интересует преобразование дробных чисел в целые, и обратно.

Это делается именно командами fild, fist, fistp. Первая загружает целое число (16-битное или 32-битное) в вершину стека сопроцессора, преобразуя его в вещественный формат. Вторая и третья записывают число с вершины стека сопроцессора в указанную ячейку памяти (16- или 32-битную), при этом fist не меняет стека сопроцессора, fistp выталкивает число с вершины. Режим преобразования - округление вверх, вниз, к ближайшему целому - можно установить через fldcw, по умолчанию finit устанавливает округление до ближайшего.
Есть ещё frndint, она округляет до целого число в вершине стека сопроцессора.
IgorA wrote:
но ничего не получаеться

Что именно не получается? Кстати, использование адресации [bx] в 32-битном коде - не лучшая идея.

_________________
Ушёл к умным, знающим и культурным людям.


Top
   
 Post subject: Re: Начинающий
PostPosted: Tue Aug 25, 2009 2:57 pm 
Offline

Joined: Tue Apr 14, 2009 7:33 am
Posts: 83
Quote:
так что поконкретнее плиз.

Ну как такое тогда делать? Если ничего нельзя возвращать? Как в ассемблере делать &?


Top
   
 Post subject: Re: Начинающий
PostPosted: Tue Aug 25, 2009 3:42 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 891
diamond wrote:
Что именно не получается?

Сделал пробный пример, вывожу 2 надписи на экран (синего и красного цвета). Одну из координат 1-й надписи задаю дробным числом, а перед выводом на экран преобразовываю к целому числу.
Координаты 2-й надписи даю точно такие-же, но сразу все координаты целые по 2 байта.
По идее надписи должны попасть в одно место (все координаты равны). Но оно не попадает, вывод - не правильно преобразовал дробное число к целому.
Yaskhan wrote:
Если ничего нельзя возвращать? Как в ассемблере делать &?

Посмотри ниже прикрепленный файл, там речь идет о разных способах передачи параметров в функцию.


Attachments:
File comment: способы передачи параметров
ch0502a.7z [4.67 KiB]
Downloaded 82 times
Top
   
 Post subject: Re: Начинающий
PostPosted: Tue Aug 25, 2009 3:47 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1600
IgorA
А, ясно. Сопроцессор не может сохранять значения из своего стека напрямую в регистры центрального процессора, а может только в память. Соответственно fist word [bx] сохраняет, в полном соответствии с синтаксисом команды (квадратные скобки неспроста), значение в память по адресу, находящемуся в bx, а вовсе не в bx. Чтобы получить значение в bx, нужно сохранить из стека в промежуточную переменную, а потом загрузить сохранённое значение в bx.

_________________
Ушёл к умным, знающим и культурным людям.


Top
   
 Post subject: Re: Начинающий
PostPosted: Tue Aug 25, 2009 3:50 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 756
Yaskhan wrote:
Как в ассемблере делать &?

простой пример:
Code:
org 0x100
Var1 dd 0x102
mov dword eax, [Var1] ; в eax будет значение переменной, т.е. 0x102
mov dword eax, Var1   ; в eax будет адрес переменной, т.е. 0x100


Top
   
 Post subject: Re: Начинающий
PostPosted: Wed Aug 26, 2009 10:43 pm 
Offline

Joined: Thu Aug 13, 2009 10:39 am
Posts: 54
Сегодня долго не мог понять, почему не работает программа. Вы не представляете, как долго я долбился. Код заработал, когда поменял
Code:
...
mcall 68, 12, eax
...

на
Code:
...
mov  ecx, eax
mcall 68, 12
...

А я и не знал, что так нельзя :o


Top
   
 Post subject: Re: Начинающий
PostPosted: Thu Aug 27, 2009 12:46 am 
ChE
Конечно нельзя!
Первым же действием макрос затирает значение EAX прописывая в регистр 68.
Наверное все таки стоит смотреть код макроса перед тем, как им пользоваться?

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


Top
   
 Post subject: Re: Начинающий
PostPosted: Thu Aug 27, 2009 6:42 am 
Offline

Joined: Thu Aug 13, 2009 10:39 am
Posts: 54
Блин, сегодня проснулся со свежей головой и понял свою тупость вчерашнюю.


Top
   
 Post subject: Re: Начинающий
PostPosted: Fri Aug 28, 2009 9:15 am 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
IgorA wrote:
В справочнике информации мало

Смотри файл "Инструкции IA.doc" в архиве.
ftp://kolibrios.org/users/Asper/docs/mydocs.7z


Top
   
 Post subject: Re: Начинающий
PostPosted: Mon Aug 31, 2009 3:29 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5387
Я перевожу Эолайт с ASCII-символов на Скан коды. Вопрос: как преобразовывать Скан-коды в ASCII-символы? Я так понял, это требуется, например, для Edit_box'a.

_________________
Звиздеть не мешки ворочать


Top
   
 Post subject: Re: Начинающий
PostPosted: Mon Aug 31, 2009 3:52 pm 
Leency
В дистрибутиве есть два приложения, одно генерирует коды ASCII, другое Scan. Называются keyascii и scancode соответсвенно. Дальше сам разберешся? :mrgreen:


Top
   
 Post subject: Re: Начинающий
PostPosted: Thu Sep 03, 2009 10:37 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 891
Есть код рисующий кривые Безье:
Code:
void TMyWin::Bezie(TDC& dc, float x0, float y0, float x1, float y1, float x2, float y2)
{
    dc.Ellipse(x0-3,y0-3, x0+3,y0+3);
    dc.Ellipse(x1-3,y1-3, x1+3,y1+3);
    dc.Ellipse(x2-3,y2-3, x2+3,y2+3);

    float t, xt,yt;
    for(t=.0;t<1.;t+=.005){
      xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2;
      yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2;
      dc.SetPixel(xt,yt,255L);
}}

Вопрос в том как можно определить шаг для изменения переменной t (t+=.005) ? Если задать его константой, то при большом разбросе точек кривая "рвется", а при маленьком точки налазят друг на друга и многие точки зря рисуются ... Может кто знает как подобная проблема решается в WinAPI?
Все это дело я попробую при возможности включить в vectors.obj


Attachments:
bezie.png
bezie.png [ 1.48 KiB | Viewed 3502 times ]
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 166 posts ]  Go to page Previous 1 2 3 4 5 612 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited