28.05.2008, 07:27
общий
это ответ
Здравствуйте, Делий Роман !
Мне кажется, что эта процедура ошибочна, так как возврат результата в одном из параметров не самый красивый вариант.
Вероятно, здесь имеет место подпрограмма-функция (тогда xxx:= x+y;) или же параметры являются указателями на x и y.
function xxx(x,y:integer):longint;
begin
xxx:= x+y;
end;
Возможный вариант смотрите в приложении; TurboPascal генерирует не совсем корректный код для такой функции.
Приложение:
ASSUME cs:code, ds:data, ss:stk;-----------------------------------------------data SEGMENTDB ‘blablabla :)‘data ENDS;-----------------------------------------------code SEGMENTentry_point:mov ax,SEG datamov ds,axmov ax,32767push axmov ax,32767push axcall xxx_func ;7FFFh + 7FFFh = 0000FFFEhmov ax,-32768push axmov ax,-32768push axcall xxx_func ;8000h + 8000h = FFFF0000hmov ax,4C00hINT 21h;------------------------------------------------;подпрограмма сложения двух чисел типа integer;ВОЗВРАТ: dx:ax - результат сложения типа longint;------------------------------------------------xxx_func PROC near;стековые параметрыy equ WORD PTR [bp+4]x equ WORD PTR [bp+6]arg_size = 2*2push bpmov bp,sp;xxx_func:=x+yxor dx,dxmov ax,xadd ax,yjnc exitmov dx,0FFFFhexit:pop bpret arg_sizexxx_func ENDPcode ENDSstk SEGMENT stackDB 200h DUP(?)stk ENDS;TurboPascal;function xxx_func(x,y:integer):longint;;begin;xxx_func:= x+y;;end;;...;mov ax,[bp+6];add ax,[bp+4];cwd ;копирует значение старшего бита регистра AX на все биты регистра DX;...;тестирование;xxx_func(32767,32767) = -2;xxx_func(-32768,-32768) = 0END entry_point