How does a CPU register know it's content is in 2's complement mode (negative) or positive

0

I have a simple C code:

int main(){
  int a = -1; 
  long b = 4294967295;
  return 0;
}

Compiling it with no optimization and looking at it's assembly using GDB shows the following:

   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 

As you can see both a and b are represented with 0xffffffff. Here are my questions:

1) Why is the first occurrence of 0xffffffff stored in ecx before being moved on the stack, why mov is used instead of movl. Does it make any difference in the 2's complement world?

2) Looking at a raw register value, how can you tell if it's a positive or a negative number (in 2's complement)?

2) Does the CPU know/care if this number is in 2's complement mode or it only cares about the op code it uses for the calculation?

assembly
cpu-registers
twos-complement
asked on Stack Overflow Jan 28, 2019 by Alec

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0