IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Pascal и Assembler
DFooz
сообщение 24.08.2006 13:09
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 25
Пол: Мужской
Реальное имя: Иван

Репутация: -  0  +


Написал процедуру сложения лонгинтеджеров на асме
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 байт ) Кол-во скачиваний: 125
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 26.07.2025 4:03
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"