CPU寄存器如何知道其内容处于2的补数模式(负数)还是正数

时间:2019-01-28 01:45:32

标签: assembly cpu-registers twos-complement

我有一个简单的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 

如您所见,ab都用0xffffffff表示。这是我的问题:

1)为什么第一次出现0xffffffff之前将它们存储在ecx中,为什么要使用mov而不是movl。在2的补码世界中有什么区别吗?

2)查看原始寄存器值,如何分辨它是正数还是负数(以2的补码表示)?

2)CPU是否知道/关心该数字是否为2的补码模式,还是只关心用于计算的op代码?

0 个答案:

没有答案