Overflow of = OV NV [No Overflow]
Direction df = DN (decrement) UP (increment)
Interrupt if = EI (enabled) DI (disabled)
Sign sf = NG (negative) PL (positive)
Zero zf = ZR [zero] NZ [ Not zero]
Auxiliary Carry af = AC NA [ No AC ]
Parity pf = PE (even) PO (odd)
Carry cf = CY [Carry] NC [ No Carry]
==============
The individual abbreviations appear to have these meanings:
OV = OVerflow, NV = No oVerflow. DN = DowN, UP (up).
EI = Enable Interupt, DI = Disable Interupt.
NG = NeGative, PL = PLus; a strange mixing of terms due to the
fact that 'Odd Parity' is represented by PO (rather than
POsitive), but they still could have used 'MI' for MInus.
ZR = ZeRo, NZ = Not Zero.
AC = Auxiliary Carry, NA = Not Auxiliary carry.
PE = Parity Even, PO = Parity Odd. CY = CarrY, NC = No Carry.
調試程序DEBUG如何表達標誌狀態?
溢出OV(overflow,OF=1)
無溢出NV(no overflow,OF=0)
減量DN(direction down,DF=1)
增量UP(direction up,DF=0)
容許中斷EI(enable interrupt,IF=1)
進制中斷DI(disable interrupt,IF=0)
負NG(negative,SF=1)
正PL(plus,SF=0)
零ZR(zero,ZF=1)
非零NZ(no zero,ZF=0)
輔助進位AC(auxiliary carry,AF=1)
無輔助進位NA(no auxiliary carry,AF=0)
偶校驗PE(even parity,PF=1)
奇校驗PO(odd parity,PF=0)
進位CY(carry,CF=1)
無進位NC(no carry,CF=0)
AH&AL=AX(accumulator):累加寄存器
BH&BL=BX(base):基址寄存器
CH&CL=CX(count):計數寄存器
DH&DL=DX(data):數據寄存器
SP(Stack Pointer):堆棧指針寄存器
BP(Base Pointer):基址指針寄存器
SI(Source Index):源變址寄存器
DI(Destination Index):目的變址寄存器
IP(Instruction Pointer):指令指針寄存器
CS(Code Segment)代碼段寄存器
DS(Data Segment):數據段寄存器
SS(Stack Segment):堆棧段寄存器
ES(Extra Segment):附加段寄存器
OF overflow flag 溢出標誌 操做數超出機器能表示的範圍表示溢出,溢出時爲1.
SF sign Flag 符號標誌 記錄運算結果的符號,結果負時爲1.
ZF zero flag 零標誌 運算結果等於0時爲1,不然爲0.
CF carry flag 進位標誌 最高有效位產生進位時爲1,不然爲0.
AF auxiliary carry flag 輔助進位標誌 運算時,第3位向第4位產生進位時爲1,不然爲0.
PF parity flag 奇偶標誌 運算結果操做數位爲1的個數爲偶數個時爲1,不然爲0.
DF direcion flag 方向標誌 用於串處理.DF=1時,每次操做後使SI和DI減少.DF=0時則增大.
IF interrupt flag 中斷標誌 IF=1時,容許CPU響應可屏蔽中斷,不然關閉中斷.
TF trap flag 陷阱標誌 用於調試單步操做
設置 nv(清除) ov(溢出)
方向 dn(減) up(增)
中斷 ei(啓用) di(禁用)
正負 ng(負) pl(正)
零 zr(0) nz(非0)
輔助進位 ac(進位) na(不進位)
奇偶校驗 pe(偶校驗) po(奇校驗)
進位 cy(進位) nc(不進位)
如:
OV DN EI NG ZR AC PE CY依次表示OF DF IF SF ZF AF PF CF都爲1;
NV UP DI PL NZ NA PO NC依次表示OF DF IF SF ZF AF PF CF都爲0.
|
of
|
df
|
if
|
sf
|
zf
|
af
|
pf
|
cf
|
標誌位爲1
|
ov
|
dn
|
ei
|
ng
|
zr
|
ac
|
pe
|
cy
|
標誌位爲0
|
nv
|
up
|
di
|
pl
|
nz
|
na
|
po
|
nc
|
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=0100 NV UP EI PL NZ NA PO NC
1392:0100 28C0 SUB AL,AL
-t
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=0102 NV UP EI PL ZR NA PE NC
1392:0102 B010 MOV AL,10
-t
AX=0010 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=0104 NV UP EI PL ZR NA PE NC
1392:0104 0490 ADD AL,90
-t
AX=00A0 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=0106 NV UP EI NG NZ NA PE NC
1392:0106 B080 MOV AL,80
-t
AX=0080 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=0108 NV UP EI NG NZ NA PE NC
1392:0108 0480 ADD AL,80
-t
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=010A OV UP EI PL ZR NA PE CY
1392:010A B0FC MOV AL,FC
-t
AX=00FC BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=010C OV UP EI PL ZR NA PE CY
1392:010C 0405 ADD AL,05
-t
AX=0001 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=010E NV UP EI PL NZ AC PO CY
1392:010E B07D MOV AL,7D
-t
AX=007D BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=0110 NV UP EI PL NZ AC PO CY
1392:0110 040B ADD AL,0B
-
AX=0080 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1392 ES=1392 SS=1392 CS=1392 IP=0108 NV UP EI NG NZ NA PE NC
1392:0108 0480 ADD AL,80
-另外有人在網上作了很好的總結
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=19481&kindLevel=1&kindId=34937&postId=39398&readSg=1
補碼運算時的溢出判斷
這裏我作個腳註:即兩數原碼數值部分是什麼意思
10000101
11111011 分別是同一個數的原碼與補碼,去掉最高位的符號位,相加即得128
當兩個以補碼錶示的負數相加時,會遇到兩個問題。第一是兩個負數的符號位相加,1+1後,本位爲零,彷佛負數相加變成了正數;其二是兩個負數的數值部分之和,若是不向符號位進位,是否是就說明運算結果沒有溢出?但不進位最終將致使兩個負數相加成了正數,顯然是錯誤的,這該怎麼解釋?若是兩個以補碼錶示的負數的數值部分之和向符號位進位,會使運算結果依然爲負數,那麼這個運算結果是正確的嗎?下面咱們分析一下這個問題:
①只有真正意義上的相加纔可能溢出,好比:
正+正,負+負,正-負,負-正
純粹的減法是不可能溢出的,這一點僅需常識便可做出判斷,因此遇到不是真正意義上的加法運算(固然,包括乘法和左移等)要你判斷是否有溢出,直接就能夠回答:OF=0;
②兩正數之和的數值部分向符號位進位,顯然是運算結果超過了指定位數的帶符號數的表示範圍,這就是典型的溢出;
③兩負數之和的溢出判斷是咱們討論的重點。咱們先考察一下負數原碼和補碼數值部分之間的關係:以8位補碼爲例,負數原碼和補碼數值部分之和始終等於128(見上圖)。因爲這種關係,當原碼數值大時對應的補碼數值就小,反之也同樣。因此,當兩補碼錶示的負數的數值部分之和沒有向符號位進位,說明兩負數的原碼之和必然向符號位進位,即發生溢出;反之,當兩補碼錶示的負數的數值部分之和向符號位進位,那麼對應兩負數原碼的數值之和就不可能向符號位進位,即運算結果沒有溢出;而且在這種情形下補碼之和的數值部分向符號位的進位,修正了兩負數符號位相加本位爲零的問題,使得兩負數之和依然是個負數。
下面看兩個負數補碼相加溢出判斷的實例:
例一:085h + 9ch
= 10000101b + 10011100b
兩數相加,數值部分不會向符號位進位,這是否是就說明沒有溢出呢?但因爲計算結果爲正,顯然不對。咱們仍是看看兩個數的原碼之和再說:
10000101b的原碼 = 11111011b(-123)
10011100b的原碼 = 11100100b(-100)
顯然,原碼之和的數值部分將向符號位進位,顯然是溢出無疑。
例二:0e7h + 0b3h
=11100111b + 10110011b
兩數相加,數值部分會向符號位進位,這進位是溢出嗎?仍是看看原碼吧!
11100111b的原碼 = 10011001b(-25)
10110011b的原碼 = 11001101b(-77)
容易看出,兩數原碼之和沒有向符號位進位,即沒有發生溢出。
其實歸結起來,補碼的溢出判斷規則就一句話:
同號數相加若是結果的符號位和兩加數不一樣,既是溢出。
這天然說明了:
⑴不是同號數相加,則不可能溢出;
⑵同號數相加有可能溢出;
⑶同號數相加若是結果的符號位和兩加數不一樣,既是溢出。
評論次數(7) | 瀏覽次數(3316) | 類型(彙編語言) | 收藏此文 |
[ younggay 發表於 2009-07-22 09:59 ]
up
[ zhonghuade 發表於 2009-10-18 19:23 ]
老師!我以爲能夠加一些實際的例子來講明補碼溢出,好比說:8位機器數運算表示範圍-128大於等於x小於等於127,發生溢出的具體狀況?用實例來講明能讓咱們更深入理解溢出的含義!請您指點!謝謝!
[ release_lag 發表於 2009-12-31 16:48 ]
呵呵,沒想到我和樓主想到一塊兒去了。
=============================
回樓上的
若是是兩個8位數據相加
第一個加數的範圍是:0ffH~80H(負數的範圍)
第二個加數的範圍是:0H~79H(正數的範圍)
那麼他們永遠不會溢出
緣由是他們符號不一樣,樓主已經說過:不一樣符號的兩數相加,結果不可能溢出
同符號相加時,就檢查結果的符號,若是符號與兩個數據的符號不一樣時,則溢出
例如mov al,0e0h
add al,95H
結果是(al)=75H ;75H爲正數,運算溢出
[ 遊客 發表於 2011-01-01 21:53 ]
頂
[ 遊客 發表於 2011-12-17 22:33 ]
文章很不錯,但是還有不少地方不太明白。
1、(八位補碼溢出判斷圖示)是根據什麼原理推斷出來的啊?負數原碼和補碼數值部分之和始終等於128,爲何?
2、只有真正意義上的相加纔可能溢出,什麼是真正意義上的相加?
3、請問什麼是溢出?文中提到:兩正數之和的數值部分向符號位進位,顯然是運算結果超過了指定位數的帶符號數的表示範圍,這就是典型的溢出。運算結果超過了指定位數的帶符號數的表示範圍——這句話如何理解?不是同號數相加,則不可能溢出,超不超出範圍如何判斷?
[ 842460904 發表於 2012-09-03 23:38 ]
理論是應該負數原碼和補碼數值之和等於128,可爲何。fc和它的補碼-4相加,即252+(-4)=?好像不在128-127之間。爲何,能解答下嗎。謝謝
[ scuzg 發表於 2012-12-20 19:05 ]
0fch展開成二進制數:
11111100,其中最高位是符號位,因此:
7ch+4=80h=128
際原碼和補碼數值部分之和是128.