компилятор ругается на команду 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.
Если вы заметили, я использовал имя метки как: Result
1, если 1 убрать FPC будет ругаться. И да старайтесь писать метки более осмысленно, и не использовать в них зарезервированные слова (в одиночном порядке) как было у вас, вот лучше что то в этом роде: Result_Is_Big: или @Result_Is_Big: или @@Result_Is_Big:, Я использую второй вариант с одной Собачкой...
Резюме: Переименуйте метку и будет вам счастье.