• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 #include <stdio.h>
3 
4 typedef unsigned long long int ULong;
5 
6 extern ULong lahf_1 ( void );
7 asm("\n"
8 "lahf_1:\n"
9 "\tpushq $0\n"
10 "\tpopfq\n"
11 "\tmovabsq $0xFFFFFFFFFFFFFFFF, %rax\n"
12 "\tmovabsq $0x8765432112345678, %rdx\n"
13 "\tsubq %rax, %rdx\n"
14 "\t.byte 0x9F\n" /* lahf */
15 "\tret\n"
16 );
17 
18 extern ULong lahf_0 ( void );
19 asm("\n"
20 "lahf_0:\n"
21 "\tpushq $0\n"
22 "\tpopfq\n"
23 "\tmovabsq $0x0, %rax\n"
24 "\tmovabsq $0x8765432112345678, %rdx\n"
25 "\tsubq %rax, %rdx\n"
26 "\t.byte 0x9F\n" /* lahf */
27 "\tret\n"
28 );
29 
30 extern ULong sahf_then_lahf ( ULong );
31 asm("\n"
32 "sahf_then_lahf:\n"
33 "\tmovq %rdi, %rax\n"
34 "\t.byte 0x9E\n" /* sahf */
35 "\tmovabsq $0, %rax\n"
36 "\t.byte 0x9F\n" /* lahf */
37 "\tret\n"
38 );
39 
main(void)40 int main ( void )
41 {
42    ULong i;
43    printf("0x%llx\n", lahf_0());
44    printf("0x%llx\n", lahf_1());
45    for (i = 0; i < 255; i++) {
46       ULong x = sahf_then_lahf(i << 8);
47       printf("%llx -> %llx\n", i, x);
48    }
49    return 0;
50 }
51