c - 我不明白 C 中的这个扩展汇编内联代码

标签 c assembly inline-assembly

这是一个使用扩展汇编代码的 C 函数:

static inline uint
xchg(volatile uint *addr, uint newval)
{
    uint result;
    asm volatile("lock; xchgl %0, %1" :
                "+m" (*addr), "=a" (result) :
                "1" (newval) :
                "cc");
    return result;
}

我读了this codeproject link了解如何在 C 代码中使用扩展程序集,但我对这段代码感到困惑。 我不明白这段代码中的某些内容:
1) (newval) 在哪里用作汇编代码的输入? (%0 是指 (*addr)%1 是指 (result) 对吧? "1"(newval) 从未在代码中使用过(我们从未在代码中看到 %2)。或者我错了?)
2) 输入操作数中 "1"(newval) 中的 "1" 是什么?
3) "+m" 符号在 "+m"(*addr) 中是什么意思?

最佳答案

你所有关于GCC asm的问题的答案都可以来自6.41 Assembler Instructions with C Expression Operands6.42 Constraints for asm Operands .

关于c - 我不明白 C 中的这个扩展汇编内联代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20945929/

相关文章:

c++ - 段错误 : and the disassembly is different between objdump and gdb

assembly - 如何使用 SIMD 比较两个向量并获得单个 bool 结果?

在 GCC 中调用程序集?

C++ ReadProcessMemory 转换为 char * 替代方案

c - 如何通过我的函数将 "..."(可变长度 arg 列表)不变地传递给另一个函数?

任何人都可以帮助我解决未注册的 C# 类(HRESULT : 0x80040154(REGDB_E_CLASSNOTREG)) 的异常)

c - 为什么会出现 'invalid or unsupported image format'错误?

assembly - 16 位汇编器 (x86) 中数据段的 32 位语法字

mfc - 需要有关使用 WinCE、ARM9 内联汇编的信息

c - %q 在内联汇编中与 -arch i386