// Define macros for inlining x86 assembly in a compiler-independent way #ifdef _MSC_VER #define ASM1(asm_literal) \ __asm asm_literal #define ASM2(asm_literal1, asm_literal2) \ __asm asm_literal1, asm_literal2 #define ASM3(asm_literal1, asm_literal2, asm_literal3) \ __asm asm_literal1, asm_literal2, asm_literal3 #define ASM_MOV_REG_VAR(register, variable) \ ASM(mov register, variable) #define ASM_MOV_VAR_REG(variable, register) \ ASM(mov variable, register) #elif __GNUC__ || __clang__ #define ASM1(asm_literal) \ ASM_GCC(#asm_literal) #define ASM2(asm_literal1, asm_literal2) \ ASM_GCC(#asm_literal1 ", " #asm_literal2) #define ASM3(asm_literal1, asm_literal2, asm_literal3) \ ASM_GCC(#asm_literal1 ", " #asm_literal2 ", " #asm_literal3) #ifdef __x86_64__ #define ASM_MOV_REG_VAR(register, variable) \ __asm__ __volatile__("movq %0, %%" EXPAND_AND_QUOTE(register) : /* no outputs */ : "m"(variable) : ) #define ASM_MOV_VAR_REG(variable, register) \ __asm__ __volatile__("movq %%" EXPAND_AND_QUOTE(register) ", %0" : "=m"(variable) : /* no inputs */ : ) #else #define ASM_MOV_REG_VAR(register, variable) \ __asm__ __volatile__("mov %0, %%" EXPAND_AND_QUOTE(register) : /* no outputs */ : "m"(variable) : ) #define ASM_MOV_VAR_REG(variable, register) \ __asm__ __volatile__("mov %%" EXPAND_AND_QUOTE(register) ", %0" : "=m"(variable) : /* no inputs */ : ) #endif #define ASM_GCC(asm_string) \ __asm__ __volatile__(".intel_syntax noprefix;" asm_string ";.att_syntax prefix"); \ #endif
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter