#include <stdio.h> typedef unsigned long long int ULong; extern ULong lahf_1 ( void ); asm("\n" "lahf_1:\n" "\tpushq $0\n" "\tpopfq\n" "\tmovabsq $0xFFFFFFFFFFFFFFFF, %rax\n" "\tmovabsq $0x8765432112345678, %rdx\n" "\tsubq %rax, %rdx\n" "\t.byte 0x9F\n" /* lahf */ "\tret\n" ); extern ULong lahf_0 ( void ); asm("\n" "lahf_0:\n" "\tpushq $0\n" "\tpopfq\n" "\tmovabsq $0x0, %rax\n" "\tmovabsq $0x8765432112345678, %rdx\n" "\tsubq %rax, %rdx\n" "\t.byte 0x9F\n" /* lahf */ "\tret\n" ); extern ULong sahf_then_lahf ( ULong ); asm("\n" "sahf_then_lahf:\n" "\tmovq %rdi, %rax\n" "\t.byte 0x9E\n" /* sahf */ "\tmovabsq $0, %rax\n" "\t.byte 0x9F\n" /* lahf */ "\tret\n" ); int main ( void ) { ULong i; printf("0x%llx\n", lahf_0()); printf("0x%llx\n", lahf_1()); for (i = 0; i < 255; i++) { ULong x = sahf_then_lahf(i << 8); printf("%llx -> %llx\n", i, x); } return 0; }