1

如果 CPU 像这个问题一样将减法视为加法。
那么 (-1) - (-2) 应该是 FF...FF + 00...02,并且应该设置 CARRY FLAG。
我写了 c 代码在 linux 上测试 (-1) - (-2),但发现 CARRY FLAG 没有设置。
CPU如何处理这种情况。

反汇编代码

00000000004004ed <main>:
  4004ed:   55                      push   %rbp
  4004ee:   48 89 e5                mov    %rsp,%rbp
  4004f1:   c7 45 fc ff ff ff ff    movl   $0xffffffff,-0x4(%rbp)
  4004f8:   c7 45 f8 fe ff ff ff    movl   $0xfffffffe,-0x8(%rbp)
  4004ff:   8b 45 f8                mov    -0x8(%rbp),%eax
  400502:   8b 55 fc                mov    -0x4(%rbp),%edx
  400505:   29 c2                   sub    %eax,%edx
  400507:   89 d0                   mov    %edx,%eax
  400509:   89 45 f4                mov    %eax,-0xc(%rbp)
  40050c:   5d                      pop    %rbp
  40050d:   c3                      retq   
  40050e:   66 90                   xchg   %ax,%ax

GDB 测试

(gdb) ni
0x0000000000400505 in main ()
(gdb)
0x0000000000400507 in main ()
(gdb) p $eflags
$1 = [ IF ]
4

0 回答 0