这些汇编寄存器修饰符的用途是什么?

时间:2018-01-17 17:37:54

标签: c gcc x86-64 inline-assembly

我正在使用内联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的

0 个答案:

没有答案