对于i386架构,uclibc中与syscall相关的asm代码的含义是什么

时间:2014-02-12 11:28:31

标签: assembly i386 uclinux

#define INLINE_SYSCALL(name, nr, args...) \
  ({                                          \
    unsigned int resultvar;                           \
    asm volatile (                                \
    LOADARGS_##nr                                 \
    "movl %1, %%eax\n\t"                              \
    "int $0x80\n\t"                               \
     RESTOREARGS_##nr                                 \
    : "=a" (resultvar)                                \
    : "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc");              \
   if (resultvar >= 0xfffff001)                       \
     {                                        \
        __set_errno (-resultvar);                         \
        resultvar = 0xffffffff;                           \
      }                                       \
    (int) resultvar; })

#define LOADARGS_0
#define LOADARGS_1 \
"bpushl .L__X'%k2, %k2\n\t"                           \
"bmovl .L__X'%k2, %k2\n\t"
#define LOADARGS_2  LOADARGS_1
#define LOADARGS_3  LOADARGS_1
#define LOADARGS_4  LOADARGS_1
#define LOADARGS_5  LOADARGS_1

谁知道以下asm代码的含义

#define LOADARGS_1 \
"bpushl .L__X'%k2, %k2\n\t"                           \
"bmovl .L__X'%k2, %k2\n\t"

有人可以向我解释这个 %2表示asm输入和输出中的第三个参数,因此%k2表示.L__X的含义和含义 对于ia32来说,bpushl和bmovl似乎没有这样的指令

1 个答案:

答案 0 :(得分:0)

%2%k2是注册约束,这里有很好的描述:Simple Constraints

bpushlbmovl是由syscalls.h中的uClibc定义的宏,似乎是为了在破坏它之前保留%ebx中的先前值。

.L__X在同一个文件中定义。