C 程序中的 AT&T 汇编语法(GCC 编译器)?

AT&T Assembly Syntax in C program (GCC compiler)?

我有以下程序(AT&T 程序集语法),如果我在 Windows x86 上用 GCC 编译器编译它,它可以独立运行:

LC0:
    .ascii "Hello, world![=10=]"
.globl  _main
_main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    , %esp
    call    ___main
    movl    $LC0, (%esp)
    call    _puts
    movl    [=10=], %eax
    leave
    ret

这个简单的程序可以用C程序执行吗?我尝试了以下内容:

#include <stdlib.h>

int main()
{

    __asm__ ("LC0:\n\t"
             ".ascii 'Welcome Message[=11=]'\n\t"
             "LC1:\n\t"
             ".ascii 'Hello[=11=]'\n\t"
             "_main:\n\t"
             "LFB11:\n\t"
             "leal  4(%esp), %ecx\n\t"
             "andl  $-16, %esp\n\t"
             "pushl -4(%ecx)\n\t"
             "pushl %ebp\n\t"
             "movl  %esp, %ebp\n\t"
             "pushl %ecx\n\t"
             "subl  , %esp\n\t"
             "call  ___main\n\t"
             "movl  , 12(%esp)\n\t"
             "movl  $LC0, 8(%esp)\n\t"
             "movl  $LC1, 4(%esp)\n\t"
             "movl  [=11=], (%esp)\n\t"
             "call  _MessageBoxA@16\n\t"
             "subl  , %esp\n\t"
             "movl  [=11=], %eax\n\t"
             "movl  -4(%ebp), %ecx\n\t"
             "leave\n\t"
             "leal  -4(%ecx), %esp\n\t"
             "ret\n\t");


    return 0;

}

我得到一个错误:

错误:行尾有乱码,第一个无法识别的字符是“8”

这很好用:

__asm__(
"LC0:\n"
"    .ascii \"Hello, world!\0\"\n"
".globl  _main\n"
"_main:\n"
"    pushl   %ebp\n"
"    movl    %esp, %ebp\n"
"    andl    $-16, %esp\n"
"    subl    , %esp\n"
"    call    ___main\n"
"    movl    $LC0, (%esp)\n"
"    call    _puts\n"
"    movl    [=10=], %eax\n"
"    leave\n"
"    ret\n"
);

简单的 C 字符串文字转义双引号字符串和 's/^/"/;s/$/\n"/' 其他地方。

我的 gcc 汇编器不接受单引号字符串文字,如

LC0:
    .ascii 'Hello, world![=11=]'
.globl  _main
_main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    , %esp
    call    ___main
    movl    $LC0, (%esp)
    call    _puts
    movl    [=11=], %eax
    leave
    ret

所以我不明白为什么如果您通过 __asm__ 提供它们,它应该开始接受它们。