《匯編語言》王爽,學習筆記(標志寄存器上)

1.標志寄存器

還記得一開提到的PSW寄存器嗎,他就是一個特殊的寄存器,他的作用是存儲最后一次執行完語句(一般是邏輯運算語句)后程序的一些狀態。他和其他的寄存器不一樣,其他的寄存器都是整個寄存器具有一個含義,而他是按位來起作用的,他的每一位都有專門的含義。

8086的標志寄存器有9個標志位,分別是OF,DF,IF,TF,SF,ZF,AF,PF,CF,剩下的位在8086中并沒有使用,接下來分別介紹這些標志位。

ZF標志位

ZF是標志寄存器的第6位,他是零標志位,他記錄最后一次執行完語句之后,其結果是否為0,如果是0,那ZF的值就是1(真),反之為0(假)。比如:

mov ax,1??????????????????????

sub ax,1??????????????????????? ;ax寄存器值減一

這段指令執行后,ZF的值就為1,表示結果是0。

PF標志位

PF是標志寄存器的第2位,奇偶標志位,記錄最后一次執行完語句后,結果中的1的個數(二進制),是偶數,PF = 1,反之為0。

SF標志位

SF是標志寄存器的第7位,符號標志位,記錄最后一次執行完語句后,結果的正負情況,結果為負,則SF = 1,若為正,SF = 0。

介紹到這里,我們介紹一下有符號數和無符號數,相信有一定計算機基礎的人都知道在計算機中,一個數據可以看成有符號數,也可以看成無符號數,有符號數的最高位是符號位,而且相信你們也一定知道負數在計算機中是以補碼的形式表示的,那么為什么計算機需要提供補碼這個概念?相信大家一定會脫口而出,是為了計算方便,那么你真的理解這種方便嗎?

這種方便不是為了計算機而設計的,這是為了我們程序員才設計的,為了理解這種方便,首先你需要明確一個概念,計算機他不了解有符號數和無符號數的區別,這是人為定義的,在計算機看來,這全部都是一串數據,他只會按照他的做法來處理這段數據。那么我們需要,無論什么情況下我們都能得到最正確的數據,即在我們需要的是無符號數計算的時候,計算機為我們提供的就是無符號數的結果,在我們需要有符號數計算的時候,計算機為我們提供的就是有符號數。

有了這個需求,我們自然的希望計算機對這兩種要求所得出來的結果是一致的,而我們需要什么什么數據,就把這個結果看成什么樣的數據,于是補碼就出現了,SF標志位,CF標志位和OF標志位也就出現了,有了SF標志位,CF標志位和OF標志位,我們就能任意的將數據看成無符號數和有符號數了,例如,你需要的是無符號數,那么你可以無視SF的值,而你需要的是有符號數,你就可以通過SF的值來判斷數據的正負。

CF標志位

CF是標志寄存器的第0位,進位標志位,記錄最后一次執行完語句后,運算結果的最高有效位向更高位的進位值,或從更高位的借位值,一般是進行無符號數運算時才會用CF標志位。

對于一個8位的寄存器來說,如果所存儲的值超過了他所能存儲的極限,那么他會把進位值給丟掉,而不是向更高位進位,而這個丟棄的進位值就來到了CF當中。對加法而言,CF中存儲的是無符號數向更高位的進位值,對減法而言,CF中存儲的是無符號數向更高位的借位值。

為什么說CF標志位一般描述的是無符號數?因為對于一個8位的有符號數來說,他的最高位是符號位,故然符號位是不可能從更高的位進位或借位的,而只有最高位表示的還是數據的無符號數才能向更高位進位或借位。

OF標志位

OF是標志寄存器的第11位,溢出標志位,在進行有符號數的運算時,如果超過了機器所能表示的范圍稱作溢出,比如說,一個8位的有符號數,他所能表示的極限就是-2^7到2^7-1,那么他如果表示了超過這個范圍的值,就將產生溢出,因為要想超過這個范圍,必定數據會影響到第7位的符號位,那么對于一個有符號數來說這就是一個錯誤的結果。

而OF標志位就是為了存儲這個溢出而存在的,試想,一段計算之后的值為正數,但是他的OF標志位值為1,那么說明了什么?一個正數是以溢出而得到的,那他必然是一個負數超過了范圍。

好了,介紹完了與有符號數和無符號數有關的標志位,現在來總結一下,計算機每一次運算,OF,CF,SF的值都有可能變化(影響了第七位,OF就變化,第七位溢出了,CF就變化,SF位是第七位的值),因為他不知道你需要的是什么數據,所以我們只需要最后根據我們需要的數據再來觀察這3個標志寄存位,就可以得出我們需要的數據了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容