#include <stdio.h>
typedef unsigned int UInt;
UInt test_jcxz ( UInt arg )
{
UInt block[2];
block[0] = arg;
block[1] = 0xdeadbeef;
__asm__ __volatile__(
"movl %0,%%ecx\n\t"
"movl $0,%%eax\n"
"0:\n\t"
"jcxz 1f\n\t"
"addl $1, %%eax\n\t"
"subl $1, %%ecx\n\t"
"jmp 0b\n"
"1:\n\t"
"movl %%eax, %1"
: /*out*/ : /*in*/ "m"(block[0]),
"m"(block[1]) : /*trash*/ "eax","ecx","cc","memory"
);
return block[1];
}
UInt test_jecxz ( UInt arg )
{
UInt block[2];
block[0] = arg;
block[1] = 0xdeadbeef;
__asm__ __volatile__(
"movl %0,%%ecx\n\t"
"movl $0,%%eax\n"
"0:\n\t"
"jecxz 1f\n\t"
"addl $1, %%eax\n\t"
"subl $1, %%ecx\n\t"
"jmp 0b\n"
"1:\n\t"
"movl %%eax, %1"
: /*out*/ : /*in*/ "m"(block[0]),
"m"(block[1]) : /*trash*/ "eax","ecx","cc","memory"
);
return block[1];
}
int main ( void )
{
UInt arg = 0x01028374;
printf("test_jcxz(0x%x) = 0x%x\n", arg, test_jcxz(arg));
printf("test_jecxz(0x%x) = 0x%x\n", arg, test_jecxz(arg));
return 0;
}