C++内联汇编有什么问题吗?

发布于 2024-11-01 18:32:49 字数 1310 浏览 1 评论 0原文

首先,请使用简单的单词,因为我的英语不太好;)

现在的问题是:

我想编写一个程序,可以使用简单的凯撒算法加密我的文本。这意味着字母字符成为字母表中较晚的字符,但我的程序不会从 Z 之后的字母表开头开始。现在的代码:

void Entschlüsseln(char Text[50], int Schlüssel)
{
    char Entschlüsselt[sizeof(Text)];
    for (int x = 0; x < sizeof(Text)-1; x++)
    {
        Entschlüsselt[x] = '\0';
    }
        char Zeichen;
    for (int i = 0; i < sizeof(Text)-1; i++)
    {
        if (Text[i] != '\0')
        {
            Zeichen = Text[i];
            for (int j = 0; j < Schlüssel; j++)
            {
                _asm
                {
                        mov al, Zeichen   
                        cmp al, 90
                        jb Großbuchstabe
                        mov al, Zeichen
                        sub al, 32
                        mov Zeichen, al
                    Großbuchstabe:
                        inc Zeichen
                        mov al, Zeichen
                        cmp al, 90
                        ja Anfang_Alphabet
                        jmp Ende
                    Anfang_Alphabet:
                        mov Zeichen, 65
                    Ende:
                }   
            }
            Entschlüsselt[i] = Zeichen;
        }
    }
    cout << endl << Entschlüsselt;
}

我希望它没问题,你可以帮助我

First please use easy words, as i'm not really good in english ;)

And now the problem:

I wanted to code a program which can encrypt a text of mine with an easy Caesar algorithm. That means that the alphabetic character becomes a later character in the alphabet, but my program does not begin at the beginning of the alphabet after Z. Now the code:

void Entschlüsseln(char Text[50], int Schlüssel)
{
    char Entschlüsselt[sizeof(Text)];
    for (int x = 0; x < sizeof(Text)-1; x++)
    {
        Entschlüsselt[x] = '\0';
    }
        char Zeichen;
    for (int i = 0; i < sizeof(Text)-1; i++)
    {
        if (Text[i] != '\0')
        {
            Zeichen = Text[i];
            for (int j = 0; j < Schlüssel; j++)
            {
                _asm
                {
                        mov al, Zeichen   
                        cmp al, 90
                        jb Großbuchstabe
                        mov al, Zeichen
                        sub al, 32
                        mov Zeichen, al
                    Großbuchstabe:
                        inc Zeichen
                        mov al, Zeichen
                        cmp al, 90
                        ja Anfang_Alphabet
                        jmp Ende
                    Anfang_Alphabet:
                        mov Zeichen, 65
                    Ende:
                }   
            }
            Entschlüsselt[i] = Zeichen;
        }
    }
    cout << endl << Entschlüsselt;
}

i hope it's ok and you can help me

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

青衫儰鉨ミ守葔 2024-11-08 18:32:49

这在纯 C++ 中更容易实现,无需汇编。

Zeichen = tolower(Text[i]);
Zeichen += Schlussel; // Note, the C++ standard does not guarantee that non-ASCII characters such as U-umlaut are allowed in identifiers
if (Zeichen > 'Z') Zeichen -= 26;
Entschlusselt[i] = Zeichen;

This would be much easier to implement in pure C++, without assembly.

Zeichen = tolower(Text[i]);
Zeichen += Schlussel; // Note, the C++ standard does not guarantee that non-ASCII characters such as U-umlaut are allowed in identifiers
if (Zeichen > 'Z') Zeichen -= 26;
Entschlusselt[i] = Zeichen;
拥抱影子 2024-11-08 18:32:49

也许您只想更改字符(如果它确实是字母),以便保留空格和其他字符。而且您使用的是 C++,因此使用 std::string 而不是 char[] 更容易。

#include <iostream>
#include <string>

using std::string;

void caesar_encode(std::string &text, int schluessel) {

  for (size_t i = 0; i < text.length(); i++) {
    char zeichen = text[i];

    int buchstabe = -1; // -1 == unbekannt, 0 = a, 1 = b, ... 25 = z
    if ('A' <= zeichen && zeichen <= 'Z') {
      buchstabe = zeichen - 'A';
    } else if ('a' <= zeichen && zeichen <= 'z') {
      buchstabe = zeichen - 'a';
    }

    char codiertes_zeichen = zeichen;
    if (buchstabe != -1) {
      int codierter_buchstabe = (buchstabe + schluessel) % 26;
      char alphabet_anfang = zeichen - buchstabe; // 'A' oder 'a'
      codiertes_zeichen = alphabet_anfang + codierter_buchstabe;
    }

    text[i] = codiertes_zeichen;
  }
}

int main() {
  string s("Hallo, Welt");
  caesar_encode(s, 13);
  std::cout << s << "\n";
  return 0;
}

只要尝试理解这段代码,应该是可以的。

Probably you only want to change the character if it is really a letter, so that space and other characters stay. And you are using C++, therefore it is easier to work with a std::string instead of a char[].

#include <iostream>
#include <string>

using std::string;

void caesar_encode(std::string &text, int schluessel) {

  for (size_t i = 0; i < text.length(); i++) {
    char zeichen = text[i];

    int buchstabe = -1; // -1 == unbekannt, 0 = a, 1 = b, ... 25 = z
    if ('A' <= zeichen && zeichen <= 'Z') {
      buchstabe = zeichen - 'A';
    } else if ('a' <= zeichen && zeichen <= 'z') {
      buchstabe = zeichen - 'a';
    }

    char codiertes_zeichen = zeichen;
    if (buchstabe != -1) {
      int codierter_buchstabe = (buchstabe + schluessel) % 26;
      char alphabet_anfang = zeichen - buchstabe; // 'A' oder 'a'
      codiertes_zeichen = alphabet_anfang + codierter_buchstabe;
    }

    text[i] = codiertes_zeichen;
  }
}

int main() {
  string s("Hallo, Welt");
  caesar_encode(s, 13);
  std::cout << s << "\n";
  return 0;
}

Just try to understand this code, it should be possible.

沐歌 2024-11-08 18:32:49

我认为错误的代码是这一行:

cmp al, 90
jb Großbuchstabe

由于 90(在 ASCII 中是 Z)是 Großbuchstabe,因此您不应该从中减去 32。做到:

cmp al, 90
jbe Großbuchstabe

I think the wrong code is this line:

cmp al, 90
jb Großbuchstabe

Since 90 (which in ASCII is a Z) is a Großbuchstabe, you should not subtract 32 from it. Make it:

cmp al, 90
jbe Großbuchstabe
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文