[問題] 關於減法時的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