带有内联汇编代码的Windows Form App

时间:2019-12-09 15:16:53

标签: c++-cli inline-assembly

我非常困惑和沮丧,我在汇编编程课上,任务是修改教科书中的一个关于我的分配问题的示例。该示例是一个简单的字符串加密器,它使用内联汇编来逐一修改输入字符串中的字符,并将其打印回Windows窗体中的另一个文本框中。

我写的所有内容都与文本中的内容完全一样,没有骰子,Visual Studio不会构建它,并且会抛出大量的构建错误。我不明白自己在做错什么,当我无法实际应用课文中演示的内容时,这令人沮丧。

这是示例代码: Windows Form Data Encryption

这是我在表单设计的一部分.h头文件中拥有的内容:

#pragma once

char EncryptionKey = 0x45;
char Encrypt(char code) 
{
    _asm
    {
        mov a1, code
        xor a1, EncryptionKey
        mov code, a1
        mov a1, EncryptionKey
        inc a1
        and a1, 7fh
        mov EncryptionKey, a1
    }
    return code;
}

namespace TextEncryter {
    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 Form1
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  Encrypt;
    protected: 

    private: System::Windows::Forms::RichTextBox^  richTextBox1;
    private: System::Windows::Forms::RichTextBox^  richTextBox2;
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::Label^  label2;
    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->Encrypt = (gcnew System::Windows::Forms::Button());
            this->richTextBox1 = (gcnew System::Windows::Forms::RichTextBox());
            this->richTextBox2 = (gcnew System::Windows::Forms::RichTextBox());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->label2 = (gcnew System::Windows::Forms::Label());
            this->SuspendLayout();
            // 
            // Encrypt
            // 
            this->Encrypt->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9.75F, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(0)));
            this->Encrypt->Location = System::Drawing::Point(197, 249);
            this->Encrypt->Name = L"Encrypt";
            this->Encrypt->Size = System::Drawing::Size(75, 23);
            this->Encrypt->TabIndex = 0;
            this->Encrypt->Text = L"Encrypt";
            this->Encrypt->UseVisualStyleBackColor = true;
            this->Encrypt->Click += gcnew System::EventHandler(this, &Form1::Encrypt_Click);
            // 
            // richTextBox1
            // 
            this->richTextBox1->Location = System::Drawing::Point(13, 22);
            this->richTextBox1->Name = L"richTextBox1";
            this->richTextBox1->Size = System::Drawing::Size(259, 96);
            this->richTextBox1->TabIndex = 1;
            this->richTextBox1->Text = L"";
            // 
            // richTextBox2
            // 
            this->richTextBox2->Location = System::Drawing::Point(13, 138);
            this->richTextBox2->Name = L"richTextBox2";
            this->richTextBox2->Size = System::Drawing::Size(259, 96);
            this->richTextBox2->TabIndex = 2;
            this->richTextBox2->Text = L"";
            // 
            // label1
            // 
            this->label1->AutoSize = true;
            this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(0)));
            this->label1->Location = System::Drawing::Point(13, 3);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(36, 16);
            this->label1->TabIndex = 3;
            this->label1->Text = L"Input";
            this->label1->Click += gcnew System::EventHandler(this, &Form1::label1_Click);
            // 
            // label2
            // 
            this->label2->AutoSize = true;
            this->label2->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(0)));
            this->label2->Location = System::Drawing::Point(10, 121);
            this->label2->Name = L"label2";
            this->label2->Size = System::Drawing::Size(98, 16);
            this->label2->TabIndex = 4;
            this->label2->Text = L"Encrypted Text";
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(284, 284);
            this->Controls->Add(this->label2);
            this->Controls->Add(this->label1);
            this->Controls->Add(this->richTextBox2);
            this->Controls->Add(this->richTextBox1);
            this->Controls->Add(this->Encrypt);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);
            this->PerformLayout();

        }
#pragma endregion

*private: System::Void Encrypt_Click(System::Object^  sender, System::EventArgs^  e) 
         {
            richTextBox1->Text = "";
            for (int a = 0; a < textBox1->Text->Length; a++)
            {
                richTextBox1->Text += Convert::ToChar(Encrypt(textBox1->Text[a]));
            }
         }*
};
}

我正在使用Visual Studio 2008 Express。当我尝试使用更新版本的Visual Studio时,Windows窗体是基于C#而不是C ++的,我什至无法在2008年之前构建它。抛出的主要错误是:

1>托管代码中不支持嵌入式本机程序集

错误C3862:'加密':无法使用/ clr:pure或/ clr:safe编译非托管函数

C2227:“->文本”的左侧必须指向类/结构/联合/泛型类型 1>类型为“未知类型”

是否可能需要将char Encrypt函数放入属于该项目的.ccp源文件中?任何帮助将不胜感激。

0 个答案:

没有答案