Jeśli piszesz aplikację, która jest bardzo latency czuły Jakie są granice do osadzania asemblera wewnątrz funkcji C++ (i przy użyciu funkcji C++ zwraca normalnie), tak jak poniżej:Osadzanie asemblera w C++ jest dopuszczalne?
inline __int64 GetCpuClocks()
{
// Counter
struct { int32 low, high; } counter;
// Use RDTSC instruction to get clocks count
__asm push EAX
__asm push EDX
__asm __emit 0fh __asm __emit 031h // RDTSC
__asm mov counter.low, EAX
__asm mov counter.high, EDX
__asm pop EDX
__asm pop EAX
// Return result
return *(__int64 *)(&counter);
}
(Powyższa funkcja pochodziła z inny post SO, który widziałem)
Czy potrafisz leczyć funkcje asemblera, takie jak czarne pudełko? Czy możesz łatwo pobrać wynik z obliczeń wykonanych w asembler? Czy istnieje niebezpieczeństwo, że nie wiesz, jakie zmienne znajdują się obecnie w rejestrach itp.? Czy powoduje więcej problemów, niż rozwiązuje, czy jest dopuszczalne w przypadku określonych małych zadań?
(zakładamy, że architektura ma być stałe i znane)
EDIT Właśnie znalazłem to jest to co ja sugerując:
http://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-C-C
Edit2 ta jest bardziej mającej ku Linux i x86 - to tylko ogólne pytanie C++/asemblera (lub tak myślałem).
Czy pytasz o Visual C++? Przypuszczam, że inne kompilatory mogą mieć inne ograniczenia. –
@ Robᵩ Nope, jeśli cokolwiek celowałem w Linuksa, ICC i G ++. Właśnie chwyciłem pierwszą funkcję asemblera, którą widziałem. – user997112
To może być nieco OT, ale jeśli skok i powrót nie powodują zbyt dużych kar, rozważ napisanie asemblera w czystym asemblerze (w oddzielnej jednostce kompilacji), aby twój kod był bardziej przenośny. Unikając wprowadzania danych, można czasami poprawić opóźnienie dzięki bardziej wydajnemu wykorzystaniu pamięci podręcznej. Jest to jednak ważniejsze na platformach wbudowanych. – psyill