Встроенный ассемблер для использования с общеязыковой средой выполнения Visual Studio 2017 - PullRequest
1 голос
/ 06 января 2020

Редактировать: Многие пользователи рекомендовали мне заметки для C#. Но это CPP общеязыковая среда выполнения. И я использую формы, поэтому тот, кто говорит, что это не имеет ничего общего с формами, ошибается.

Here is the screnshot showing you what I'm doing with CPP and forms Here is how I built the CPP project (NOT C#) Here's how I added the form to my CPP project

Итак, я снова ищу встроенный ассемблер с общеязыковой средой исполнения (CLR), использующей C ++, а не C#.

Я пытаюсь реплицировать программа из моего учебника. Это было кропотливо тяжело, и теперь я столкнулся с другим препятствием, которое не описано в книге: CLR, похоже, не нравится мой встроенный ассемблер. Что-то связанное с управляемой и неуправляемой памятью. Я не знаю, я немного над головой. Я хотел просто иметь возможность запустить программу, чтобы воспроизвести этот глупый пример в моей книге, но я часами пытался сгладить все изгибы. Заранее спасибо. Также, пожалуйста, воздержитесь от любых советов относительно того, как я должен использовать C# для этого. Урок датирован, и я ничего не могу с этим поделать. Я учусь в EE, и до этого у меня было всего два курса программирования. Thx.

Вот отрывки программы из учебника: https://imgur.com/cGsI7x5 https://imgur.com/dDjgWUF

namespace Ch8P19 {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;





    /// <summary>
    /// Summary for MyForm
    /// </summary>
    public ref class MyForm : public System::Windows::Forms::Form
    {
    public:
        MyForm(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~MyForm()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::TextBox^  textBox1;
    private: System::Windows::Forms::TextBox^  textBox2;
    protected:

    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;

//#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            this->textBox1 = (gcnew System::Windows::Forms::TextBox());
            this->textBox2 = (gcnew System::Windows::Forms::TextBox());
            this->SuspendLayout();
            // 
            // textBox1
            // 
            this->textBox1->Location = System::Drawing::Point(80, 72);
            this->textBox1->Name = L"textBox1";
            this->textBox1->Size = System::Drawing::Size(100, 22);
            this->textBox1->TabIndex = 0;
            this->textBox1->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &MyForm::textbox1_KeyDown);
            this->textBox1->KeyPress += gcnew System::Windows::Forms::KeyPressEventHandler(this, &MyForm::textbox1_KeyPress);
            // 
            // textBox2
            // 
            this->textBox2->Location = System::Drawing::Point(80, 144);
            this->textBox2->Name = L"textBox2";
            this->textBox2->Size = System::Drawing::Size(100, 22);
            this->textBox2->TabIndex = 1;
            // 
            // MyForm
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(282, 253);
            this->Controls->Add(this->textBox2);
            this->Controls->Add(this->textBox1);
            this->Name = L"MyForm";
            this->Text = L"MyForm";
            this->Load += gcnew System::EventHandler(this, &MyForm::formload);
            this->ResumeLayout(false);
            this->PerformLayout();

        }

//#pragma endregion








            //EXAMPLE 8–15

        int Filter(char key)
        {
            int retval;
            _asm
            {
                mov eax, 1
                cmp key, 8; backspace
                je good
                cmp key, 30h
                jb bad
                cmp key, 39h
                jbe good
                cmp key, 41h
                jb bad
                cmp key, 46h
                jbe good
                cmp key, 61h
                jb bad
                cmp key, 66h
                jbe good
                good : dec al
                bad : mov retval, eax
            }
            return retval;
        }

        int Converts(int number, short digit)
        {
            _asm
            {
                mov eax, number
                shl eax, 4
                mov dx, digit
                sub dx, 30h
                cmp dx, 9
                jbe later
                sub dx, 7
                later: or al, dl
                mov number, eax
            }
            return number;
        }



    private: System::Void formload(System::Object^  sender, System::EventArgs^  e)
    {
        textBox1->Focus(); // set Focus to textbox1
    }
             bool keyHandled;

    private: System::Void textbox1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e)
    {

        keyHandled = Filter(e->KeyValue);
    }

    private: System::Void textbox1_KeyPress(System::Object^  sender,
        System::Windows::Forms::KeyPressEventArgs^  e)
    {
        if (e->KeyChar >= 'a' && e->KeyChar <= 'f')
        {
            e->KeyChar -= 32;
        }
        else if (e->KeyChar == 13)
        {
            int number = 0;
            for (int a = 0; a < textBox1->Text->Length; a++)
            {
                number = Converts(number, textBox1->Text[a]);
            }
            textBox2->Text = Convert::ToString(number);
            keyHandled = true;
        }
        e->Handled = keyHandled;
    }



    };



}

ОШИБКИ:

1>------ Build started: Project: Ch8P19, Configuration: Debug Win32 ------
1>MyForm.cpp
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(148): error C3644: 'Ch8P19::MyForm::Filter': cannot compile the function to generate managed code
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(148): note: Inline native assembly not supported in managed code
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(169): error C3821: 'int Ch8P19::MyForm::Filter(char)': managed type or function cannot be used in an unmanaged function
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(169): note: Inline native assembly not supported in managed code
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(145): error C3645: 'Ch8P19::MyForm::Filter': __clrcall cannot be used on functions compiled to native code
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(173): error C3644: 'Ch8P19::MyForm::Converts': cannot compile the function to generate managed code
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(173): note: Inline native assembly not supported in managed code
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(186): error C3821: 'int Ch8P19::MyForm::Converts(int,short)': managed type or function cannot be used in an unmanaged function
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(186): note: Inline native assembly not supported in managed code
1>c:\users\trent\source\repos\ch8p19\ch8p19\myform.h(171): error C3645: 'Ch8P19::MyForm::Converts': __clrcall cannot be used on functions compiled to native code
1>Done building project "Ch8P19.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
...