编译c++;带内联汇编的代码&;英特尔语法与gcc及其实现 我尝试实现C++程序,它从程序的C++部分读取字符串,用内联汇编来处理它(用ASCII表中的数字将所有拉丁符号转换成十六进制表示),并用C++代码打印出来。 我在编译它时遇到了一个问题,我找到了一种没有错误的方法,但是我无法实现它

编译c++;带内联汇编的代码&;英特尔语法与gcc及其实现 我尝试实现C++程序,它从程序的C++部分读取字符串,用内联汇编来处理它(用ASCII表中的数字将所有拉丁符号转换成十六进制表示),并用C++代码打印出来。 我在编译它时遇到了一个问题,我找到了一种没有错误的方法,但是我无法实现它,c++,gcc,assembly,g++,inline-assembly,C++,Gcc,Assembly,G++,Inline Assembly,我试着用以下方法来编译: 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 ./mai

我试着用以下方法来编译:

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
以下是我的程序代码:

#包括
#包括
#包括
#包括
#定义最大长度80
使用名称空间std;
void printWelcomeStr();
int main()
{
字符输入字符串[最大长度];
字符输出字符串[最大长度];
cin.getline(输入字符串,最大长度,'\n');
asm
(
“.intel_语法;”
lea eax,输入\u字符串\n
移动esi,%eax\n
lea eax,输出\u字符串\n
mov%edi,%eax\n
“开始循环:\n”
“lodsb\n”
测试al,al\n
“je退出\n”
“cmp al,41h\n”//>='A'
“jnbe LatinLetterGeneral\n”
“jmp下一步\n”
“常规:\n”
“cmp%al,5Ah\n”//=“a”
“jnbe LatinLetterFinal\n”
“jmp下一步\n”
“LatinLetterFinal:\n”
“cmp al,7Ah\n”//>“z”
“下一步\n”
cmp ax,al\n
子ax,30小时\n
“推送cx\n”
mov cx,2\n
rol dl,4\n
mov ax,300fh\n
和al,dl\n
“aaa\n”
“aad 11h\n”
“pop cx\n”
mov al,di\n
“jmp下一步\n”
“下一步:\n”
“stosb\n”
“jmp开始循环\n”
“退出:\n”
“stosb\n”
);

cout使用
-S
生成一个asm源文件,而不是一个可执行文件。看起来您然后试图将其作为
bash
脚本运行,将每一行视为一个shell命令。不要这样做。

因此我必须删除“-S”标志?但如果我这样做,编译器会给出:'Error:junk'h'after expression'errors。如果我删除引号,它会给出关于'expected string literal before'的错误。GNU汇编程序不接受带有
h
后缀的十六进制。请改用
0x
前缀,即将
5Ah
更改为
0x5A
等等。即使如此,您的代码也不会使用
omfile.GCC内联asm有自己复杂的规则。你真的应该使用一个单独的asm文件。你也有一些零散的
%
前缀。@P.Nikita:如果你使用
-S
,GCC从不尝试将编译器输出提供给汇编程序。它在编译时不会检查内联asm是否有效,它只是将文本替换为y我们的模板。如果你的asm没有汇编,那是一个单独的问题。最好将所有的汇编移到单独的汇编文件中。