带内联汇编的C ++,怎么回事?

时间:2011-04-17 20:05:04

标签: c++ assembly inline-assembly

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

现在问题是:

我想编写一个可以使用简单的Caesar算法加密我的文本的程序。这意味着字母字符成为字母表中的后一个字符,但是我的程序不会在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;
}

我希望没关系,你可以帮助我

3 个答案:

答案 0 :(得分:1)

在没有汇编的情况下,在纯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;

答案 1 :(得分:0)

可能你只想更改角色,如果它真的是一个字母,那么空格和其他角色就会留下来。而且您正在使用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;
}

试着理解这段代码,应该是可能的。

答案 2 :(得分:0)

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

cmp al, 90
jb Großbuchstabe

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

cmp al, 90
jbe Großbuchstabe