Skip to content

Instantly share code, notes, and snippets.

@iaoedsz2008
Last active February 9, 2023 02:22
Show Gist options
  • Save iaoedsz2008/3467ae891e3ef1172bcae3676fed9c7e to your computer and use it in GitHub Desktop.
Save iaoedsz2008/3467ae891e3ef1172bcae3676fed9c7e to your computer and use it in GitHub Desktop.
gcc style inline assembly code snippets
#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