汇编cmp指令
code小白。。
代码在这里,64位编译环境。还是刚才那个阶乘。
#include<stdio.h>
int fac(int n);
int main(){
int num;
scanf("%d", &num);
while( num < 0) {
scanf("%d",&num);
}
printf("%d", fac(num));
return 0;
}
int fac(unsigned n){
int f;
if (n == 0) {
f = 1;
} else{
f = fac(n-1) * n;
}
return f;
}
https://github.com/SarishiNoH...
问题是在这段比较num和0的大小的时候
scanf("%d", &num);
while( num < 0) {
scanf("%d",&num);
}
想请教一下为什么在.compare这段中如果我把37行写成
cmpq $0, %rax
之后我每次输入负数的时候就会出现segment fault,
而%eax就可以正常运行,为啥?
rax和eax里面如果都是负数的话有什么区别吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先,
RAX
是64位的寄存器,EAX
是32位的寄存器,他们的关系如下(别处copy来的):或者用16进制这么看
然而,C语言中
int
是32bit,当你的数是正数的时候,RAX
高位都是0
,无影响,比如数字2000
,即使是64位寄存器,存的也是2000
但是,如果是负数,是采用补码的形式存储,那么首个二进制位必须是
1
,比如数字-5
首先看一下是怎么存储的
符号位以外的取反
所以最终
-5
在EAX
中是,但是如果你用RAX
的话,高位都是0
,那是正数啊!如果用了
RAX
,这个是就不是-5
而是4294967291
了~不知道我算的对不对... 总之你用
int
的话,肯定是用EAX
的啦。不是很清楚,建议你用
gdb
,单步汇编调试一下~~