c, wstawki asemblerowe, blad kompilacji

0

chce napisac prosta funkcja typu naked ktora wykona mi kilka instrukcji.

stdcall naked int function(char *a){
asm{
mov rax,0
retn 4
}

}

funkcja tworzy sie prawidlowo, problem jest z wstawka. Mam undefined '{'.

O co chodzi? Czy moze z wstawki odwolac sie do zmiennej (a), czy musze klepac [rsp+4]?
chce moc deklarowac w trybie stdcall/fastcall_ia32 i fastcall_ia32e.
da sie to zrobic, czy nie?

2 pytanie, to czy w c mozna sprawdzic carry flag? Jest mi to bardzo potrzebne, nie moge bez tego napisac zadnego algorytmu.
np wykonuje >>, i chce wiedziec czy wlasnie stracilem bit czy nie. Czy jest opcja sh*d?
chcialbym przesunac bity w zmiennej, oraz zkopiowac w miejsce utraconych bity z innej zmiennej. Da sie to zrobic, czy nie?

0

Wstawki przewaznie sie robi w skladni at&t, albo uzywa sie specjalnej flagi przy kompilacji.
To czy jest ta flaga dostepna zalezy od kompilatora, zobacz dokumentacje jak chcesz koniecznie korzystac ze skladni intela we wstawkach, a jak nie chcesz to lap przyklad:

asm(
"movl $0x4,%eax\n"          ; kopiuje wartosc 0x4 do rejestru eax
);

Do operacji shr, shl w c/c++ sie uzywa >> lub <<, np

int cos;
cos = 25;
cos >>= 2;               // podzieli 25 przez 4, poniewaz przesuwasz o potegi dwojki, dla 1 bylo by dzielenie przez 2
0

ok a jak z argumentami? moze uzywac zmiennych c w asm?

<< to shr/shl, a mi zalezy na shrd/shld.

co z carry flag?

0

Zapomnialem, ze chciales jeszcze uzupelniac bity skasowane:

int cos;
cos = 25;
cos <<= 1;         // przesuwamy w lewo, pierwszy bit od prawej jest pusty(0)
cos |= 0x1;         // teraz jest rowny jeden

Operacjami logicznymi robisz takie rzeczy.

0
t0m_k-tmp napisał(a)

Wstawki przewaznie sie robi w skladni at&t
Pod kompilatorami innymi niż GCC też?

0

Mozesz zmiennych uzywac, np. tak, wrzucalem dzis juz ta funkcje :D

void outb(unsigned short port, unsigned short value)
{
    asm volatile ("outb %1, %0" : : "dN" (port), "a" (value));
}

%1 oznacza wartosc, a %0 oznacza port, poniewaz w at&t jest odwrtonie, czyli z lewej na prawa ida dane.
Reszte doczytasz na pewno w dokumencie "inline assembly howto"

0

Zalezy od kompilatora jaka skladnie obsluguje, w kompilatorach borlanda masz intelowska skladnie.

0

kiedys widzialem jakis tutorial, nie pamietam na jaki temat, ale gosciu prowadzacy uzywal bardwo fajnych wstawem ASM w kod c. Kompilatorm byl gcc.

syntax byl intela, zmienne w c byly odwolywane po prostu.
mo mov eax,offset zmienna
czy jakos tak.

nie bylo "" w kazdej linijce.

Oczywoscie wszystko pod windowsem, z wykozystaniem minGW.
Bardzo bym chcial sobie przypomniec co to bylo i jak takie wstawki robic.

A jak ma sie sprawa z CF?
Chce dodac duza liczbe, i brak mi funkcji adc.
chce odjac duza liczbe - brak sbb.

0

GCC pozwala tylko na składnie AT&T we wstawkach, ale chyba nie powinno być problemu użyć jakiegoś zewnętrznego asma np. FASM i łączyć to z kodem C

0
ucho napisał(a)

GCC pozwala tylko na składnie AT&T we wstawkach
Masz pozdrowienia od dyrektywy .intel_syntax noprefix ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1