看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
Schottky: 我們在討論的指令到底是 SUB 還是 NEG ? 05/18 19:56
Schottky: SUB 在 1-4 會設定 carry flag,4-1 則不會 05/18 19:57
Schottky: NEG 則是對 0 會 clear CF,對非 0 會 set CF 05/18 19:57
不好意思是SUB,不過手冊有提到Neg A=SUB 0 A
Schottky: NEG A 怎麼可能等於 SUB 0,A ? 05/18 20:00
Schottky: SUB 的第一個參數只能是暫存器或記憶體,不接受常數 05/18 20:00
Schottky: 我們在討論的是 IA32 組合語言對吧? @_@ 05/18 20:01
Schottky: 對 SUB 來說 carry flag 是借位,代表向更高位借 1 05/18 20:02
喔喔不好意思,我知道不接受常數,但因為篇幅想說簡寫(拖走 MOV A 0 SUB A B NEG A 這樣的話,效果是一樣的嗎(設置的Flag和結果)? 另外也有點好奇為什麼要借位,常用的處理器在處理減法時,不是都採用二的補數嗎?還 是其實這邊的CF無關實作,只是象徵借位?(像是表示UNSIGNED的減法運算產生SIGNED) ※ 編輯: a27417332 (114.42.108.43), 05/18/2016 20:31:25
Schottky: 1.flag不同,前面解釋過了 2.大數運算時就有高位數可借了 05/18 21:05
Schottky: 此外 SUB 和 CMP 的 CF 和 ZF 可以做為比大小之用 05/18 21:06
Schottky: 關於大數運算時借位/進位的用法請參考 SBB 和 ADC 指令 05/18 21:19
wtchen: 本板原則上不禁止討論inline asm, 不過asm也有專板可以討 05/18 21:26
wtchen: 論喔 05/18 21:26
a27417332: 1.可是我自己測試時單就CF而言,SUB的Dest Operand為0 05/18 22:17
a27417332: 時,也是Src不為0時CF被設置,為0時被清除@@ 05/18 22:18
a27417332: 2.大數部份我稍後查查,感謝提點! 05/18 22:20
LPH66: 其實可以說加減會設 carry flag 就是為了「大」數 05/19 09:30
LPH66: 這裡的大數不單指一般程式設計的大數 05/19 09:30
LPH66: 而是指超過暫存器大小的數字的運算 05/19 09:31
LPH66: 例如 IA32 暫存器 32-bit, 那在做 64-bit 加減時就會用得到 05/19 09:32
LPH66: 低位運算完後向上的進/借位藉由 carry flag 往高位傳遞 05/19 09:33