Вычисление целочисленных выражений
Цель работы: Вычислить заданное целочисленное выражение для исходных данных в знаковых форматах длиной 8 бит ShortInt (signed char), используя арифметические операции ADD, ADC, INC, SUB, SBB, DEC, NEG, IMUL, IDIV, CBW, CWD. Исходные данные должны вводиться с проверкой корректности вводимых символов. Формат результата зависит от специфики решаемого выражения. Входные данные и результат должны быть проверены на область допустимых значений.
Ход работы:
Выражение: (2*с+d-52)/(a/4+1)
Нужно подобрать такие коэффициенты чтобы результат операции было целое число.
c=30
d=2
a=4
Составляем листинг программы на языке TP v 7.1
Листинг программы
Program Lab3P;
Uses CRT;
Var
N : LongInt;
aS, ccS, ddS, k : ShortInt;
xl, D : Integer;
ch : Char;
Begin
Clrscr;
aS:=4;
ddS:=2;
ccS:=30;
ASM
mov aS,4
mov al, aS
CBW
mov k, 4
IDIV k
CBW
INC ax
mov D, ax
mov bx, D
mov ccS, 30
mov al, ccS
mov k, 2
IMUL k
mov cx, ax
mov ddS, 2
mov al, ddS
CBW
add ax, cx
sub ax, 52
CWD
mov WORD PTR N, ax
mov WORD PTR N+2, dx
IDIV bx
mov xl, ax
end;
writeln ('ASSEBLER CODE Function((2*c+d-52)/(a/4+1))=', xl);
writeln ('PASCAL CODE Function((2*c+d-52)/(a/4+1))=', (2*ccS+ddS-52)/(aS/4+1):0:0 );
readkey;
end.
Скриншот:
Вариант программы при которых значения не совпадают
Program Lab3P;
Uses CRT;
Var
N : LongInt;
aS, ccS, ddS, k : ShortInt;
xl, D : Integer;
ch : Char;
Begin
Clrscr;
aS:=1;
ddS:=2;
ccS:=30;
ASM
mov aS,1
mov al, aS
CBW
mov k, 4
IDIV k
CBW
INC ax
mov D, ax
mov bx, D
mov ccS, 30
mov al, ccS
mov k, 2
IMUL k
mov cx, ax
mov ddS, 2
mov al, ddS
CBW
add ax, cx
sub ax, 52
CWD
mov WORD PTR N, ax
mov WORD PTR N+2, dx
IDIV bx
mov xl, ax
end;
writeln ('ASSEBLER CODE Function((2*c+d-52)/(a/4+1))=', xl);
writeln ('PASCAL CODE Function((2*c+d-52)/(a/4+1))=', (2*ccS+ddS-52)/(aS/4+1):0:0 );
readkey;
end.
Вывод: результаты в листинге, полученном при написании программы вычисления значения функции на языке встроенного ассемблера и паскаля получились равными.
Вернутся к заглавию