>Решил я скомпилить и запустить один свой тестик - проверяет максимальную пропускную
>способность памяти... и столкнулся с одним неприятным багом - в
>gcc используется что-то отличное от asm & _asm... Вот код, который
>я портирую с MS VC++:
>_check_MMX_SSE::_check_MMX_SSE()
>{
> _IsMMX = false;
> _IsSSE = false;
>
> asm
> {
> pusha;
> mov eax, 1;
> cpuid;
> bt edx, 32;
> jnc near _exitSSE;
> mov _IsSSE, 1;
>_exitSSE:
> bt edx, 23;
> jnc near _exitMMX;
> mov _IsMMX, 1;
>_exitMMX:
> popa;
> };
>}
>
>ругань происходит на строке с cpuid и строке после asm, затем ему
>не нравиться строка с bt edx,32 - говорит, что не знает
>о наличие edx, т.е., возможно, в gcc по другому щзадаётся assembly-inline?
>как это сделать? Может надо писать на AT&T assembly? И есть
>ли сразу в gcc 2.95 поддержка SSE & MMX?
Прежде всего - инлайн ассемблер в gcc использует моторола-вский синтаксис, да и вызывается по другому - читайте доки. Если хотите использовать tasm/masm стиль в Unix, то можно скачать NASM. И в этом случае я бы, например, сделал так:
1. файл check_mmx.asm
-------------------------
extern _IsSSE
extern _IsMMX
global _check_mmx_sse
_check_mmx_sse:
pusha
mov eax, 1
cpuid
bt edx, 32
jnc near _exitSSE
mov word [_IsSSE], 1
_exitSSE:
bt edx, 23;
jnc near _exitMMX
mov word [_IsMMX], 1
_exitMMX:
popa
ret
-----------------------------
Компилим его NASM-ом:
nasm -f elf -o check_mmx.o check_mmx.asm
Должен получиться check_mmx.o
2. Файл callasm.c
-------------------------------
extern void _check_mmx_sse();
short _IsMMX = 0;
short _IsSSE = 0;
main() {
_check_mmx_sse();
printf("%i,%i\n",_IsMMX,_IsSSE);
}
----------------------------------
Компилим все:
gcc -o callasm callasm.c check_mmx.o
С использованием классов и C++ немного по другому, но несильно