※ 引述《yoyotvyoo (鈞鈞)》之銘言:
: 根據我讀到的
: Carry flag是指當計算出一個unsigned value
: 對於destination operand來說為out of range時
: 則carry flag會被設定為1
: Overflow flag是指計算出一個signed value
: 對於destination operand來說為invalid或者out of range時
: 則overflow flag會被設定為1
: 不知道上面得描述對不對
: 然後又看到一個例子
: mov al, -128
: neg al ; CF=1 OF=1
: 上面這個我不太懂
: 為何CF和OF同時被set
: -128去作neg為128
: 對於al來說的unsigned範圍(0~255)
: 對於al來說的signed範圍(-128~127)
: 那應該只有超過signed的範圍 所以只有OF被設定為1
很好,你的OF判斷正確。
但是仔細看 NEG 的描述
NEG replaces the value of a register or memory operand with its two's
complement. The operand is subtracted from zero, and the result is placed in
the operand.
The carry flag is set to 1, unless the operand is zero, in which case the
carry flag is cleared to 0.
除非al是0,否則不管怎樣,CF都會被設起來。
: 但不知道位什麼連CF也被設定為1了
: 還有一個問題就是補數的問題
: 128換成二進位為10000000
有考慮sign? 128在你現在用的位數的sign的系統根本不存在
: 若要作-128則是將其換成二補數
: 也就是01調換之後再將其加上1 等於01111111+1=10000000
: 又變回了128
我們來延伸一位才有機會放你的128,也就是010000000表示128
那這樣用2補數找到-128就是 101111111+1 = 110000000
你覺得會跟你講的128=-128一樣嗎?
: 這讓我蠻疑惑的 為何128=-128
: 剛開始接觸組合語言
: 問題有點新手 請見諒 謝謝!!
你不要在非有效位元玩二補數,那怎樣你都會覺得很奇怪。