LINUX.ORG.RU

(gas) помогите с асмом


0

0

unsigned char val;
      asm( "pushl %edx\n\tpushl %eax\n\trdtsc" );
      asm( "movb %%al, %0" : "=r" (val) );
      asm( "popl %eax\n\tpopl %edx" );
почему-то виснет, я видимо чего-то недопонимаю. rdtsc изменяет edx,eax, я беру младший байт (для генератора случайных чисел), но оно виснет. В сгенерированном коде какая-то чушь (project.s):

	pushl	%ebp
	movl	%esp, %ebp
	subl	$16, %esp
	movb	$0, -1(%ebp)
#APP
	pushl %edx
	pushl %eax
	rdtsc
	movb %al, %al
#NO_APP
	movb	%al, -1(%ebp)
#APP
	popl %eax
	popl %edx
#NO_APP
	movzbl	-1(%ebp), %eax
	leave
	ret

Keep it simple....


#define rdtsc(low,high) \
     __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))

;)

По поводу кода :

      asm( "pushl %edx\n\tpushl %eax\n\trdtsc" );
      asm( "movb %%al, %0" : "=r" (val) );
      asm( "popl %eax\n\tpopl %edx" );

      ^^^^^^ТАК ДЕЛАТЬ НЕЛЬЗЯ!!!!

_никогда_ не пиши раздельно(как внизу). Или используй volatile . Компилятор сам позаботится о сохранении регистров.

asm( "pushl %edx\n\tpushl %eax\n\trdtsc" );
... some shit....
asm( "popl %eax\n\tpopl %edx" );
^^^ так не делай!

xnix ★★
()
Ответ на: комментарий от xnix

>Чем меньше платформо-зависимого кода, тем лучше.

Согласен с этим утверждением. Но в данном случае все проще. Младший байт edx в регистре dl.

anonymous
()
Ответ на: комментарий от anonymous

Господа!

подскажите пожалуйста где это щас есть необходимость в людях пишущих на асме да и под линукс?

а то мне это дело оччень хотелось бы, но основное направление на работе не позволяет :(

Спасибо!

programmer
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.