Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2011, 11:51   #1
alexdelphi
Пользователь
 
Регистрация: 24.08.2011
Сообщений: 40
По умолчанию дельфи с asm-вставками

Решил тут написать программу, выводящую квадратные корни из первых _N_ чисел на экран (с использованием XMM-регистров).
Схема работает так:
1) Вводится число _N_.
2) XMM1 инициализируется как 4.0 3.0 2.0 1.0 (4 числа типа single).
3) XMM2 инициализируется как 4.0 4.0 4.0 4.0 (то же)
4) В цикле до _N_ shr 2 извлекается корень из 4 чисел сразу, после чего заносится в массив _a_, который и выводится на экран.
Проблема: первые 4 значения выводятся нормально, после чего идут одни нули.
Вопросы:
1) Как организовать сохранение XMM0, XMM1 и XMM2 в цикле? При выполнении writeln регистры XMM почему-то обнуляются.
2) Как "вытащить" значение XMM0 в массив _а_?
Код прилагается.
Код:
program Project2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils;
type
  TFloat = array [1..4] of single;
var a: TFloat; i, N, j: int32;
procedure init;
asm
  mov      rax, 4                // установить счетчик
@set_xmm1:
  shufps   xmm1, xmm1, 10010011b // очистить место для нового числа
  cvtsi2ss xmm1, rax             // xmm3 = 0.0
  dec      al                    // xmm3 заполнен?
  jnz      @set_xmm1             // нет -> назад, заполнять его
  // конец цикла
  mov      cl, 4                 // установить счетчик
  mov      al, cl                // и скопировать его значение
@set_xmm2:
  cvtsi2ss xmm2, rax             // инициализация xmm2
  shufps   xmm2, xmm2, 10010011b // то же самое,
  dec      cl                    // но для
  jnz      @set_xmm2             // xmm2
end;
procedure mysqrt;
asm
  sqrtps   xmm0, xmm1
  addps    xmm1, xmm2
  movups   N, xmm0        // как сделать?
end;
begin
  readln(N);
  init;
  for i := 1 to N div 4 do
  begin
    mysqrt;
    for j := 1 to 4 do
      if i + j - 1 <= N then
        writeln(a[j]);
  end;
  readln
end.

Последний раз редактировалось alexdelphi; 14.09.2011 в 13:48.
alexdelphi вне форума Ответить с цитированием
Старый 14.09.2011, 12:15   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

не совсем понятно почему четверки (xmm2) задвигаются на N, вместо того, чтобы задвинуть результат (xmm0) на а.
Код:
LEA rdi, [a]
MOVUPS [rdi], xmm0

Последний раз редактировалось f.hump; 14.09.2011 в 12:35. Причина: забыл про x64
f.hump вне форума Ответить с цитированием
Старый 14.09.2011, 12:45   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

эмм, Delphi XE2?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.09.2011, 13:52   #4
alexdelphi
Пользователь
 
Регистрация: 24.08.2011
Сообщений: 40
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
не совсем понятно почему четверки (xmm2) задвигаются на N, вместо того, чтобы задвинуть результат (xmm0) на а.
Код:
LEA rdi, [a]
MOVUPS [rdi], xmm0
точно...

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
эмм, Delphi XE2?
Да. А может, есть здесь причины использовать 2010? У меня она тоже стоит.

P.S. По идее, mysqrt должна вообще-то возвращать результат, а не модифицировать некий массив, но из-за ограничений XE2 не могу с этим справиться.
alexdelphi вне форума Ответить с цитированием
Старый 14.09.2011, 14:26   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
По идее, mysqrt должна вообще-то возвращать результат, а не модифицировать некий массив
что за идея?
f.hump вне форума Ответить с цитированием
Старый 14.09.2011, 14:57   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
P.S. По идее, mysqrt должна вообще-то возвращать результат, а не модифицировать некий массив, но из-за ограничений XE2 не могу с этим справиться.
ну для этого она как минимум должна быть функцией.
далее, я бы посмотрел как Делфи вовращает результат нужного вам типа(ну тут int32, значит поидее он в eax вернется) ну и возвращать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.09.2011, 15:33   #7
alexdelphi
Пользователь
 
Регистрация: 24.08.2011
Сообщений: 40
По умолчанию

Т.е. надо написать функцию, возвращающую нужный мне тип, и под отладчиком посмотреть, в какой регистр это значение попадает?
alexdelphi вне форума Ответить с цитированием
Старый 14.09.2011, 15:42   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну да, так вы сможете правильно писать функции, и чтоб использовать их по человечески.
кстати, у вас там rax, у вас точно проект 64-битный?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка-ВСТАВКАМИ sher_man Помощь студентам 0 15.04.2011 08:03
сортировка вставками Irk-O Помощь студентам 1 16.10.2010 23:11
Сортировка вставками Katyunya Помощь студентам 1 20.04.2010 08:27
Сортировка вставками Pti44ka Помощь студентам 3 17.11.2009 16:49