c - GNU 内联汇编(C 中的 asm)中的百分比 (%) 符号
问题描述
这些代码行应该做什么?
mov ebx, %1
mov ecx, %0
我知道 % 表示指针,但我需要更多解释。为什么 %1 和 0 - 这些特定的数字?
解决方案
在 AT&T 语法中,寄存器是指使用百分号,然后是寄存器名称,即%eax
. 您用数字显示的那些在汇编中没有意义,它们用于内联汇编中以引用输入和输出操作数。
int i = 5;
int j;
asm ("mov %1, %0" : "=r"(j) : "r"(i)); //AT&T. Swap operands for Intel syntax
这将分别声明i
和j
作为输出和输入参数。手段,q
任何通用寄存器都可以。除非你真的需要一个特定的寄存器,否则你应该总是让你的编译器选择任何方便的东西。由于您事先不知道您获得了哪些寄存器,因此它们被分配了一个从 0 开始的数字。%0
是第一个参数,在这种情况下是输出参数j
,并且%1
是输入参数i
。
推荐阅读
- javascript - JavaScript中的字符最小长度
- javascript - 使用 jQuery 重新定位/移动 div
- wordpress - 插件增加了 25% 的产品
- python - networkx:nx.draw 不绘图
- react-native - 如何使用 React Native 获取和设置持久性 cookie?
- machine-learning - 看起来不像基于字符的(Bytes Are All You Need)模型(DeepSpeech)
- javascript - 下一张图片按钮
- javascript - deviceMotionEvent.acceleration 属性在移动浏览器中返回 null
- android - 是否可以在 recyclerview 中永久识别项目?findviewwithtag 有时会返回 null
- looper - java Threads - 如果我使用looper,我是否必须取消它们?