【问题标题】:what's the meaning of the syscall related asm code in uclibc for i386 architectureuclibc for i386架构中系统调用相关的asm代码是什么意思
【发布时间】:2014-02-12 11:28:31
【问题描述】:
#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 的含义和含义 bpushl 和 bmovl 似乎没有针对 ia32 的此类指令

【问题讨论】:

    标签: assembly i386 uclinux


    【解决方案1】:

    %2%k2 是寄存器约束,这里有很好的描述:Simple Constraints

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

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

    【讨论】:

    • for .L__X'%ebx = 1\n\t 我无法理解含义,赋予符号 .L__X 或 .L__X'%ebx 值或有其他含义@superdesk
    • .if 1 - \\name\n\t \\ 的含义是什么,我认为 \ 是为了解析 name 的值,但是 \\ 正在使用转义来表示 \,那么有什么用在这里@superdesk
    • 您对 \\.它解析为\,因此宏中包含\name。使用宏时,.L__X'%k2 替换 \name(我认为)。这会在 bpushl 宏中为您提供.if 1 - .L__X'%k2。 L__X 本身是一个宏......它看起来像是 1、2 或 3,具体取决于寄存器。所以.if 1 - 1 可能是最后一行……但我不确定。
    • 您可能想尝试编译代码以查看它的实际外观。您可以告诉 gcc 输出程序集(而不是目标文件),或者您可以通过预处理器运行代码以查看定义/宏会发生什么。我不是这里的专家,所以我可能无法帮助您解决这里的任何问题。
    • 感谢您的回复最后我发现 \\ 用于内联 asm 语法,而 \ 用于 GNU 汇编器的 asm 中的 .marco,而内联 asm 将简单地扩展为 asm,内联asm 甚至不需要知道 asm 的语法,所以我们应该对内联 asm 和 asm 语法有一个清醒的认识!
    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 2013-10-19
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多