c - 为什么我不能在内联 asm 中使用两个以上的寄存器?
问题描述
我试图在我的代码的一部分中使用汇编,但我需要使用多个变量。为什么我不能为 C 变量使用两个以上的寄存器?
__asm(
"add %eex, %edx\n"
"add %eax, %ecx\n"
"mov 1 ,%0\n"
:"=r"(side)
:"a"(map.y));
:"e"(sdist.y)
:"d"(delta.y)
:"c"(step.y)
);
当我编译这个时,我得到了错误
a.c: In function ‘main’:
a.c:289:2: error: expected expression before ‘:’ token
:"e"(sdist.y)
^
a.c:292:1: error: expected statement before ‘)’ token
);
解决方案
对于那个特定的错误,不);
应该是你拥有它的地方(我在下面指出的地方)。
__asm(
"add %eex, %edx\n"
"add %eax, %ecx\n"
"mov 1 ,%0\n"
:"=r"(side)
:"a"(map.y)); <---
:"e"(sdist.y)
:"d"(delta.y)
:"c"(step.y)
);
它关闭了整个asm
语句,这也是在你的最后一行完成的。猜测一下,我会说您只是添加了三个额外的寄存器e
,d
和c
,以及新的结束行,但没有先调整原始结束行 (register a
)。
不管你为什么这样做,结果都是:"e"(sdist.y)
回到C地,因此无效。
即使您已经解决了该直接问题,您的代码中仍有许多其他错误,例如(可能不是详尽的列表):
- 多个输入操作数应以逗号分隔;
1
是绝对地址 1 - 您可能打算$1
为立即值或%1
操作数写入;- x86的
e
约束是适合 32 位符号扩展的立即数,并且没有eex
寄存器; - 这会破坏只读输入操作数(如
edx
and )中的值ecx
,从而违反约束。
推荐阅读
- reactjs - 如何使用主题组件自定义 Mui 中的概述输入?
- sql-server - 合并语句中的删除语句问题
- javascript - 如何在 JavaScript 中拆分具有多种格式的电子邮件列表?
- c# - 1字节8位编码
- c++ - C ++ - 对象自毁并且无法访问变量
- assembly - 'jg' 的操作数类型不匹配
- css - 填充到最后一个子菜单项
- java - 当我使用 apktool 和 backsmali 工具反编译并重新编译名为 classes.Dex 的 smali 文件时,我的应用程序退出
- java - 为什么我的字符串变量在第二次分配给它之后是空的?
- javascript - npm-auth0 错误模块未找到:无法解析 'fs' null