Last active
February 9, 2023 02:22
-
-
Save iaoedsz2008/3467ae891e3ef1172bcae3676fed9c7e to your computer and use it in GitHub Desktop.
gcc style inline assembly code snippets
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stddef.h> | |
#include <stdint.h> | |
int | |
square(int num) { | |
return num * num; | |
} | |
int | |
main(int argc, char* argv[]) | |
{ | |
constexpr size_t __constant = 0x1111; | |
size_t _in = 0; | |
size_t _out = 0; | |
uint8_t _in8 = 0; | |
uint8_t _out8 = 0; | |
uint16_t _in16 = 0; | |
uint16_t _out16 = 0; | |
uint32_t _in32 = 0; | |
uint32_t _out32 = 0; | |
uint64_t _in64 = 0; | |
uint64_t _out64 = 0; | |
#if defined(__clang__) || defined(__GNUC__) | |
#if defined(__x86_64__) || defined(__i386__) | |
__asm__ __volatile__("" : "=a"(_out)); | |
__asm__ __volatile__("" : "=a"(_out8)); | |
__asm__ __volatile__("" : "=a"(_out16)); | |
__asm__ __volatile__("" : "=a"(_out32)); | |
#if defined(__x86_64__) | |
__asm__ __volatile__("" : "=a"(_out64)); | |
#endif | |
__asm__ __volatile__("" : "=b"(_out)); | |
__asm__ __volatile__("" : "=c"(_out)); | |
__asm__ __volatile__("" : "=d"(_out)); | |
__asm__ __volatile__("" : "=S"(_out)); | |
__asm__ __volatile__("" : "=D"(_out)); | |
__asm__ __volatile__("mov %%cr0, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%cr1, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%cr2, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%cr3, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%cr4, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%cr5, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%cr6, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%cr7, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%dr0, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%dr1, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%dr2, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%dr3, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%dr4, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%dr5, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%dr6, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%dr7, %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %[from], %%cr0" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%cr1" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%cr2" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%cr3" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%cr4" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%cr5" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%cr6" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%cr7" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%dr0" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%dr1" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%dr2" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%dr3" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%dr4" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%dr5" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%dr6" : : [from] "r"(_in)); | |
__asm__ __volatile__("mov %[from], %%dr7" : : [from] "r"(_in)); | |
__asm__ __volatile__("sgdt (%[from])" : : [from] "r"(_in)); | |
__asm__ __volatile__("lgdt (%[from])" : : [from] "r"(_in)); | |
__asm__ __volatile__("sidt (%[from])" : : [from] "r"(_in)); | |
__asm__ __volatile__("lidt (%[from])" : : [from] "r"(_in)); | |
__asm__ __volatile__("sldt (%[from])" : : [from] "r"(_in)); | |
__asm__ __volatile__("lldt (%[from])" : : [from] "r"(_in)); | |
#if defined(__x86_64__) | |
__asm__ __volatile__("mov %%rbp, %[to]" : [to] "=m"(_out)); | |
__asm__ __volatile__("mov %%rsp, %[to]" : [to] "=m"(_out)); | |
#elif defined(__i386__) | |
__asm__ __volatile__("mov %%ebp, %[to]" : [to] "=m"(_out)); | |
__asm__ __volatile__("mov %%esp, %[to]" : [to] "=m"(_out)); | |
#endif | |
__asm__ __volatile__("" : "=@cca"(_out)); | |
__asm__ __volatile__("" : "=@ccae"(_out)); | |
__asm__ __volatile__("" : "=@ccb"(_out)); | |
__asm__ __volatile__("" : "=@ccbe"(_out)); | |
__asm__ __volatile__("" : "=@ccc"(_out)); | |
__asm__ __volatile__("" : "=@cce"(_out)); | |
__asm__ __volatile__("" : "=@ccz"(_out)); | |
__asm__ __volatile__("" : "=@ccg"(_out)); | |
__asm__ __volatile__("" : "=@ccge"(_out)); | |
__asm__ __volatile__("" : "=@ccl"(_out)); | |
__asm__ __volatile__("" : "=@ccle"(_out)); | |
__asm__ __volatile__("" : "=@cco"(_out)); | |
__asm__ __volatile__("" : "=@ccp"(_out)); | |
__asm__ __volatile__("" : "=@ccs"(_out)); | |
__asm__ __volatile__("" : "=@ccna"(_out)); | |
__asm__ __volatile__("" : "=@ccnae"(_out)); | |
__asm__ __volatile__("" : "=@ccnb"(_out)); | |
__asm__ __volatile__("" : "=@ccnbe"(_out)); | |
__asm__ __volatile__("" : "=@ccnc"(_out)); | |
__asm__ __volatile__("" : "=@ccne"(_out)); | |
__asm__ __volatile__("" : "=@ccng"(_out)); | |
__asm__ __volatile__("" : "=@ccnge"(_out)); | |
__asm__ __volatile__("" : "=@ccnl"(_out)); | |
__asm__ __volatile__("" : "=@ccnle"(_out)); | |
__asm__ __volatile__("" : "=@ccno"(_out)); | |
__asm__ __volatile__("" : "=@ccnp"(_out)); | |
__asm__ __volatile__("" : "=@ccns"(_out)); | |
__asm__ __volatile__("" : "=@ccnz"(_out)); | |
__asm__ __volatile__("" : "=a"(_out) : "a"(_in)); | |
__asm__ __volatile__("" : "=r"(_out) : "r"(_in)); | |
__asm__ __volatile__("" : "=r"(_out) : "m"(_in)); | |
__asm__ __volatile__("" : "=r"(_out) : "i"(__constant)); | |
__asm__ __volatile__("call *%[p]" : : [p] "r"((size_t)0x1111)); | |
__asm__ __volatile__("call *(%[p])" : : [p] "r"((size_t)0x1111)); | |
__asm__ __volatile__("call *-8(%[p])" : : [p] "r"((size_t)0x1111)); | |
__asm__ __volatile__("call *%[p]" : : [p] "r"(_in)); | |
__asm__ __volatile__("call *(%[p])" : : [p] "r"(_in)); | |
__asm__ __volatile__("call *-8(%[p])" : : [p] "r"(_in)); | |
__asm__ __volatile__("call *%[p]" : : [p] "m"(_in)); | |
__asm__ __volatile__("call *%[p]" : "=a"(_out) : [p] "r"((size_t)0x1111)); | |
__asm__ __volatile__("call *(%[p])" : "=a"(_out) : [p] "r"((size_t)0x1111)); | |
__asm__ __volatile__("call *-8(%[p])" : "=a"(_out) : [p] "r"((size_t)0x1111)); | |
__asm__ __volatile__("call *%[p]" : "=a"(_out) : [p] "r"(_in)); | |
__asm__ __volatile__("call *(%[p])" : "=a"(_out) : [p] "r"(_in)); | |
__asm__ __volatile__("call *-8(%[p])" : "=a"(_out) : [p] "r"(_in)); | |
__asm__ __volatile__("call %P[callee]" : : [callee] "i"(square),"S"(1),"D"(1)); // 只会生成一条指令 | |
__asm__ __volatile__("jmp *%[p]" : : [p] "r"(_in)); | |
__asm__ __volatile__("jmp *(%[p])" : : [p] "r"(_in)); | |
__asm__ __volatile__("jmp *-8(%[p])" : : [p] "r"(_in)); | |
__asm__ __volatile__("jmp *%[p]" : : [p] "m"(_in)); | |
__asm__ __volatile__("jmp *(%[p])" : : [p] "i"(__constant)); | |
__asm__ __volatile__("mov %%gs:(11), %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%ds:(011), %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%fs:(0x11), %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%cs:(0b11), %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%es:(8), %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("mov %%ss:(8), %[to]" : [to] "=r"(_out)); | |
__asm__ __volatile__("int3"); | |
__asm__ __volatile__("int $3"); | |
__asm__ __volatile__("sti"); | |
__asm__ __volatile__("cli"); | |
__asm__ __volatile__("lsl %[seg], %[to]" : [to] "=r"(_out) : [seg] "m"(_in)); | |
__asm__ __volatile__("lar %[seg], %[to]" : [to] "=r"(_out) : [seg] "m"(_in)); | |
__asm__ __volatile__("ltr %[from]" : : [from] "m"(_in16)); | |
__asm__ __volatile__("str %[to]" : [to] "=r"(_out16)); | |
__asm__ __volatile__("in %[port], %[to]" : [to] "=a"(_in16) : [port] "d"(_in16)); | |
__asm__ __volatile__("out %[from], %[port]" : : [from] "a"(_in16), [port] "d"(_in16)); | |
#endif | |
#if defined(__arm__) | |
#endif | |
#if defined(__aarch64__) | |
#endif | |
#if defined(__riscv) | |
#endif | |
#endif | |
return static_cast<int>(_out); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment