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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2022, 12:30   #11
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А он ASM не использует - так баловство.
macomics вне форума Ответить с цитированием
Старый 25.08.2022, 14:29   #12
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Зачем Вы кодите на Delphi, если используете ASM?
Основной код программы на Delphi
Asm использую для оптимизации каких-то небольших операций

Потому как иногда asm код выглядит намного проще, чем тот что генерирует язык высокого уровня
Kronos913 вне форума Ответить с цитированием
Старый 25.08.2022, 14:31   #13
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда лучше бросайте это. Тот код, что вы добавляете содержит огромное количество огрехов.
macomics вне форума Ответить с цитированием
Старый 25.08.2022, 21:24   #14
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Вообще, началось все с одной процедуры, которая на ассемблере была проще - потому как напрямую делалось многое, что иначе приходится делать через костыли

А дальше я начал замечать, что многие вещи все равно можно сделать лучше.
Например, если использовать 1 и 2 байты регистра как разные переменные, можно не выходя из регистров проводить вычисления. Без обращения к оперативке явно ж будет быстрее

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

А через asm записал все символы, а потом уже записал в нулевой символ итоговую длину
Kronos913 вне форума Ответить с цитированием
Старый 25.08.2022, 22:02   #15
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Только вы должны делать все это после выделения памяти. Вам ни кто не мешает сначало выделить строку нужно длины и добавлять в нее по символу.
Код:
str := '                ';
for i := 0 to 15 do str[i] := char(i + 32);
macomics вне форума Ответить с цитированием
Старый 25.08.2022, 22:20   #16
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Только вы должны делать все это после выделения памяти. Вам ни кто не мешает сначало выделить строку нужно длины и добавлять в нее по символу.
Код:
str := '                ';
for i := 0 to 15 do str[i] := char(i + 32);
А если не знаешь сразу, сколько там будет итоговая длина=))

Но вот я недавно через asm конструировал функцию, которая вставляет пробелы каждые сколько-то символов, при этом начинает с конца

'1234567890' -> '1 234 567 890'

Методами высокого уровня нужно было бы на каждом вставленном пробеле двигать всю строку

Через asm - сначала вычисляется место первого пробела, потом по символам создается строка result и уже потом записывается в нулевой символ длина строки по разнице адресов ячеек
Kronos913 вне форума Ответить с цитированием
Старый 26.08.2022, 00:03   #17
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Я согласен, что на asm эта возьня может быть выполнена проще, но если постараться можно и на Pascal написать адекватный алгоритм. Просто надо делать не стандартно (не использовать обычные механизмы сцепки).
macomics вне форума Ответить с цитированием
Старый 26.08.2022, 00:17   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Методами высокого уровня нужно было бы на каждом вставленном пробеле двигать всю строку
Нет. Например (может быть, что-то не учел):
Код:
Function InsertSpaces(const s: string; const piece_length: byte): string;
var
  len, len_div, len_mod, i, j, g: integer;
begin
  len := Length(s);
  if len <= piece_length then
  begin
    result := s;
    exit;
  end;
  len_div := len div piece_length;
  len_mod := len mod piece_length;
  SetLength(result, len + len_div - 1 + ord(len_mod <> 0));
  g := 1;
  j := 1;
  if len_mod <> 0 then
  begin
    Move(s[g], Result[j], len_mod);
    Inc(g, len_mod);
    Inc(j, len_mod);
    Result[j] := ' ';
    Inc(j);
  end;
  for i := 0 to len_div - 2 do
  begin
    Move(s[g], Result[j], piece_length);
    Inc(g, piece_length);
    Inc(j, piece_length);
    Result[j] := ' ';
    Inc(j);
  end;
  Move(s[g], Result[j], piece_length);
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  ShowMessage(InsertSpaces('1234567890', 3));
end;
Читается явно легче ассемблера. Ради интереса можно сравнить скорость высокоуровневой версии и ассемблерной.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 26.08.2022, 00:28   #19
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
function TestProc(str: String; insertAt: LongInt): String;
var
   i, size, count: LongInt;
begin
   size := Length(str);
   if ( size <= insertAt ) or ( insertAt <= 0 ) then Result := str else begin
      count := ( size - 1 ) div insertAt;
      SetLength(Result, size + count);
      while size >= Low(str) do begin
         for i := 1 to insertAt do begin
            if size >= Low(str) then Result[size + count] := str[size];
            dec(size);
         end;
         if size >= Low(str) then Result[size + count] := ' ';
         dec(count);
      end;
   end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  ShowMessage(InsertSpaces('1234567890', 3));
end;
Если делать в обратном порядке, то выгладит даже проще.

Последний раз редактировалось macomics; 26.08.2022 в 01:25.
macomics вне форума Ответить с цитированием
Старый 26.08.2022, 00:54   #20
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Кстати, я пока не разобрался, как через asm работать с безлимитными строками. Точнее, считывать их я научился, а вот записывать - нет

Потому пользуюсь строками с ограничением в 255
Kronos913 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Здравствуйте ! в чем проблема,почему почему время исполнения операций не работает ? ion leahu Помощь студентам 6 23.11.2014 19:36
деление на 0 , ОДЗ :( jesterXXX Помощь студентам 7 21.10.2012 23:04
Деление в C++ Юнона Общие вопросы C/C++ 10 29.05.2011 17:53
Деление Nikita++ Помощь студентам 8 19.03.2011 18:56
Деление a mod b Emperous Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 02.02.2010 21:10