#include <assert.h> #include <stdio.h> #include <stdlib.h> unsigned int do32 ( unsigned int x ) { unsigned int* y = malloc(sizeof(unsigned int)); unsigned int* z = malloc(sizeof(unsigned int)); unsigned int t; assert(y); assert(z); y[0] = x; __asm__ __volatile__( "pushl %0\n\t" "pushl %1\n\t" "popl %%ebx\n\t" "popl %%eax\n\t" "pushl 0(%%eax)\n\t" "popl 0(%%ebx)" : /*OUT*/ : /*IN*/ "r"(y), "r"(z) : /*TRASH*/ "memory", "eax", "ebx" ); t = z[0]; free(y); free(z); return t; } unsigned short do16 ( unsigned short x ) { unsigned short* y = malloc(sizeof(unsigned short)); unsigned short* z = malloc(sizeof(unsigned short)); unsigned short t; assert(y); assert(z); y[0] = x; __asm__ __volatile__( "pushl %0\n\t" "pushl %1\n\t" "popl %%ebx\n\t" "popl %%eax\n\t" "pushw 0(%%eax)\n\t" "popw 0(%%ebx)" : /*OUT*/ : /*IN*/ "r"(y), "r"(z) : /*TRASH*/ "memory", "eax", "ebx" ); t = z[0]; free(y); free(z); return t; } int main ( void ) { printf("do32: 0x%08X\n", do32(0xCafeBabe) ); printf("do16: 0x%08X\n", (unsigned int)do16(0xfeBa) ); return 0; }