File: shr_edx.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 (54 lines) | stat: -rw-r--r-- 992 bytes parent folder | download | duplicates (2)
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
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long long int ULong;

ULong data;
ULong result;


extern void shrl32_with_0x10 ( void );
asm("\n"
"shrl32_with_0x10:\n"
"\tpushq %rdx\n"
"\tmovq data, %rdx\n"
"\tshr $0x10, %edx\n"
"\tjne shrl32_with_0x10_jump\n"
"\tshrl32_with_0x10_cont:\n"
"\tmovq %rdx, result\n"
"\tpopq %rdx\n"
"\tret\n"
"\tshrl32_with_0x10_jump:\n"
"\tmov $0xdeaddead, %edx\n"
"\tjmp shrl32_with_0x10_cont\n"
);


int main ( void )
{
  char *p;

  printf("\nshrl 0x10 with unitialised bits\n");
  ULong *notinitialised = malloc(sizeof(ULong)); // Not initialised data.
  data = *notinitialised;
  p = (char*) &data;
  p[0] = 0x11;
  // p[1] = 0x22;
  p[2] = 0x33;
  p[3] = 0x44;

  shrl32_with_0x10();

  printf("non zero jump on p[2..3] 0x%016llx\n", result);

  data = *notinitialised;
  p = (char*) &data;
  p[0] = 0x00;
  // p[1] = 0x00;
  p[2] = 0x00;
  p[3] = 0x00;

  shrl32_with_0x10();

  printf("zero jump on p[2..3] 0x%016llx\n", result);
  return 0;
}