Синтаксис сборки AT & T в программе на Си (компилятор GCC)? - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть следующая программа (синтаксис сборки AT & T), которая прекрасно работает сама по себе, если я скомпилирую ее с помощью компилятора GCC в Windows x86:

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

Может ли эта простая программа выполняться в программе на Си? Я пробовал со следующим:

#include <stdlib.h>

int main()
{

    __asm__ ("LC0:\n\t"
             ".ascii 'Welcome Message\0'\n\t"
             "LC1:\n\t"
             ".ascii 'Hello\0'\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  $20, %esp\n\t"
             "call  ___main\n\t"
             "movl  $1, 12(%esp)\n\t"
             "movl  $LC0, 8(%esp)\n\t"
             "movl  $LC1, 4(%esp)\n\t"
             "movl  $0, (%esp)\n\t"
             "call  _MessageBoxA@16\n\t"
             "subl  $16, %esp\n\t"
             "movl  $0, %eax\n\t"
             "movl  -4(%ebp), %ecx\n\t"
             "leave\n\t"
             "leal  -4(%ecx), %esp\n\t"
             "ret\n\t");


    return 0;

}

Я получаю одну ошибку:

Ошибка: мусор в конце строки, первый нераспознанный символ - `8 '

1 Ответ

0 голосов
/ 11 ноября 2018

Это прекрасно работает:

__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    $16, %esp\n"
"    call    ___main\n"
"    movl    $LC0, (%esp)\n"
"    call    _puts\n"
"    movl    $0, %eax\n"
"    leave\n"
"    ret\n"
);

Просто C-string-literal-экранировал строку в двойных кавычках и 's/^/"/;s/$/\\n"/' в другом месте.

Ассемблер моего gcc не принимает строковые литералы в одинарных кавычках, как в

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

поэтому я не понимаю, почему он должен начать принимать их, если вы поставите их через __asm__.

...