→ 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