[問題] 關於減法時的Carry Flag

看板C_and_CPP作者 (等號卡比)時間9年前 (2016/05/18 19:50), 9年前編輯推噓3(3017)
留言20則, 4人參與, 最新討論串1/1
開發平台(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,有點不太能理解為什麼。 還希望版友們能不吝賜教,謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.108.43 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1463572217.A.625.html

05/18 19:56, , 1F
我們在討論的指令到底是 SUB 還是 NEG ?
05/18 19:56, 1F

05/18 19:57, , 2F
SUB 在 1-4 會設定 carry flag,4-1 則不會
05/18 19:57, 2F

05/18 19:57, , 3F
NEG 則是對 0 會 clear CF,對非 0 會 set CF
05/18 19:57, 3F
不好意思是SUB,不過手冊有提到Neg A=SUB 0 A

05/18 20:00, , 4F
NEG A 怎麼可能等於 SUB 0,A ?
05/18 20:00, 4F

05/18 20:00, , 5F
SUB 的第一個參數只能是暫存器或記憶體,不接受常數
05/18 20:00, 5F

05/18 20:01, , 6F
我們在討論的是 IA32 組合語言對吧? @_@
05/18 20:01, 6F

05/18 20:02, , 7F
對 SUB 來說 carry flag 是借位,代表向更高位借 1
05/18 20:02, 7F
喔喔不好意思,我知道不接受常數,但因為篇幅想說簡寫(拖走 MOV A 0 SUB A B NEG A 這樣的話,效果是一樣的嗎(設置的Flag和結果)? 另外也有點好奇為什麼要借位,常用的處理器在處理減法時,不是都採用二的補數嗎?還 是其實這邊的CF無關實作,只是象徵借位?(像是表示UNSIGNED的減法運算產生SIGNED) ※ 編輯: a27417332 (114.42.108.43), 05/18/2016 20:31:25

05/18 21:05, , 8F
1.flag不同,前面解釋過了 2.大數運算時就有高位數可借了
05/18 21:05, 8F

05/18 21:06, , 9F
此外 SUB 和 CMP 的 CF 和 ZF 可以做為比大小之用
05/18 21:06, 9F

05/18 21:19, , 10F
關於大數運算時借位/進位的用法請參考 SBB 和 ADC 指令
05/18 21:19, 10F

05/18 21:26, , 11F
本板原則上不禁止討論inline asm, 不過asm也有專板可以討
05/18 21:26, 11F

05/18 21:26, , 12F
論喔
05/18 21:26, 12F

05/18 22:17, , 13F
1.可是我自己測試時單就CF而言,SUB的Dest Operand為0
05/18 22:17, 13F

05/18 22:18, , 14F
時,也是Src不為0時CF被設置,為0時被清除@@
05/18 22:18, 14F

05/18 22:20, , 15F
2.大數部份我稍後查查,感謝提點!
05/18 22:20, 15F

05/19 09:30, , 16F
其實可以說加減會設 carry flag 就是為了「大」數
05/19 09:30, 16F

05/19 09:30, , 17F
這裡的大數不單指一般程式設計的大數
05/19 09:30, 17F

05/19 09:31, , 18F
而是指超過暫存器大小的數字的運算
05/19 09:31, 18F

05/19 09:32, , 19F
例如 IA32 暫存器 32-bit, 那在做 64-bit 加減時就會用得到
05/19 09:32, 19F

05/19 09:33, , 20F
低位運算完後向上的進/借位藉由 carry flag 往高位傳遞
05/19 09:33, 20F
文章代碼(AID): #1NF5RvOb (C_and_CPP)