#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; }