Ошибка в генерации ассембленого кода?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ошибка в генерации ассембленого кода?

Сообщение beria » 19.10.2022 08:26:13

Код: Выделить всё
; [326] AND     Len,3
%LINE 326+0
      and   eax,3
; [327] JZ      @Exit
%LINE 327+0
      jz   ..@j44_1
..@j45_1:
; [329] MOVD    XMM0,  [P1+EAX*4]
%LINE 329+0
      movd   xmm0,[edx+eax*4]
; [330] MOVD    XMM0,  [P1+Len*4]
%LINE 330+0
      movd   xmm0,[eax+edx*4]



То есть MOVD XMM0, [P1+EAX*4] <> MOVD XMM0, [P1+Len*4] , хотя это синонимы и Len = EAX
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: Ошибка в генерации ассембленого кода?

Сообщение wavebvg » 19.10.2022 11:00:54

Можно лишь предположить, что исходный код тоже был с душком.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Re: Ошибка в генерации ассембленого кода?

Сообщение iskander » 19.10.2022 11:15:01

Наверно нужен хоть какой-то компилируемый кусочек кода.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Ошибка в генерации ассембленого кода?

Сообщение beria » 20.10.2022 08:22:51

iskander писал(а):Наверно нужен хоть какой-то компилируемый кусочек кода.

Выше как раз и есть уже скомпилированный кусок кода. так фрс интерпретирует вообще в любом месте именно эту, с другими все нормально, команду косвенной адресации...
К примеру...
Код: Выделить всё
program project1; //x32

{$mode objfpc}{$H+}

uses {$IFDEF UNIX}
  cthreads, {$ENDIF}
  Classes { you can add units after this };

  procedure Norm(Len: PtrUint; var P1, P2); assembler; nostackframe;
  asm

           MOVD    XMM0,  [P1+EAX*4]
           MOVD    [P2+EAX*4],XMM0
  end;

  procedure BAD(Len: PtrUint; var P1, P2); assembler; nostackframe;
  asm

           MOVD    XMM0,  [P1+LEN*4]
           MOVD    [P2+Len*4],XMM0
  end;


type
  AR = packed array [0..7] of byte;
var
  Data1: AR = (1, 1, 1, 1, 1, 1, 1, 1);
  Data2: AR = (2, 2, 2, 2, 2, 2, 2, 2);
  i: byte;
begin
  NORM(1, Data1, Data2);
  for i := 0 to 7 do Write(Data2[i]);
  BAD(1, Data1, Data2);
  for i := 0 to 7 do Write(Data2[i]);
  readln;
end.
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: Ошибка в генерации ассембленого кода?

Сообщение iskander » 20.10.2022 10:25:03

Очень похоже на глюк компилятора.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Ошибка в генерации ассембленого кода?

Сообщение beria » 20.10.2022 10:35:19

iskander писал(а):Очень похоже на глюк компилятора.

Я об этом и говорю... Просто я был по началу уверен, что это сам что-то глобально в ассемблере не знаю..
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: Ошибка в генерации ассембленого кода?

Сообщение Seenkao » 23.10.2022 12:17:44

beria, если ты так же писал в коде, то я тебя поздравляю. Познакомься это FPC.
Так же это происходит, если ты писал на паскале и смешал с ассемблерным кодом. Так же это произойдёт, если ты присвоишь одно и то же значение одной переменной.

FPC не оптимизирует такие данные. И не смотрит наперёд были они загружены уже или нет.
https://gitlab.com/freepascal.org/fpc/s ... sues/39781 - делать ни чего не собираются. Даже не ответили ни чего.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: Ошибка в генерации ассембленого кода?

Сообщение beria » 24.10.2022 13:37:52

Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru