[问题] 关于减法时的Carry Flag

楼主: a27417332 (等号卡比)   2016-05-18 19:50:14
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
IA32
问题(Question):
看了下板规就我的理解好像可以问ASM,所以如果有不妥的地方,小弟会立刻处理@@
想问下关于Carry Flag的东西,起因是因为看到IA32的手册上说,
用NEG指令的时候会触发Carry Flag。
可是如果我自己假设计算如下
两个4 bit的数字运算:
1 (0001)-4(0100)
=1(0001)+(-4)(1100)
=-3(1101)
结果我自己测试Carry Flag会被设定
反倒是
4(0100)-1(0001)=
4(0100)+(-1)(1111)=
3(1 0011)
超出了4 bit却没有Carry Flag,有点不太能理解为什么。
还希望版友们能不吝赐教,谢谢!
作者: Schottky (顺风相送)   2016-05-18 19:56:00
我们在讨论的指令到底是 SUB 还是 NEG ?SUB 在 1-4 会设定 carry flag,4-1 则不会NEG 则是对 0 会 clear CF,对非 0 会 set CFNEG A 怎么可能等于 SUB 0,A ?SUB 的第一个参数只能是暂存器或内存,不接受常数我们在讨论的是 IA32 组合语言对吧? @_@对 SUB 来说 carry flag 是借位,代表向更高位借 11.flag不同,前面解释过了 2.大数运算时就有高位数可借了此外 SUB 和 CMP 的 CF 和 ZF 可以做为比大小之用关于大数运算时借位/进位的用法请参考 SBB 和 ADC 指令
作者: wtchen (没有存在感的人)   2016-05-18 21:26:00
本板原则上不禁止讨论inline asm, 不过asm也有专板可以讨论喔
楼主: a27417332 (等号卡比)   2016-05-18 22:17:00
1.可是我自己测试时单就CF而言,SUB的Dest Operand为0时,也是Src不为0时CF被设置,为0时被清除@@2.大数部份我稍后查查,感谢提点!
作者: LPH66 (-6.2598534e+18f)   2016-05-19 09:30:00
其实可以说加减会设 carry flag 就是为了“大”数这里的大数不单指一般程式设计的大数而是指超过暂存器大小的数字的运算例如 IA32 暂存器 32-bit, 那在做 64-bit 加减时就会用得到低位运算完后向上的进/借位借由 carry flag 往高位传递

Links booklink

Contact Us: admin [ a t ] ucptt.com