C-内联装配分割故障



all,

我试图用内联汇编功能编写rot13 ...

以下代码可与" A"一起使用,但是当C到达" Z"时,它不再起作用了...

和...它总是显示"细分故障" ...请给我一些建议

这个问题。

#include <stdio.h>
#define add(a,b)
asm volatile(
    "add %%ebx,%%eax" 
    :"=a"(a) 
    :"a"(a),"b"(b) 
)
#define rot13(a)
asm (
"rot:nt"
    "add $13,%%eaxnt"
    "cmpl $64,%%eaxnt"
    "jle L5fnt"
    "cmpl $90, %%eaxnt"
    "jg L5fnt"
    "cmpl $90,%%eaxnt"
    "jle L5fnt"
    "subl $26,%%eaxnt"
"L5f:nt"
    "cmpl $96,%%eaxnt"
    "jle L6fnt"
    "cmpl $122,%%eaxnt"
    "jg L6fnt"
    "cmpl $122,%%eaxnt"
    "jle L6fnt"
    "subl $26,%%eaxnt" 
"L6f:nt"
    "leavent"
    :"=r"(a)
    :"r"(a)
)
int main()
{
    int a=13, b=12,c='z';
    rot13(c);
    printf("c-> rot13= %cn",c);
    return 0;
}

我敢打赌您的分割故障是因为您在那里有leave指令。内联汇编 not 被称为正常功能,因此您不需要它,并且它将构成堆栈。

另一个问题是,您所有的组装硬编码都可以在%eax上操作,但是您没有告诉编译器。它认为它可以将输入粘贴在所需的任何寄存器中,并从任何其他寄存器中读取输出。可以通过使用%0%1而不是%%eax调整代码,但可能会更容易将输入和输出约束更改为

>
asm ( <your code here> : "=a" (a) : "0" (a) )

这意味着"此内联装配的输出必须在%eax中,并且输入必须与输出相同的寄存器"。(如果您再次将" A"放在输入约束上,它将无法正常工作。GCC的寄存器分配器是一堆28岁的黑客入侵,您必须按照其规则进行游戏。可以在" ASM操作数"部分的"扩展ASM"one_answers"约束"中找到规则,非常仔细地阅读它们,包括第二部分的所有小节,请记住这是实际上,内部"机器描述"语言的重新定义功能并为此进行了优化。)

这仍然没有给我正确的答案 rot13('z'),但我认为其余问题是您的rot13算法中的错误,而不是与其余部分的接口程序。

相关内容

  • 没有找到相关文章

最新更新