File: pushpopmem.c

package info (click to toggle)
valgrind 1%3A3.12.0~svn20160714-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 120,428 kB
  • ctags: 70,855
  • sloc: ansic: 674,645; exp: 26,134; xml: 21,574; asm: 7,570; cpp: 7,567; makefile: 7,380; sh: 6,188; perl: 5,855; haskell: 195
file content (62 lines) | stat: -rw-r--r-- 1,193 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

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