Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Pascal и Assembler

Автор: DFooz 24.08.2006 17:09

Написал процедуру сложения лонгинтеджеров на асме

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, то всё будет в порядке


Прикрепленные файлы
Прикрепленный файл  asm.rar ( 593 байт ) Кол-во скачиваний: 143

Автор: volvo 24.08.2006 20:31

Цитата(DFooz @ 24.08.2006 13:09) *
вылетает ошибка

с чего бы это у тебя ошибка вылетала? blink.gif У меня нормально отрабатывает. Какая, собственно, разница, откуда ты вызываешь эту ASM - процедуру? Вот что выводит твоя первая программа (с процедурой LonInt):
Цитата(Console)
vichislit x=a+b
vvedite a-->
15
vvedite b-->
17
Pascal: x=32=15+17
Assembler: x=32=15+17


(Компилировал в TurboPascal 7.0)

Автор: DFooz 25.08.2006 19:56

вот и сам не знаю, с чего.
Вылетает в винду и такое пишет

Цитата

Turbo Pascal
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:000f IP00cb OP:0f 6f ef 00 fo Для завершения работы приложения нажмите кноаку "Закрыть"


У меня тоже TB 7.0

Автор: volvo 25.08.2006 20:06

DFooz, в таком случае - 2 вопроса:

1) чем компилировал ASM - файл (у меня TASM)
2) почему используешь модель памяти Large (если мне не изменяет память, Паскаль знаком только с моделью Small, по крайней мере TP)

Автор: DFooz 25.08.2006 20:37

Цитата(volvo @ 25.08.2006 17:06) *

DFooz, в таком случае - 2 вопроса:

1) чем компилировал ASM - файл (у меня TASM)
2) почему используешь модель памяти Large (если мне не изменяет память, Паскаль знаком только с моделью Small, по крайней мере TP)

1)TASM
2)в книжке написано. Изменил на Small - Паскаль вроде считает, но сразу же закрывается.
Может я что-то с директивами напутал?