Скомпилируйте код C ++ с inline-сборкой и синтаксисом Intel с gcc и внедрите его - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь реализовать программу на С ++, которая читает строку из части программы на С ++, обрабатывает ее с помощью встроенной сборки (преобразует все латинские символы в их HEX-представление по номеру в таблице ASCII) и печатает ее с помощью кода на С ++. У меня проблема с компиляцией, я нашел способ сделать это без ошибок, но я не могу это реализовать.

Я пытался скомпилировать это с помощью:

gcc -S -masm=intel code.cpp -o code

Но когда я пытаюсь это реализовать, возникает много таких ошибок:

./main: line 1: .file: command not found
./main: line 2: .intel_syntax: command not found
./main: line 3: .text: command not found
./main: line 4: .section: command not found
./main: line 5: .type: command not found
./main: line 6: .size: command not found
./main: line 7: _ZStL19piecewise_construct:: command not found
./main: line 8: .zero: command not found
./main: line 9: .local: command not found
./main: line 10: .comm: command not found
./main: line 11: .LC0:: command not found

Вот код моей программы:

#include <iostream>
#include <fstream>
#include <clocale>
#include <curses.h>

#define MAX_LENGTH 80

using namespace std;

void printWelcomeStr();

int main()
{
    char input_string[MAX_LENGTH];
    char output_string[MAX_LENGTH];
    cin.getline(input_string, MAX_LENGTH, '\n');
    asm
    (
        ".intel_syntax;"
        "lea eax, input_string\n"
        "mov esi, %eax\n"
        "lea eax, output_string\n"
        "mov %edi, %eax\n"

        "BEGINCYCLE:\n"
        "lodsb\n"
            "test al, al\n"
            "je EXIT\n"

            "cmp al, 41h\n" // >= 'A'
            "jnbe LatinLetterGeneral\n"

            "jmp NEXT\n"

            "LatinLetterGeneral:\n"
                "cmp %al, 5Ah\n" // <= 'Z'
                "jnae LatinLetterFinal\n"
                "cmp al, 61h\n" // >= 'a'
                "jnbe LatinLetterFinal\n"
                "jmp NEXT\n"

            "LatinLetterFinal:\n"
                "cmp al, 7Ah\n" // > 'z'
                "ja NEXT\n"

                "cmp ax, al\n"
                "sub ax, 30h\n"
                "push cx\n"
                "mov cx, 2\n"
                "rol dl, 4\n"
                "mov ax, 300fh\n"
                "and al,dl\n"
                "aaa\n"
                "aad 11h\n"
                "pop cx\n"
                "mov al, di\n"

                "jmp NEXT\n"

            "NEXT:\n"
                "stosb\n"
                "jmp BEGINCYCLE\n"

            "EXIT:\n"
                "stosb\n"
    );

    cout << "\n\nResult:" << endl;
    ofstream file_output("output.txt");
    int i = 0;
    while (output_string[i] != '\0')
    {
        cout << output_string[i];
        file_output << output_string[i];
        i++;
    }
    cout << endl;
    file_output << endl;
    file_output.close();

    getch();
    system("pause");

    return 0;
}

1 Ответ

0 голосов
/ 10 ноября 2019

Использование -S делает исходный файл asm вместо исполняемого. Похоже, вы пытались запустить его как bash скрипт, рассматривая каждую строку как команду оболочки. Не делай этого.

...