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算法中的错误,而不是与其余部分的接口程序。