Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Alex163
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 52
1

Переделать функцию на ассемблере на сопроцессор

22.04.2014, 13:29. Просмотров 890. Ответов 1
Метки нет (Все метки)

Подскажите,пожалуйста, как переделать функцию на ассемблере на сопроцессор.
условия: Если а>b: X=(b+5)/(a+1)
Если а=b: X=-b
Если а<b: X=(a-b)/3
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "stdafx.h"
#include "iostream"
#include <fstream>
using namespace std;
int provZ=0; // флаг....если происходит деление на 0, provZ=1
int overflow=0; // флаг....если происходит переполнение, overflow=1
int Proverka(int a,int b)// 
{
    __asm
    {
     mov eax,a;     "<eax>=a"
     cmp eax,-1;    "сравниваем eax c -1"
     jz error;      "если eax=-1 то прыгаем"
     mov ebx,b;     "<ebx>=b"
     cmp ebx,-2;    "сравниваем ebx c -2"
     jz error;      "если ebx=-2 то прыгаем"
     jmp exitt;     "перепрыгиваем метку error"
     error: mov provZ,1;    "присваивает pvovZ=1,то есть у нас произошло деление на 0"
     exitt:         
    }
    return provZ;   //возвращаем значение
}
int main_func(int a,int b)
{int X;
    __asm
    {
         /*2 условие (a=b) */
 
        mov eax,b;      "<eax>=b"
        mov ebx,a;      "<ebx>=a"
        cmp ebx,eax;    "сравнение a и b"
        Jl i_smaller;   "переход на метку по условию a<b"
        Jg i_bigger;    "переход на метку по условию a>b"
        mov eax,0;      "<eax>=0"
        sub eax,b;      "<eax>=-b"
        mov X,eax;      "X=<eax> - итоговый результат"
        jmp exitt;      "переход на метку выхода"
 
i_bigger:       /*1 условие(a>b)*/
        mov eax,b;      "<eax>=b"
        add eax,5;      "<eax>=b+5"
        jo of;          "переход на метку переполнения"
        cdq;            "готовимся к делению"
        mov ebx,a;      "<ebx>=a"
        jo of;          "переход на метку переполнения"
        inc ebx;        "<ebx>=a+1"
        idiv ebx;       "<edx:eax>=b+5/a+1"
        jo of;          "переход на метку переполнения"
        mov X,eax;      "X=<eax> - итоговый результат"
        jmp exitt;      "переход на метку выхода"
 
i_smaller:   /*3 условие (a<b)*/
        mov eax,a;      "<eax>=a"
        mov ebx,b;      "<ebx>=b"
        sub eax,ebx;    "<eax>=a-b"
        jo of;          "переход на метку переполнения"
        xor ebx,ebx;    "<ebx>=0"
        mov ebx,3;      "<ebx>=3"
        cdq;            "<edx:eax>=a-b"
        idiv ebx;       "<eax>=(a-b)/3"
        mov X,eax;      "X=<eax> - итоговый результат"
        jmp exitt;      "переход на метку выхода"
 
of:  mov overflow,1;    "если произошло переполнение то overlow=1"
exitt:
        
    }
    if (overflow !=1)
    {
        std::cout<<"Результат: "<<X<<"\n";
        return X;
    }
    else
    std::cout<<"Переполнение!";
};
int _tmain(int argc, _TCHAR* argv[])
{   setlocale(LC_ALL,"Rus");
    cout<<"В программе реализуется вычисление функции по заданным значениям a,b которые находятся в файле 1.txt"<<endl;
   cout<<"Если а>b: X=(b+5)/(a+1) "<<endl;
   cout<<"Если а=b: X=-b "<<endl;
   cout<<"Если а<b: X=(a-b)/3 "<<endl;
   system("pause");
    int a,b;
    
ifstream F;
F.open ("1.txt",ios::in);
ofstream R;
R.open ("2.txt",ios::out);
F>>a>>b;
    Proverka(a,b);
    if (provZ!=1)
        R<<main_func(a,b);
    else cout<<"Деление на ноль!"<<endl;
    system("pause");
    F.close();
    R.close();
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2014, 13:29
Ответы с готовыми решениями:

переделать на ассемблере
Здравствуйте, нужно переделать простенькую программу с паскаля на ассемблер...

Используя соглашение stdcall вызвать функцию на ассемблере
надо используя соглашения stdcall вызвать функцию на ассемблере и используя...

сопроцессор
Вообще есть такое: {Вычислить заданное смешанное арифметическое выражение для...

Сопроцессор
Люди, помогите пожалуйста! Как скопировать значение из St(0) в St(1) в...

Сопроцессор 8087
Народ, подскажите, есть ли в сопроцессоре 87 какие-то логические команды типа...

1
Mikl___
Автор FAQ
13303 / 6376 / 629
Регистрация: 11.11.2010
Сообщений: 11,536
22.04.2014, 13:49 2
Лучший ответ Сообщение было отмечено Alex163 как решение

Решение

Alex163,
там нет ничего сложного, прочитай http://www.cyberforum.ru/assembler-articles/thread1005284.html http://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow "Глава 11. ДОПОЛНИТЕЛЬНЫЕ АРИФМЕТИЧЕСКИЕ КОМАНДЫ" и переделай под сопроцессор самостоятельно, для твоих вычислений будут использоватся команды: fild (загрузить в FPU целое число), fiadd (целочисленное сложение), fisub (целочисленное вычитание), fidiv (целочисленное деление), fistp (выгрузить из FPU целочисленный результат)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2014, 13:49

Математический сопроцессор
Существуют команды сопроцессора, которые принимают из памяти в регистры или...

Математический сопроцессор
Доброго времени суток. Подскажите пожалуйста, как работать с математическим...

Арифметический сопроцессор
в программе ошибки.неправильно подсчитывается мат.ожидание помогите исправить....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru