1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef unsigned int UInt; 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt test_jcxz ( UInt arg ) 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt block[2]; 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown block[0] = arg; 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown block[1] = 0xdeadbeef; 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown __asm__ __volatile__( 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %0,%%ecx\n\t" 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl $0,%%eax\n" 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "0:\n\t" 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "jcxz 1f\n\t" 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "addl $1, %%eax\n\t" 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "subl $1, %%ecx\n\t" 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "jmp 0b\n" 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "1:\n\t" 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %%eax, %1" 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : /*out*/ : /*in*/ "m"(block[0]), 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "m"(block[1]) : /*trash*/ "eax","ecx","cc","memory" 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return block[1]; 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt test_jecxz ( UInt arg ) 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt block[2]; 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown block[0] = arg; 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown block[1] = 0xdeadbeef; 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown __asm__ __volatile__( 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %0,%%ecx\n\t" 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl $0,%%eax\n" 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "0:\n\t" 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "jecxz 1f\n\t" 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "addl $1, %%eax\n\t" 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "subl $1, %%ecx\n\t" 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "jmp 0b\n" 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "1:\n\t" 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %%eax, %1" 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : /*out*/ : /*in*/ "m"(block[0]), 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "m"(block[1]) : /*trash*/ "eax","ecx","cc","memory" 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return block[1]; 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void ) 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt arg = 0x01028374; 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("test_jcxz(0x%x) = 0x%x\n", arg, test_jcxz(arg)); 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("test_jecxz(0x%x) = 0x%x\n", arg, test_jecxz(arg)); 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 55