在使用内联汇编时,如何确定将哪些约束用于变量?

时间:2013-12-07 22:18:56

标签: gcc assembly constraints x86-64 inline-assembly

我正在尝试将字符串写入文件,但一直无法弄清楚如何使用多个约束。例如:

// write(3, "This is a test.\n", 16);
asm volatile (
               "movq $4,%%rax\n\t"
               "movq $3,%%rdi\n\t"
               "movq %0,%%rsi\n\t"
               "movq $0x10,%%rdx\n\t"
               "int $0x80\n\t"
               :"=g"(ret)
               :"0"(msg)
   );

上面的代码适用于我的字符串,虽然我不知道如何为长度做同样的事情。我的第一个想法是使用'1'约束,但这不起作用。我非常肯定在这里使用编号的约束并不是最好的想法,但到目前为止,这是我成功编写的唯一方法。

我查看了各种在线资源和指南,内容包括内联汇编,但我仍然无法弄清楚如何正确地完成它。

**编辑**:我在命名约束方面没有太多运气:

asm volatile (
                   "movq $4,%%rax\n\t"
                   "movq $3,%%rdi\n\t"
                   "movq %[msg],%%rsi\n\t"
                   "movq %[len],%%rdx\n\t"
                   "int $0x80\n\t"
                   ::[msg]"g"(msg), [len]"g"(len)
                   :"cc"
       );

运行时这是'truss'输出:write(3,0x4,16)ERR#22'无效参数'。这真的很奇怪,因为现在长度正在工作,但字符串没有进入调用。

如果有人能告诉我我做错了什么,我会非常感激。

谢谢。

0 个答案:

没有答案