【发布时间】:2012-10-24 15:21:41
【问题描述】:
全部,
我正在尝试用内联汇编函数编写一个 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:\n\t"\
"add $13,%%eax\n\t"\
"cmpl $64,%%eax\n\t"\
"jle L5f\n\t"\
"cmpl $90, %%eax\n\t"\
"jg L5f\n\t"\
"cmpl $90,%%eax\n\t"\
"jle L5f\n\t"\
"subl $26,%%eax\n\t"\
"L5f:\n\t"\
"cmpl $96,%%eax\n\t"\
"jle L6f\n\t"\
"cmpl $122,%%eax\n\t"\
"jg L6f\n\t"\
"cmpl $122,%%eax\n\t"\
"jle L6f\n\t"\
"subl $26,%%eax\n\t" \
"L6f:\n\t"\
"leave\n\t"\
:"=r"(a)\
:"r"(a)\
)
int main()
{
int a=13, b=12,c='z';
rot13(c);
printf("c-> rot13= %c\n",c);
return 0;
}
【问题讨论】:
-
为什么你的内联汇编中有一个 LEAVE 指令?这将修改堆栈指针,并从堆栈中弹出 4 个字节。它应该只出现在函数的末尾,并在需要时由编译器添加。
-
非常感谢...还在学习如何处理内联汇编:)