1 Востаннє редагувалося Дмитро-Чебурашка (16.06.2016 16:57:29)

Тема: Забажалося створити асемблерну вставку.

Забажалося створити асемблерну вставку. Допоможыть будь ласка!
Кодеблок,  compiler mingw32-g++. exe.

     __asm__ (".intel_syntax noprefix\n\t"
             "movl (%Adresa_dokumenta),%eax\n\t"
             "movl  %eax, (Adresa_Ves_masyva)\n\t" /* ассемблерная вставка*/
           : "=r"(Adresa_dokumenta)           /* выходные операнды */
           : "r"(Adresa_dokumenta)            /* входные операнды */
           : "=c"(Adresa_Ves_masyva)           /* выходные операнды */
           : "c"(Adresa_Ves_masyva)            /* входные операнды */
           : "%eax"            /* разрушаемые регистры */
            );

Pars_utf8.cpp|230|ошибка: expected «)» before «(» token|

Я смутно розумію що я пишу.

2 Востаннє редагувалося ReAl (16.06.2016 23:08:41)

Re: Забажалося створити асемблерну вставку.

Двокрапок може бути максимум три, спочатку йдуть всі вихідні операнди, потім всі вхідні, потім всі порушені.
Звертання до операндів йде по номерах (як у першому фрагменті нижче). Якщо хочете по іменах, то тоді вони задається у квадратних дужках перед визначенням операнда і використовуються теж у квадратних дужках.

Задавати фіксовані регістри є сенс лише коли інакше неможливо, краще завести локальну змінну і прив'язати її до операнда. Компілятор сам вибере для неї регістр, виходячи з того, як у нього зараз розкладається оптимізація, сам врахує, що його вміст змінювався.

#include <stdio.h>

int a=2, b=0;

int main()
{
        int temp;
        printf("a = %d, b=%d\n", a, b);
        __asm__ (
                "movl %2, %1 \n\t"
                "movl %1, %0 \n\t"
                : "=m"(b), "=r"(temp)
                : "m"(a)
        );
        printf("a = %d, b=%d\n", a, b);
        a = 3;
        __asm__ (
                "movl %[a], %[temp] \n\t"
                "movl %[temp], %[b] \n\t"
                : [b]"=m"(b), [temp]"=r"(temp)
                : [a]"m"(a)
        );
        printf("a = %d, b=%d\n", a, b);
}

Отак виглядає вставка при gcc -S

#APP
# 18 "inasm.c" 1
        movl a(%rip), %eax
        movl %eax, b(%rip)

# 0 "" 2
#NO_APP
printf("Nested comments is %s\n", */*/**/"*/"/*"/**/ == '*' ? "OFF" : "ON");

3

Re: Забажалося створити асемблерну вставку.

До речі, в описові аргументів іноді може бути проведено набагаааато ;-)  більше дій, ніж у самому асемблерному рядку

int a=2, b=0;
int arr[10];

// arr[b] = arr[a]
void foo()
{
        __asm__ (
                ""    // Так, так, рядок порожній
                : "=r"(arr[b])
                : "0"(arr[a])
        );
}
foo:
        movl    a, %eax
        movl    b, %edx
        movl    arr(,%eax,4), %eax
        movl    %eax, arr(,%edx,4)
        ret
printf("Nested comments is %s\n", */*/**/"*/"/*"/**/ == '*' ? "OFF" : "ON");