1 2#include <stdio.h> 3 4typedef unsigned long long int ULong; 5 6extern ULong lahf_1 ( void ); 7asm("\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 18extern ULong lahf_0 ( void ); 19asm("\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 30extern ULong sahf_then_lahf ( ULong ); 31asm("\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 40int 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