我正在使用内联x86_64程序集查看一些C代码。
在C代码中,我看到了一些带有汇编宏
的全局声明static char *mem = NULL; // Gets malloc()'d before macro is called
static size_t phys = 0;
#define ASM_READ \
asm volatile("xorq %%rax, %%rax\n",
"1:\n"
"movb (%%rcx), %%al\n"
"shl $12, %%rax\n"
"jz 1b\n"
"movq (%%rbx, %%rax, 1), %%rbx\n"
:
: "c"(phys), "b"(mem)
: "rax");
稍后在代码中调用它作为ASM_READ。
我的问题是:如何将rbx加载到mem的地址并且rcx加载了phys的地址?
英特尔IA-64" gcc编译器文档中的机器约束(https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints)列表" b"作为分支机构和" c"作为条件寄存器。不过,我不知道这是怎么强迫mem和phys分别进入rbx和rcx的