如果 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 ]