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