Mam problem z kompilacją poniższego kodu. Może też zawierać błędy logiczne, proszę o pomoc. Dzięki,

#include <iostream>

using namespace std;

int main()
{
    int shifted_value;
    int value = 2;

    __asm__("shll %%eax,%1;" : "=a" (shifted_value): "a" (value));

    cout<<shifted_value<<endl;

    return 0 ;
}

Błąd:

Błąd: sufiks lub operandy są nieprawidłowe dla `shl'

1
pandoragami 10 lipiec 2011, 11:18

2 odpowiedzi

Najlepsza odpowiedź

Powinien wyglądać

__asm__(("shll %%cl, %%eax;"
            : "=a" (shifted_value)
            : "a" (shifted_value), "c" (value)
           );
3
Jesus Ramos 10 lipiec 2011, 12:53
Shll powinno być OK dla "przesuń długie słowo w lewo". chociaż nie jestem pewien
 – 
jcomeau_ictx
10 lipiec 2011, 11:25
Jestem zaznajomiony tylko z x86, więc może być shll w innym zestawie instrukcji, ale o ile pamiętam, jego shl i shr w x86.
 – 
Jesus Ramos
10 lipiec 2011, 11:26
Cóż, są też shld i shrd dla debla, ale nie sądzę, żeby chciał któryś z nich. Mogę się mylić, chociaż po prostu nigdy nie widziałem
 – 
Jesus Ramos
10 lipiec 2011, 11:27
Mam to działa tak __asm__("shld %%eax, 1;" : "=a" (shifted_value): "a" (wartość)); ale potem się zawiesza.
 – 
pandoragami
10 lipiec 2011, 11:31
1
Jezu, trafiłeś w sedno ze swoją obserwacją, że %eax nie został zainicjowany. +1 za to.
 – 
jcomeau_ictx
10 lipiec 2011, 12:41

Może również działać z shll, ponieważ shll jest mnemonikiem GNU at&t oznaczającym "przesunięcie w lewo długiego słowa". Jednak błąd nieprawidłowego operandu wynika z tego, że operand musi być pierwszy! Dowiedziałem się tego, kiedy wyszukałem te źródła: http://meplayer.googlecode.com/svn-history/r23/trunk/meplayer/src/filters/transform/mpcvideodec/ffmpeg/libavcodec/cabac.h. Skorzystałem również z doskonałego http://www.ibiblio. org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s6

Oto jeden ze sposobów, który działa, biorąc pod uwagę obserwację Jesusa Ramosa, że ​​należy zainicjować wartość shifted_value:

jcomeau@intrepid:/tmp$ cat test.cpp; make test; ./test
#include <iostream>

using namespace std;

int main()
{
    int shifted_value = 1;
    char value = 2;

    __asm__("shll %%cl, %%eax;"
            : "=a" (shifted_value)
            : "a" (shifted_value), "c" (value)
           );

    cout<<shifted_value<<endl;

    return 0 ;
}

g++     test.cpp   -o test
4
3
jcomeau_ictx 10 lipiec 2011, 20:38
Masz trochę racji, ale też nie. Ale kiedy teraz działa, to się zawiesza.
 – 
pandoragami
10 lipiec 2011, 11:32
Notacja at&t zawsze mnie czasem dopada, robiłem za dużo rzeczy na poziomie jądra i x86, o których zwykle zapominam, że operandy są odwrócone w inline asm :\
 – 
Jesus Ramos
10 lipiec 2011, 12:49