c/c++语言开发共享在c和内联汇编之间传递参数

我有一个关于在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

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐