Начинающий

Applications development, KoOS API questions
  • вообще, почти все компиляторы могут создавать ассемблерный листинг. так что изучай его.
  • Интересует преобразование дробных чисел в целые, и обратно.
    Как можно преобразовать 2-х байтное целое число в 4-х байтное дробное (с плавающей точкой). И как потом обратно из плавающего записать в 2-х байтное целое.
    Хочу сделать программу, которая будет выводить на экран графическую информацию, предварительно расчитав координаты. Дело в том что сопроцесор работает с дробными числами, а при выводе на экран нужны целочисленные координаты.
    Пока нигде подобного не нашел, но ведь должны быть какие-то способы это делать? Писать свою функцию для преобразования не хочу, потому-что это неэфективно, и наверняка должны быть какие-то другие способы.

    Например на С++ делается так:

    Code: Select all

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

    Code: Select all

      fldpi ;загрузка дробного числа
      fist word [bx] ;преобразовать к 2-х байтному ???
    но ничего не получаеться. В справочнике информации мало:
    FIST Запись целого значения.
    ...
    FIST приемник
  • IgorA wrote:Интересует преобразование дробных чисел в целые, и обратно.
    Это делается именно командами fild, fist, fistp. Первая загружает целое число (16-битное или 32-битное) в вершину стека сопроцессора, преобразуя его в вещественный формат. Вторая и третья записывают число с вершины стека сопроцессора в указанную ячейку памяти (16- или 32-битную), при этом fist не меняет стека сопроцессора, fistp выталкивает число с вершины. Режим преобразования - округление вверх, вниз, к ближайшему целому - можно установить через fldcw, по умолчанию finit устанавливает округление до ближайшего.
    Есть ещё frndint, она округляет до целого число в вершине стека сопроцессора.
    IgorA wrote:но ничего не получаеться
    Что именно не получается? Кстати, использование адресации [bx] в 32-битном коде - не лучшая идея.
    Ушёл к умным, знающим и культурным людям.
  • так что поконкретнее плиз.
    Ну как такое тогда делать? Если ничего нельзя возвращать? Как в ассемблере делать &?
  • diamond wrote:Что именно не получается?
    Сделал пробный пример, вывожу 2 надписи на экран (синего и красного цвета). Одну из координат 1-й надписи задаю дробным числом, а перед выводом на экран преобразовываю к целому числу.
    Координаты 2-й надписи даю точно такие-же, но сразу все координаты целые по 2 байта.
    По идее надписи должны попасть в одно место (все координаты равны). Но оно не попадает, вывод - не правильно преобразовал дробное число к целому.
    Yaskhan wrote:Если ничего нельзя возвращать? Как в ассемблере делать &?
    Посмотри ниже прикрепленный файл, там речь идет о разных способах передачи параметров в функцию.
    Attachments
    ch0502a.7z (4.67 KiB)
    способы передачи параметров
    Downloaded 174 times
  • IgorA
    А, ясно. Сопроцессор не может сохранять значения из своего стека напрямую в регистры центрального процессора, а может только в память. Соответственно fist word [bx] сохраняет, в полном соответствии с синтаксисом команды (квадратные скобки неспроста), значение в память по адресу, находящемуся в bx, а вовсе не в bx. Чтобы получить значение в bx, нужно сохранить из стека в промежуточную переменную, а потом загрузить сохранённое значение в bx.
    Ушёл к умным, знающим и культурным людям.
  • Yaskhan wrote:Как в ассемблере делать &?
    простой пример:

    Code: Select all

    org 0x100
    Var1 dd 0x102
    mov dword eax, [Var1] ; в eax будет значение переменной, т.е. 0x102
    mov dword eax, Var1   ; в eax будет адрес переменной, т.е. 0x100
  • Сегодня долго не мог понять, почему не работает программа. Вы не представляете, как долго я долбился. Код заработал, когда поменял

    Code: Select all

    ...
    mcall 68, 12, eax
    ...
    на

    Code: Select all

    ...
    mov  ecx, eax
    mcall 68, 12
    ...
    А я и не знал, что так нельзя :o
  • ChE
    Конечно нельзя!
    Первым же действием макрос затирает значение EAX прописывая в регистр 68.
    Наверное все таки стоит смотреть код макроса перед тем, как им пользоваться?

    Вообще макрос это кусок кода, который тупо вставится вместо того, что ты написал и ожидать от него особо интеллектуального поведения не имеет смысла.
  • Блин, сегодня проснулся со свежей головой и понял свою тупость вчерашнюю.
  • IgorA wrote:В справочнике информации мало
    Смотри файл "Инструкции IA.doc" в архиве.
    ftp://kolibrios.org/users/Asper/docs/mydocs.7z
  • Я перевожу Эолайт с ASCII-символов на Скан коды. Вопрос: как преобразовывать Скан-коды в ASCII-символы? Я так понял, это требуется, например, для Edit_box'a.
    Из хаоса в космос
  • Leency
    В дистрибутиве есть два приложения, одно генерирует коды ASCII, другое Scan. Называются keyascii и scancode соответсвенно. Дальше сам разберешся? :mrgreen:
  • Есть код рисующий кривые Безье:

    Code: Select all

    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 5958 times
  • Who is online

    Users browsing this forum: No registered users and 1 guest