gpt4 book ai didi

c - 内联汇编未知

转载 作者:行者123 更新时间:2023-12-01 12:56:04 27 4
gpt4 key购买 nike

static inline void *__memset(void *s, char c, size_t n) {
int d0, d1;
asm volatile (
"rep; stosb;"
: "=&c" (d0), "=&D" (d1)
: "0" (n), "a" (c), "1" (s)
: "memory");
return s;
}

“d0”和“d1”有什么用?能否请您完整解释所有代码?谢谢!

最佳答案

您需要了解 gcc 扩展内联 asm 格式:

  • 第一部分是实际组装。在这种情况下,只有 2 条指令
  • 第二部分指定输出约束,第三部分指定输入约束。第四部分指定程序集将破坏内存

输出

  • "=&c" 将 d0 与 ecx 寄存器相关联并将其标记为只写。 &表示在代码结束前可以修改
  • "=&D" 意思是一样的,对于edi寄存器

输入

  • "0"(n) 将 n 与第一个提到的寄存器相关联。在你的情况下,使用 ecx
  • "a"(c) 将 c 与 eax 相关联
  • "1"(s) 将 s 与 edi 相关联

程序集

就是这样。重复此 ecx 次(n 次):将 eax (c) 存储到 edi (s),然后递增它。


那么,为什么未使用 d0d1 ?我不确定。我也认为它们在这种情况下没有用,整个输出部分可以留空但我认为不可能在输入约束中指定“可写”和“早期-clobbered”。所以我认为 d0d1 是为了让 & 成为可能。

我会尝试这样写:

asm volatile (
"rep\n"
"stosb\n"
:
: "c" (n), "a" (c), "D" (s)
: "%ecx", "%edi", "memory"
);

关于c - 内联汇编未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9787861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com