Редактировать: Многие пользователи рекомендовали мне заметки для C#. Но это CPP общеязыковая среда выполнения. И я использую формы, поэтому тот, кто говорит, что это не имеет ничего общего с формами, ошибается.
Итак, я снова ищу встроенный ассемблер с общеязыковой средой исполнения (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 ==========