- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下摘自GCC manual's Extended Asm docs , 关于使用 asm
在 C 中嵌入汇编指令关键词:
The same problem can occur if one output parameter (a) allows aregister constraint and another output parameter (b) allows a memoryconstraint. The code generated by GCC to access the memory address inb can contain registers which might be shared by a, and GCC considersthose registers to be inputs to the asm. As above, GCC assumes thatsuch input registers are consumed before any outputs are written. Thisassumption may result in incorrect behavior if the asm statementwrites to a before using b. Combining the ‘&’ modifier with theregister constraint on a ensures that modifying a does not affect theaddress referenced by b. Otherwise, the location of b is undefined ifa is modified before using b.
a
,可能存在“不正确的行为”。使用前
b
.
a
影响
b
引用的地址使得
b
的位置未定义。
最佳答案
考虑以下示例:
extern int* foo();
int bar()
{
int r;
__asm__(
"mov $0, %0 \n\t"
"add %1, %0"
: "=r" (r) : "m" (*foo()));
return r;
}
通常的调用约定将返回值放入
eax
登记。因此,编译器很有可能决定使用
eax
自始至终,避免不必要的复制。生成的程序集可能如下所示:
subl $12, %esp
call foo
mov $0, %eax
add (%eax), %eax
addl $12, %esp
ret
请注意
mov $0, %eax
零
eax
在下一条指令尝试使用它来引用输入参数之前,因此此代码将崩溃。使用早期的 clobber,您会强制编译器选择不同的寄存器。就我而言,结果代码是:
subl $12, %esp
call foo
mov $0, %edx
add (%eax), %edx
addl $12, %esp
movl %edx, %eax
ret
编译器可以改为移动
foo()
的结果进入
edx
(或任何其他免费注册),像这样:
subl $12, %esp
call foo
mov %eax, %edx
mov $0, %eax
add (%edx), %eax
addl $12, %esp
ret
这个例子对输入参数使用了内存约束,但这个概念同样适用于输出。
关于assembly - 在 GCC 内联汇编中影响内存操作数寻址模式的早期破坏者的不正确行为的具体示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67645020/
任何人都可以在日志记录方面比较 kafka、编年史队列和破坏者之间的底层设计和性能?似乎 kafka 拥有大多数用户,但不要避免 GC。 最佳答案 我认为您可能对 Kafka 在日志管道中的使用方式感
这个问题已经有答案了: How to get the CPU cycle count in x86_64 from C++? (5 个回答) 已关闭 4 年前。 所以我正在尝试在 Windows 的
我是一名优秀的程序员,十分优秀!