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