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

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

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

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

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

Сообщение beria »

Код: Выделить всё

; [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
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

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

Сообщение wavebvg »

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

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

Сообщение iskander »

Наверно нужен хоть какой-то компилируемый кусочек кода.
Аватара пользователя
beria
постоялец
Сообщения: 130
Зарегистрирован: 29.09.2016 07:57:13

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

Сообщение beria »

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.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение iskander »

Очень похоже на глюк компилятора.
Аватара пользователя
beria
постоялец
Сообщения: 130
Зарегистрирован: 29.09.2016 07:57:13

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

Сообщение beria »

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

Я об этом и говорю... Просто я был по началу уверен, что это сам что-то глобально в ассемблере не знаю..
Seenkao
энтузиаст
Сообщения: 563
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

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

Сообщение Seenkao »

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

FPC не оптимизирует такие данные. И не смотрит наперёд были они загружены уже или нет.
https://gitlab.com/freepascal.org/fpc/s ... sues/39781 - делать ни чего не собираются. Даже не ответили ни чего.
Ответить