在 C 和内联程序集之间传递参数
passing arguments between c and inline assembly
我有一个关于在c和内联程序集之间传递参数的问题
我在将数组传递到我的内联程序集时遇到问题。我不断收到错误"错误:内存输入 1 无法直接寻址"
这是我的代码示例:
void main()
{
char name[] = "thisisatest";
__asm__ ("
.intel_syntax noprefix n
mov eax, %[name] n
inc (eax) n
"
:/*no output*/
:[name]"m"(name)
);
}
这应该增加我的字符串的第一个字母(使其成为"u"),但它不会构建。
想法?
万一其他人遇到这个问题,我让它工作了。
void main()
{
char name[] = "thisisatest";
__asm__ ("
.intel_syntax noprefix n
lea, eax, %[name] n
inc BYTE PTR [eax] n
"
:/*no output*/
:[name]"m"(name[0])
);
}
键将数组的第一个元素作为内存参数传入,然后请求有效地址。然后我有一个指向我的字符串的指针。希望这对其他人有帮助
当
数组转换为指针时,不能将数组传递到内联程序集(包含在结构中除外),并且不能对该指针应用内存约束,因为它不是左值。
您可以在以下位置传递数组的元素:
asm ("incb %0" : "+g" name[0] : : ); // AT&T syntax
或者它解决:
asm volatile ("incb (%0)" : : "r" name : "memory"); // AT&T syntax
此外,如果您在内联汇编程序中切换汇编程序语法,则必须在之后恢复它,并且不要使用内存 asm 操作数,因为这些操作数的语法错误。
编辑:省略了第二个代码片段中的变量名,并在第一个代码片段中添加了一个括号。
不要做 &name 尝试只是名称,数组始终指向内存中它所在的空间。现在你要做的是将数组"thisisatest"放入一个不能容纳这么多数据的寄存器(eax)中。
寄存器可以容纳几个字符(取决于寄存器大小)或数组所在的地址
相关文章:
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 在 C 和 C++ 中作为函数参数,int **a 和 int a[][] 之间有什么确切的区别
- C++模板参数之间的比较似乎被忽略了
- 在不同的模板参数包之间分发非类型参数包
- 折叠表达式和参数包:static_assert 内 Args&& 和 Args 之间的区别
- 将函数作为参数传递的两种方式之间的区别
- C++ 和 Lua 函数之间的交互与 3D 矢量参数
- 大括号和括号之间的参数计算顺序
- RVALUE参考与const lVALUE参考作为参数之间的混淆
- 有没有办法根据模板参数的类型在不同的类实现之间进行选择
- 使用运行时参数与编译时参数在类之间共享代码
- Rcpp 中值和引用参数之间的差异
- 作为参数的'char *args[]'和'char **argv'之间的差异
- By-ref 参数:这是 std::thread 和 std::bind 之间的不一致吗?
- 是否可以找到两个模板参数之间表达式的类型
- 函数参数和临时变量之间复制构造函数的奇怪行为
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单
- 从 1 中创建新的字符 * 作为参数,元素位于 2 个索引之间
- C - 编译器如何以参数为参数的过载函数在超载函数之间决定
- 在UWP页面之间传递参数的正确方法