program pr_asm;

{$APPTYPE CONSOLE}



{Result:=x + y}
function plus(x,y:integer):integer;
asm
mov eax,x      //Подаем x
add eax,y      //Прибавляем y = result:=X+Y;
end;

{Result:=x * y}
function Umnojenie(x,z:integer):integer;
asm
mov ebx,z     //Заносим z
mov eax,x     //заносим х
imul ebx      //Получаем резльтат = result:=x*z;
end;

{Result:=x- y}
function Minus(x,y:integer):integer;
asm
//mov eax,x  //Заносим первое число
sub x,y  //Отнимаем  от  него y
end;       // Получаем Result:=x-y;

{Result:=x div y}
Function divider(x,y:integer):integer;
asm
mov ebx,y     //Занесение  параметра
cdq           //Подготовка  к  делению
idiv ebx      //Деление //Result:=(x div y);
end;

{for i := 0 to 10 do}
procedure asm_cycle; //Пример  цикла
label lb;            //For i := 0 to 10 do
var d:integer;       //inc(d);
begin
asm
mov ebx,0            //Контрольный регистр
mov d,0              // Обнуляем(D) d := 0;
lb:
add d,1 // Или inc d //Добавляем  значение
inc ebx              //Прибавляем шаг к контрольному  регистру
cmp ebx,10           //Проверяем какой  шаг если не 10 то
jnz lb               //по  новой
mov ebx,0            //Этот оператор  находится  за  пределами цикла
end;
Writeln(d);
end;

{if x = 0 then x := 45 else x:=0}
procedure if_sample(x:integer); //Пример оператора if
var res: integer;               //Переменная для проверки
label exit,lb;                  //Метка на выход и прыжка "then"
begin
asm
cmp x,0                         //if x <> 0// если х <> о то
jnz lb                          //then //переход на ld
mov res,45                      //else res:=45;
jmp exit                        //Метка  на выход
lb:mov res,0                    //Присваемое значение
exit: mov eax,0                 //Метка выхода
end;
Writeln(res);                   //Смотрим результат
end;

{------------------------------------}
{Пример  вызова внешней  пролцедуры}
procedure call_s(x,d:integer;bol:boolean); //Внешняя процедура
begin                          //Которая будет  вызыватся
writeln(x);                    //Методом ассемблера
writeln(d);
case bol of
true : Writeln('true');
false: Writeln('False');
end;
end;

procedure call_sample;
//call_s(4,34,true);  //Так процедура  выглядит в PASCAL  "вызов"
asm
mov eax,4                //Передача  первого  параметра
mov edx,34               //Передача  второго  параметра
mov cl,0                 //Передача Булевого значения
call call_s              //Вызов
end;
{-----------------------------------}
var I : integer;
begin
WriteLN('Assemblers  operators "DEMO"');
WriteLN('Select operator');
WriteLN('Plus Function is 1');
WriteLN('Umnojenie Function is 2');
WriteLN('Minus Function is 3');
WriteLN('Divider Function is 4');
WriteLN('FOR..TO..DO Cycle is 5');
WriteLN('IF..Then..Else operator is 6');
WriteLN('Call Procedure is 7');
readln(i);
case i of
1:writeln(plus(3,5));
2:Writeln(Umnojenie(3,6));
3:Writeln(Minus(10,3));
4:Writeln(divider(20,4));
5:asm_cycle;
6:if_sample(1);
7:call_sample;
end;
Readln;
end.
