0 / 0 / 0
Регистрация: 10.04.2019
Сообщений: 7
1

Вычисление выражения по формуле

10.04.2019, 14:54. Показов 5865. Ответов 14

Author24 — интернет-сервис помощи студентам
Имеется код на паскале со вставкой ассемблера, вычисляющий значение выражения (3a-4c2)/(b-2). Работает он только с "маленькими" числами, дело наверное в регистрах. Нужно чтобы программа работала и с большими числами (к примеру со всеми из диапазона значений Integer):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var a, b, c, r, q, t: integer;
begin
 Write('This program can do the following calculating:(3a-4c^2)/(b-2) just put values');
 writeln('');
 writeLn('a=');
 ReadLn(a);
 write('b=');
 ReadLn(b);
 write('c=');
 ReadLn(c);
  asm
   mov ax,a
   mov cx,3
   mul cx
   mov cx,ax  
   mov ax,c
   imul ax
   mov dx,ax
   mov ax,4
   mul dx
   mov dx,ax 
   sub cx,dx 
   mov dx,b
   sub dx,2 
   mov q,cx
   mov t,dx
  end;
  r := q div t;
  Writeln('Okay, check, your result = ', r, ' delimoe = ', q, ' delitel = ', t);
  Writeln('Program can output only integer result, press any key to end...');
  readln;
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2019, 14:54
Ответы с готовыми решениями:

Вычисление выражения по формуле
программа для вычисления формулы k=(c*b)/(а+b). числа целые со знаком 16-битные.

Вычисление выражения по формуле
Задачка на FASM (a + a + b)2 / (a + b + b) для 8-разрядных чисел со знаком. как это записать в коде...

Вычисление выражения по формуле
SASM программа для вычисления результата и вывода результата в окно вывод Надо получить значение...

Вычисление выражения по формуле.
Составить программу на языке Assembler для вычисления нижеследующего выражения Y= A^2*X-B/C*X+8D...

14
Ушел с форума
Автор FAQ
16276 / 7601 / 1064
Регистрация: 11.11.2010
Сообщений: 13,616
10.04.2019, 15:59 2
(3a-4c2)/(b-2)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   mov ax,a
   mov cx,3
   mul cx
   mov si,ax
   mov di,dx;di:si=3*a
   mov ax,c
   mul ax;dx:ax=c*c
   shld dx,ax,2
   shl ax,2;dx:ax=4*c*c
   sub si,ax
   sbb di,dx;si:di=3*a-4*c*c
   mov cx,b
   sub cx,2
   mov ax,si
   mov dx,di
   div cx; ax=(3a-4c*c)/(b-2)
0
0 / 0 / 0
Регистрация: 10.04.2019
Сообщений: 7
10.04.2019, 16:15  [ТС] 3
в 8 строке ошибку выдает
0
Ушел с форума
Автор FAQ
16276 / 7601 / 1064
Регистрация: 11.11.2010
Сообщений: 13,616
10.04.2019, 17:07 4
AlbertKukowsky,
твой Паскаль настроен на генерацию команд для микропроцессора 8086, посмотри как его настроить на генерацию кода для процессоров 286 или 386
Прочитай про директиву {$G+}
0
0 / 0 / 0
Регистрация: 10.04.2019
Сообщений: 7
10.04.2019, 17:19  [ТС] 5
Работаю в Borland'e, нагуглил как включить 286 инструкции, но проблема сохранилась
0
Ушел с форума
Автор FAQ
16276 / 7601 / 1064
Регистрация: 11.11.2010
Сообщений: 13,616
10.04.2019, 17:35 6
AlbertKukowsky,
гугли дальше, я не выкладываю неработающие программы
0
0 / 0 / 0
Регистрация: 10.04.2019
Сообщений: 7
10.04.2019, 19:53  [ТС] 7
Mikl___ , запустил в Лазарусе, выдает неверные результаты

Добавлено через 2 часа 11 минут
точнее, выводит один и тот же ответ при любых входных значениях
0
6767 / 2737 / 384
Регистрация: 17.02.2013
Сообщений: 4,045
10.04.2019, 20:29 8
Лучший ответ Сообщение было отмечено AlbertKukowsky как решение

Решение

Да что-то вроде такого :
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
asm
 mov ax,c
 imul ax    ;c^2
 shl ax,1
 rcl dx,1   ;2c^2
 shl ax,1
 rcl dx,1   ;4c^2
 mov bx,ax
 mov cx,dx
 mov ax,a
 mov dx,3
 imul dx    ;3a
 sub ax,bx
 sbb dx,cx  ;3a-4c^2
 mov cx,b
 dec cx     ;b-1
 dec cx     ;b-2
 mov q,ax   ;по идее переменная должна быть LongInt
 mov t,cx
 idiv cx    ;(3a-4c^2)/(b-2)
 mov r,ax
end ;
Добавлено через 4 минуты
Цитата Сообщение от Mikl___ Посмотреть сообщение
div cx; ax=(3a-4c*c)/(b-2)
У него там переменные Integer, так-что надо бы знаковыми imul idiv оперировать.
1
0 / 0 / 0
Регистрация: 10.04.2019
Сообщений: 7
10.04.2019, 20:34  [ТС] 9
Забавно, три раза запустил с одинаковым набором входных значений и три разных ответа
0
6767 / 2737 / 384
Регистрация: 17.02.2013
Сообщений: 4,045
10.04.2019, 21:29 10
Забавно, я запустил свою вставку и она идеально работает. Если она у тебя чудачит, то дело не в ней, а в том, что ты на Паскале вокруг нее наваял. Показывай исходник.
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
10.04.2019, 22:01 11
AlbertKukowsky, попробуйте самой первой строчкой добавить директиву
{$mode TP} или {$mode FPC}.

Да и разговор о вашей компиляции бесполезен - вы не предоставили исходник с ошибкой.
0
0 / 0 / 0
Регистрация: 10.04.2019
Сообщений: 7
10.04.2019, 23:09  [ТС] 12
Цитата Сообщение от Ethereal Посмотреть сообщение
что ты на Паскале вокруг нее наваял
Вот

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var a, b, c, r, q, t: integer;
begin
 Write('This program can do the following calculating:(3a-4c^2)/(b-2) just put values');
 writeln('');
 writeLn('a=');
 ReadLn(a);
 write('b=');
 ReadLn(b);
 write('c=');
 ReadLn(c);
asm
 mov ax,c
 imul ax
 shl ax,1
 rcl dx,1
 shl ax,1
 rcl dx,1
 mov bx,ax
 mov cx,dx
 mov ax,a
 mov dx,3
 imul dx
 sub ax,bx
 sbb dx,cx
 mov cx,b
 dec cx
 dec cx
 mov q,ax
 mov t,cx
 idiv cx
 mov r,ax
end ;
  Writeln('Okay, check, your result = ', r, ' delimoe = ', q, ' delitel = ', t);
  Writeln('Program can output only integer result, press any key to end...');
  readln;
end.
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
10.04.2019, 23:36 13
Прогон даёт идентичные результаты.
Добавьте в начале программы строки
Pascal
1
2
3
4
5
6
7
8
{$ifdef FPC}               {если применяется компилятор Free Pascal}
  {$smartlink on}          {для уменьшения размера скомпилированного файла}
  {$ifdef Win32}
    {$AppType Console}     {тип приложения - консольное  }
  {$endif}
  {$asmmode intel}
  {$mode TP}
{$endif}
1
0 / 0 / 0
Регистрация: 10.04.2019
Сообщений: 7
16.04.2019, 13:01  [ТС] 14
Цитата Сообщение от Ethereal Посмотреть сообщение
Да что-то вроде такого :
Помечаю, как ответ, но я заменил все
регистры на 32-битные
0
6767 / 2737 / 384
Регистрация: 17.02.2013
Сообщений: 4,045
16.04.2019, 22:44 15
А какой компилятор Паскаль у тебя тогда ? Ты-ж нигде не сказал. В первом сообщении топика был исходник для Turbo/Borland Pascal, а у него переменные integer 16-битные.
0
16.04.2019, 22:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2019, 22:44
Помогаю со студенческими работами здесь

Вычисление выражения по формуле.
Доброго времени суток! Необходимо выполнить данные действия на ассемблере, заранее спасибо! Х= 6...

Вычисление выражения по формуле
Написать программу, вычисляющую значение переменной R при указанных значениях. R=x+y-z, где...

Вычисление выражения по формуле Ax(B)^D
На языке ассемблера составить программу, производящую арифметические действия над числами А и В...

Вычисление выражения по формуле
Помогите пожалуйста есть задание A^B|C^D , нужно вывести число в BIN пытаюсь вывести число в BIN...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru