【问题标题】:what's %b1(b one, not b L) in `xorb %b1, %b1`?`xorb %b1, %b1` 中的 %b1(b one, not b L) 是什么?
【发布时间】:2016-10-01 01:17:21
【问题描述】:

我正在阅读copy_from_user函数,在copy_from_user函数中,使用了宏__get_user_asm

linux中有一个mmap syscall,mmap syscall会调用函数copy_from_user。如果大小不变,此函数将使用宏 __get_user_asm__get_user_asm的内容是

#define __get_user_asm(x, addr, err, itype, rtype, ltype, errret)   \
asm volatile("1:    mov"itype" %2,%"rtype"1\n"      \
         "2:\n"                     \
         ".section .fixup,\"ax\"\n"             \
         "3:    mov %3,%0\n"                \
         "  xor"itype" %"rtype"1,%"rtype"1\n"       \
         "  jmp 2b\n"                   \
         ".previous\n"                  \
         _ASM_EXTABLE(1b, 3b)               \
         : "=r" (err), ltype(x)             \
         : "m" (__m(addr)), "i" (errret), "0" (err))

当我尝试翻译时 __get_user_asm(*(u8 *)dst, (u8 __user *)src, ret, "b", "b", "=q", 1);真实来源,

1: movb %2,%b1\n
2:\n
.section .fixup, "ax" \n
3: mov %3, %0 \n
 **xorb %b1, %b1\n**
 jmp 2b\n
.previous\n

: "=r" (ret), =q(dst)
:"m"(dst), "i"(1), "0"(ret)

.quad "1b", "2b"\n
.previous\n```

, 有些地方我看不懂。

1,在xorb %b1, %b1 中,%b1(b 一,不是 b L)是什么?

2,在jmp 2b 中,2b 是标签还是内存地址?如果2b 是一个标签,我怎样才能找到这个标签?

3、.quad "1b", "2b"的作用是什么?

我在哪里可以获得使我了解语义层中的 linux 内核源代码的知识?

【问题讨论】:

标签: linux assembly


【解决方案1】:

读取 gcc 扩展 asm 的 docs,我们看到 %1 指的是第二个参数(因为参数编号从零开始)。在您的示例中,这是dst

添加b(即%b1)描述为here

Modifier Description                             Operand  masm=att  masm=intel
b        Print the QImode name of the register.  %b0      %al       al

jmp 2b 表示向后查找名为2 的标签。

.quad 指令定义为here

.quad 需要零个或多个 bignum,用逗号分隔。对于每个 bignum,它发出一个 8 字节的整数。如果 bignum 不适合 8 字节,它会打印一条警告消息;并且只取最低的 8 bignum 的字节数。

至于从哪里获取信息,希望我提供的链接有所帮助。

【讨论】:

    【解决方案2】:

    将任何寄存器与自身进行异或将其设置为零。所以 %B1 = 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-13
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      相关资源
      最近更新 更多