Помощь - Поиск - Пользователи - Календарь
Полная версия: Pascal и Assembler
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DFooz
Написал процедуру сложения лонгинтеджеров на асме
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, то всё будет в порядке
volvo
Цитата(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
вот и сам не знаю, с чего.
Вылетает в винду и такое пишет
Цитата

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


У меня тоже TB 7.0
volvo
DFooz, в таком случае - 2 вопроса:

1) чем компилировал ASM - файл (у меня TASM)
2) почему используешь модель памяти Large (если мне не изменяет память, Паскаль знаком только с моделью Small, по крайней мере TP)
DFooz
Цитата(volvo @ 25.08.2006 17:06) *

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

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

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