我有一个简单的C代码:
int main(){
int a = -1;
long b = 4294967295;
return 0;
}
不进行优化就对其进行编译,并使用GDB对其进行汇编,将显示以下内容:
0x0000000100000f90 <+0>: push %rbp
0x0000000100000f91 <+1>: mov %rsp,%rbp
0x0000000100000f94 <+4>: xor %eax,%eax
0x0000000100000f96 <+6>: mov $0xffffffff,%ecx
0x0000000100000f9b <+11>: mov %ecx,%edx
0x0000000100000f9d <+13>: movl $0x0,-0x4(%rbp)
0x0000000100000fa4 <+20>: movl $0xffffffff,-0x8(%rbp)
0x0000000100000fab <+27>: mov %rdx,-0x10(%rbp)
0x0000000100000faf <+31>: pop %rbp
0x0000000100000fb0 <+32>: retq
如您所见,a
和b
都用0xffffffff
表示。这是我的问题:
1)为什么第一次出现0xffffffff
之前将它们存储在ecx
中,为什么要使用mov
而不是movl
。在2的补码世界中有什么区别吗?
2)查看原始寄存器值,如何分辨它是正数还是负数(以2的补码表示)?
2)CPU是否知道/关心该数字是否为2的补码模式,还是只关心用于计算的op
代码?