我有一个关于在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操作数,因为这些将使用错误的语法。
编辑:省略第二个代码片段中的变量名称,并在第一个代码片段中添加了一个括号。
不要和名称尝试只是名称,一个数组总是指向它所在的内存空间。 现在你要做的是将数组’thisisatest’放入一个无法容纳如此多数据的寄存器(eax)中。
寄存器可以保存几个字符(取决于寄存器大小)或数组所在的地址
以上就是c/c++开发分享在c和内联汇编之间传递参数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/518917.html