Исключение System.Drawing.dll

Делаю калькулятор на Windovs Forms в VS 2010. Задача в том, чтобы сделать вычислительные команды на Ассемблере. Для этого использую математический сопроцессор. После нажатия на "=" появляется ответ, но если курсор убрать с кнопки, то приложение сразу крашится и вылетает с таким исключением:

"Необработанное исключение типа "System.Runtime.InteropServices.ExternalException" произошло в System.Drawing.dll Дополнительные сведения: В GDI+ возникла ошибка общего вида."

Скорее всего проблема в сопроцессоре, если делать без него, то все ок.

Код:

// Kursovaya.cpp: главный файл проекта.

#include "stdafx.h"
#include "Form1.h"

using namespace Kursovaya;

[STAThreadAttribute]
int main()
{
    // Включение визуальных эффектов Windows XP до создания каких-либо элементов управления
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 

    // Создание главного окна и его запуск
    Application::Run(gcnew Form1());

    
}

Фрагмент кода, отвечающий за обработку нажатия на "="

private: System::Void button21_Click_1(System::Object^  sender, System::EventArgs^  e) {
           double res;
           b=System::Convert::ToDouble(textBox1->Text);
         
         
        switch(actions){
            case 1:
                   // res=one(a,b);
                    
                    textBox1->Text = System::Convert::ToString(one(a,b));
                    textBox2->Clear();
                    break;
            case 2:
                   
                    //result = a - b;
                    textBox1->Text = System::Convert::ToString(two(a,b));
                    textBox2->Clear();
                    break;
            case 3:
                   
                    result = a * b;
                    textBox1->Text = System::Convert::ToString(result);
                    textBox2->Clear();
                    break;
            case 4:
                    
                    result = a / b;
                    textBox1->Text = System::Convert::ToString(result);
                    textBox2->Clear();
                    break;
 
            default:
               break;
        }
        }

Код Ассемблера P.S. Знаю, что в .h файле код нельзя писать, позже исправлю.

#include <math.h>
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h >
#ifndef ONE_H
#define ONE_H

double one(float a, float b) {
    double result;
    _asm{
        
        FLD a
        FLD b
        FADD st(0), st(1)
        FST result
    }
    
    return result;
}
#endif ONE_H

Ответы (1 шт):

Автор решения: Gry

Все оказалось намного проще, чем кажется, нужно просто освободить стек и добавить две строки кода

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include "StdAfx.h"
#include "one.h"

double one(double a, double b) {
    double result;
    _asm{
        
        fld a
        fld b
        fadd st(0),st(1)
        fst result
        FFREE ST(0)
        FFREE ST(1)
    }
    
    return result;
}
→ Ссылка