Регистрация: 03.09.2009
Сообщений: 8
|
Не верно считает
Здравствуйте! Написал программу, все работает, но при подстановки максимальных значений считает не верно! Подскажите почему?
вот код АСМа
Код:
.model Large, pascal
.data
Extrn Numerator:Dword;
Extrn aS:byte,ccS:byte,ddS:byte,bbS:byte
Extrn xl:Word,ai:Word,ci:Word,ddi:Word,bbi:word
Extrn Denominator:Word;
.code
Public Lab3S ; x=(25/c-d+2)/(b+a*a-1)
Lab3S proc far
mov al,aS;
Imul aL;
dec ax;
Push ax
mov aL,bbS;
CBW ;
Pop bx
add ax,bx;
mov Denominator,ax;
mov ax,25
IDIV ccS
CBW
Push ax
mov al,ddS
CBW
Pop bx
sub bx,ax
add bx,2
mov ax,bx
CWD
mov word ptr Numerator,AX
mov word ptr Numerator+2, DX
idiv Denominator
mov xl,ax
ret
Lab3S endp
Public Lab3I
Lab3I proc far
mov ax,ai
Imul ai
dec ax
add ax,bbi
mov denominator,ax
mov ax,25
CWD
IDIV ci
CWD
Push dx
Push ax
mov ax,ddi
CWD
pop bx
pop cx
sub bx,ax
sub cx,dx
add bx,2
adc cx,0
mov WORD PTR Numerator,bx
mov Word ptr Numerator+2,cx
mov ax,bx
mov dx,cx
IDIV Denominator
mov xl,ax
ret
Lab3I endp
end
ПАСКАЛЕВСКИЙ КОД
Код:
Program Lab3P;
{$l Laba3}
{$f+}
Uses CRT, InputNum;
Const
inv2='१г«мв*в';
invAi='A(integer)';
InvCi='C(integer)';
invDi='D(integer)';
invBi='B(integer)';
invAs='A(Shortint)';
invCs='C(Shortint)';
invDs='D(Shortint)';
invBs='B(Shortint)';
intMin=-32768;
intMax=32767;
ShortMin=-128;
ShortMax=127;
Label L1;
var
a,b,c,d,x,Numerator:Longint;
aS,ccS,ddS,bbS:Shortint;
xl,ai,bbi,ci,ddi,Denominator:Integer;
ch:char;
Procedure Lab3I;external;
Procedure Lab3S;external;
function F(a,b,c,d:Longint;Min,Max:Longint):Boolean;
Var x1:longint;
s1:String;
Begin
F:=True;
x1:= a*a-1+b;
if (x1<Min) or (x1>Max) then
Begin
s1:='‡**¬Ґ**⥫м '+inv3;
Writeln(s1,Min,'..',Max,']!!!');
Writeln(x1);
Writeln(inv1);
F:=False;
Exit;
End;
if ((c=0) or (x1=0)) then
Begin
Writeln ('ЋиЁЎЄ*!!! „Ґ«Ґ*ЁҐ ** ЌЋ‹њ!!! ');
F:=False;
end
else
begin
x:=25div c-d+2;
Writeln('Pascal: ');
Writeln('—Ёб«ЁвҐм ',x);
Writeln('‡**¬Ґ**⥫м ',x1);
x:=x div x1;
Writeln (' x=',x);
if (x<Min) or (x>Max) then
Begin
s1:=inv2+inv3;
Writeln(s1,Min,'..',Max,']!!!');
Writeln(x);
Writeln(inv1);
F:=False;
Exit;
end
end
end;
{----Ѓ«®Є Їа®жҐ¤га а*Ў®вл б ®ЇаҐ¤Ґ«Ґ**л¬ вЁЇ®¬ ¤***ле----}
Procedure Expl; {integer}
Label L1;
begin
Writeln ('===========Integer===========') ;
L1:
InputNumber(a,invAi,intMin,intMax);
InputNumber(b,invBi,intMin,intMax);
InputNumber(c,invCi,intMin,intMax);
InputNumber(d,invDi,intMin,intMax);
if NOT(F(a,b,c,d,intMin,intMax)) then
goto L1;
ai:=a;ci:=c; ddi:=d; bbi:=b;
Lab3I;
Writeln ('ЂбᥬЎ«Ґа: ');
Writeln('—Ёб«ЁвҐ«м ',Numerator);
Writeln('‡**¬Ґ**⥫м ',Denominator);
Writeln(' x=',xl);
End;
Procedure ExpS;
Label L1;
begin
Writeln ('==========Shortint==========');
L1:
InputNumber(a,invAs,ShortMin,ShortMax);
InputNumber(b,invBs,ShortMin,ShortMax);
InputNumber(c,invCs,ShortMin,ShortMax);
InputNumber(d,invDs,ShortMin,ShortMax);
if NOT (F(a,b,c,d,IntMin,IntMax)) then
goto L1;
aS:=a;ccS:=c;ddS:=d;bbS:=b;
Lab3S;
Writeln('ЂбᥬЎ«Ґа: ');
Writeln('—Ёб«ЁвҐ«м ',Numerator);
Writeln('‡**¬Ґ**⥫м ',Denominator);
Writeln(' x=',xl);
End;
{------------------------------------------------------}
Procedure Main;
Var i:Integer;
Begin
Writeln ('‚лзЁб«Ёвм:x=(25/c-d+2)/(b+a*a-1); ');
Repeat
Writeln('ўўҐ¤ЁвҐ ў*и ўлЎ®а Ї*а*¬Ґва®ў a,b,c,d');
Writeln(' 1-integer ');
Writeln(' 2-Shortint');
Writeln(' 3-‚л室');
{$I-}
Readln(i);
{$I+}
Until (IOResult=0);
case i of
1:Expl;
2:ExpS;
3:HALT(0);
else Exit;
end
End;
begin
Repeat
ClrScr;
Main;
Writeln('Џ®ўв®аЁвм? (y/n)');
ch:=ReadKey;
Until (ch='n') or (ch='N');
end.
Прикрепляю фаил с данными. Прошу проверять при максимальных и минимальных значениях, так как при "Обычных" все выполняется верно.
|