title Adding
;a program adds numbers
.model Large, Pascal
;----------------------------------------------------------
.data
extrn x:dword, a:dword, b:dword
.code
;-------------------longint----------------------------
Public addl
addl proc far
mov ax,word ptr a
mov bx,word ptr a+2
mov cx,word ptr b
mov dx, word ptr b+2
add ax,cx
adс dx,bx
mov word ptr x,ax
mov word ptr x+2,dx
ret
addl endp
end
вот программа на Паскале
Program AddPb;
{$L Addal.obj}
{$F+}
{$X+}
uses crt;
var a,b,x:longint;
procedure addl(var x:longint; a,b:longint); external;
{----------------}
procedure lonint;
begin
writeln('vvedite a-->');
readln(a);
writeln('vvedite b-->');
readln(b);
x:=a+b;
Write('Pascal: x=',x);
Writeln('=',a,'+',b);
x:=0;
addl(x,a,b);
write('Assembler: x=',x);
writeln('=',a,'+',b);
end;
{----------------}
begin
clrscr;
writeln('vichislit x=a+b');
lonint;
readkey;
end.
вылетает ошибка.
Но если не будет процедуры lonint, а просто написать в главной программе, то всё будет в порядке. Почему?
Program AddPb;
{$L Addal.obj}
{$F+}
{$X+}
uses crt;
var a,b,x:longint;
procedure addl(var x:longint; a,b:longint); external;
{----------------}
begin
clrscr;
writeln('vichislit x=a+b');
writeln('vvedite a-->');
readln(a);
writeln('vvedite b-->');
readln(b);
x:=a+b;
Write('Pascal: x=',x);
Writeln('=',a,'+',b);
x:=0;
addl(x,a,b);
write('Assembler: x=',x);
writeln('=',a,'+',b);
readkey;
end.
Можно ли переслать в ассемблер локальные переменные и объявить ассемблерную процедуру там же?
Т.е.
procedure add;
var
x,y:byte
procedure asem(var x:byte; y:byte); external;
begin
asem(x,y);
end;
и последний вопрос: зачем существует в Асме операция adc? в данном ассемблерном коде, если её заменит на add, то всё будет в порядке