ошибка компиляции asm кода [решено]

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

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

ошибка компиляции asm кода [решено]

Сообщение ronin » 05.06.2011 11:11:38

Здравствуйте. Имеется функция на асме

Код: Выделить всё
{$ASMMODE intel}

asm
...
@bodydone:
  sub ecx, 8
  je @result
...
@result:
  pop eax;
  mov [eax], ebx
  mov [eax+4], esi
  pop esi
  pop ebx


компилятор ругается на команду je @result Error: Assembler syntax error

объясните что не так?

P.S. в ассемблере не силён, просто использую готовую функцию расчёта контрольной суммы файла, переношу проект из Delphi
Последний раз редактировалось ronin 05.06.2011 17:23:17, всего редактировалось 1 раз.
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: ошибка компиляции asm кода

Сообщение hinst » 05.06.2011 12:36:25

насколько я знаю, в том ассемблере, который я учил, символ @ не ставится перед метками. уберите его везде
к тому же, je выполняется, как правило, после команды сравнения. А у вас оно выполняется после команды вычитания sub
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: ошибка компиляции asm кода

Сообщение Иван Шихалев » 05.06.2011 12:59:04

hinst писал(а):je выполняется, как правило, после команды сравнения. А у вас оно выполняется после команды вычитания sub

А вот это не имеет значения. Сравнение — то же вычитание, только без сохранения результата.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: ошибка компиляции asm кода

Сообщение ronin » 05.06.2011 13:39:17

это полностью работоспособный код в Delphi, поэтому и возник вопрос
просто переношу проект под лазарус

насколько я знаю, в том ассемблере, который я учил, символ @ не ставится перед метками. уберите его везде


если комментирую данную строку, ошибок не выдаёт и всё компилируется, хотя во всех процедурах используется данный метод именования меток
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: ошибка компиляции asm кода

Сообщение Maxizar » 05.06.2011 14:10:42

компилятор ругается на команду je @result Error: Assembler syntax error

объясните что не так?


FPC правильно, что ругает вас, да в делфи разрешено писать и так, но зачем лишний раз путать себя и других программистов? По этому FPC не хочет чтобы Вы ошибались и просто хочет, чтоб вы переобозначили имя метки, ведь result зарезервированное слово.. ну так зачем его использовать как имя метки? тем более в Асме....

насколько я знаю, в том ассемблере, который я учил, символ @ не ставится перед метками. уберите его везде

Это не имеет ни какого смысла, можно ставить "собачку" если хотите, я вот ставлю, Некоторые даже советуют ставить ДВЕ "собачки", тем самым заостряя внимания, что это мол не адрес, а именно метка!!!

А вот это не имеет значения. Сравнение — то же вычитание, только без сохранения результата.

Совершенно верно, и чтобы это доказать я привожу процедуру, где использую и вычитание, и собственно команду CMP. , так же привожу функцию, в которой как раз использую Result, как зарезервированное слово...

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

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
procedure p1(a,b:Integer; var c:Integer); assembler; register;
{$ASMMODE intel}
asm
    sub   EAX,EDX
    jae   @Result1   //Если a>=b
    mov   EAX,0
    mov   [ECX],EAX
    jmp   @Exit

  @Result1:
    mov   EAX,1
    mov   [ECX],EAX

  @Exit:
end;

procedure p2(a,b:Integer; var c:Integer); assembler; register;
{$ASMMODE intel}
asm
    cmp   EAX,EDX
    jae   @Result1   //Если a>=b
    mov   EAX,0
    mov   [ECX],EAX
    jmp   @Exit

  @Result1:
    mov   EAX,1
    mov   [ECX],EAX

  @Exit:
end;

function f1(a,b:Integer):Integer; assembler; register;
{$ASMMODE intel}
asm
    cmp   EAX,EDX
    jae   @Result1   //Если a>=b
    mov   Result,0
    jmp   @Exit

  @Result1:
    mov   Result,1

  @Exit:
end;

procedure TForm1.Button1Click(Sender: TObject);
var c:Integer;
begin
    //p1(11,10,c);
    //caption:=IntToStr(c);

    //p2(11,100,c);
    //caption:=IntToStr(c);

  caption:=IntToStr(f1(1,2));

end;

end.

Если вы заметили, я использовал имя метки как: Result1, если 1 убрать FPC будет ругаться. И да старайтесь писать метки более осмысленно, и не использовать в них зарезервированные слова (в одиночном порядке) как было у вас, вот лучше что то в этом роде: Result_Is_Big: или @Result_Is_Big: или @@Result_Is_Big:, Я использую второй вариант с одной Собачкой... :wink:

Резюме: Переименуйте метку и будет вам счастье.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: ошибка компиляции asm кода

Сообщение ronin » 05.06.2011 17:22:57

Maxizar огромное спасибо, заработало :)
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46


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

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

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

Рейтинг@Mail.ru