《匯編語言講》PPT課件.ppt
《《匯編語言講》PPT課件.ppt》由會員分享,可在線閱讀,更多相關《《匯編語言講》PPT課件.ppt(154頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第11章標志寄存器,章節(jié)分布,11.1ZF標志11.2PF標志11.3SF標志11.4CF標志11.5OF標志11.6adc指令11.7sbb指令11.8cmp指令11.9檢測比較結果的條件轉移指令11.10DF標志和串傳送指令11.11pushf和popf11.12標志寄存器在Debug中的表示,引言,8086CPU的標志寄存器有16位,其中存儲的信息通常被稱為程序狀態(tài)字(PSW)。我們己經(jīng)使用過8086CPU的ax、bx、cx、dx、si、di、bp、sp、ip、cs、ss、ds、es等13個寄存器了。本章中的標志寄存器(以下簡稱為flag)是我們要學習的最后一個寄存器。,引言,flag和其他寄存器不一樣,其他寄存器是用來存放數(shù)據(jù)的,都是整個寄存器具有一個含義。而flag寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的信息。,引言,8086CPU的flag寄存器的結構:flag的1、3、5、12、13、14、15位在8086CPU中沒有使用,不具有任何含義。而0、2、4、6、7、8、9、10、11位都具有特殊的含義。,11.1ZF標志,flag的第6位是ZF,零標志位。它記錄相關指令執(zhí)行后,結果為0,ZF=1結果不為0,ZF=0示例,11.1ZF標志,比如:movax,1subax,1指令執(zhí)行后,結果為0,則ZF=1。movax,2subax,1指令執(zhí)行后,結果為1,則ZF=0。,11.1ZF標志,對于ZF的值,我們可以這樣來看,ZF標記相關指令的計算結果是否為0,如果為0,則在ZF要記錄下“是0”這樣的肯定信息。在計算機中1表示邏輯真,表示肯定,所以當結果為0的時候ZF=1,表示“結果是0”。如果結果不為0,則ZF要記錄下“不是0”這樣的否定信息。在計算機中0表示邏輯假,表示否定,所以當結果不為0的時候ZF=0,表示“結果不是0”。示例,11.1ZF標志,示例指令:movax,1andax,0執(zhí)行后,結果為0,則ZF=1,表示“結果是0”。指令:movax,1orax,0執(zhí)行后,結果不為0,則ZF=0,表示“結果非0”。,11.1ZF標志,注意:在8086CPU的指令集中,有的指令的執(zhí)行是影響標志寄存器的,比如:add、sub、mul、div、inc、or、and等,它們大都是運算指令(進行邏輯或算術運算);有的指令的執(zhí)行對標志寄存器沒有影響,比如:mov、push、pop等,它們大都是傳送指令。,11.1ZF標志,注意:我們在使用一條指令的時候,要注意這條指令的全部功能,其中包括,執(zhí)行結果對標記寄存器的哪些標志位造成影響。,11.2PF標志,flag的第2位是PF,奇偶標志位。它記錄指令執(zhí)行后,結果的所有二進制位中1的個數(shù):為偶數(shù),PF=1;為奇數(shù),PF=0。示例,11.2PF標志,示例指令:moval,1addal,10執(zhí)行后,結果為00001011B,其中有3(奇數(shù))個1,則PF=0;指令:moval,1oral,2執(zhí)行后,結果為00000011B,其中有2(偶數(shù))個1,則PF=1;,11.3SF標志,flag的第7位是SF,符號標志位。它記錄指令執(zhí)行后,結果為負,SF=1;結果為正,SF=0。有符號數(shù)與補碼示例moval,10000001Baddal,1結果:(al)=10000010B,有符號數(shù)與補碼,我們知道計算機中通常用補碼來表示有符號數(shù)據(jù)。計算機中的一個數(shù)據(jù)可以看作是有符號數(shù),也可以看成是無符號數(shù)。比如:00000001B,可以看作為無符號數(shù)1,或有符號數(shù)+1;10000001B,可以看作為無符號數(shù)129,也可以看作有符號數(shù)-127。,有符號數(shù)與補碼,這也就是說,對于同一個二進制數(shù)據(jù),計算機可以將它當作無符號數(shù)據(jù)來運算,也可以當作有符號數(shù)據(jù)來運算。,,11.3SF標志,我們可以將add指令進行的運算當作無符號數(shù)的運算,那么add指令相當于計算129+1,結果為130(10000010B);也可以將add指令進行的運算當作有符號數(shù)的運算,那么add指令相當于計算-127+1,結果為-126(10000010B)。,11.3SF標志,不管我們?nèi)绾慰创珻PU在執(zhí)行add等指令的時候,就已經(jīng)包含了兩種含義,也將得到用同一種信息來記錄的兩種結果。關鍵在于我們的程序需要哪一種結果。,11.3SF標志,SF標志,就是CPU對有符號數(shù)運算結果的一種記錄,它記錄數(shù)據(jù)的正負。在我們將數(shù)據(jù)當作有符號數(shù)來運算的時候,可以通過它來得知結果的正負。如果我們將數(shù)據(jù)當作無符號數(shù)來運算,SF的值則沒有意義,雖然相關的指令影響了它的值。,11.3SF標志,這也就是說,CPU在執(zhí)行add等指令時,是必然要影響到SF標志位的值的。至于我們需不需要這種影響,那就看我們?nèi)绾慰创噶钏M行的運算了。,11.3SF標志,比如:moval,10000001Baddal,1執(zhí)行后,結果為10000010B,SF=1,表示:如果指令進行的是有符號數(shù)運算,那么結果為負;,11.3SF標志,再比如:moval,10000001Baddal,01111111B執(zhí)行后,結果為0,SF=0,表示:如果指令進行的是有符號數(shù)運算,那么結果為非負。,11.3SF標志,某些指令將影響標志寄存器中的多個標志位,這些被影響的標志位比較全面地記錄了指令的執(zhí)行結果,為相關的處理提供了所需的依據(jù)。比如指令subal,al執(zhí)行后,ZF、PF、SF等標志位都要受到影響,它們分別為:1、1、0。,特別提示,檢測點11.1(p216)沒有完成此檢測點,請不要向下進行。,11.4CF標志,flag的第0位是CF,進位標志位。一般情況下,在進行無符號數(shù)運算的時候,它記錄了運算結果的最高有效位向更高位的進位值,或從更高位的借位值。,11.4CF標志,對于位數(shù)為N的無符號數(shù)來說,其對應的二進制信息的最高位,即第N-1位,的最高有效位,而假想存在的第N位,就是相對于最高有效位的更高位。,11.4CF標志,我們知道,當兩個數(shù)據(jù)相加的時候,有可能產(chǎn)生從最高有效位向更高位的進位。比如,兩個8位數(shù)據(jù):98H+98H,將產(chǎn)生進位。由于這個進位值在8位數(shù)中無法保存,我們在前面的課程中,就只是簡單地說這個進位值丟失了。,11.4CF標志,其實CPU在運算的時候,并不丟棄這個進位值,而是記錄在一個特殊的寄存器的某一位上。8086CPU就用flag的CF位來記錄這個進位值。,11.4CF標志,比如,下面的指令:moval,98Haddal,al;執(zhí)行后:(al)=30H,CF=1,;CF記錄了最高有效位向更高位的進位值,11.4CF標志,而當兩個數(shù)據(jù)做減法的時候,有可能向更高位借位。比如,兩個8位數(shù)據(jù):97H-98H,將產(chǎn)生借位,借位后,相當于計算197H-98H。而flag的CF位也可以用來記錄這個借位值。,11.5OF標志,我們先來談談溢出的問題。在進行有符號數(shù)運算的時候,如結果超過了機器所能表示的范圍稱為溢出。那么,什么是機器所能表示的范圍呢?,11.5OF標志,比如說,指令運算的結果用8位寄存器或內(nèi)存單元來存放。比如:addal,3,那么對于8位的有符號數(shù)據(jù),機器所能表示的范圍就是-128~127。同理,對于16位有符號數(shù),機器所能表示的范圍是-32768~32767。,11.5OF標志,如果運算結果超出了機器所能表達的范圍,將產(chǎn)生溢出。注意,這里所講的溢出,只是對有符號數(shù)運算而言。下面我們看兩個溢出的例子。,11.5OF標志,示例指令moval,98addal,99執(zhí)行后將產(chǎn)生溢出。因為addal,99進行的有符號數(shù)運算是:(al)=(al)+99=98+99=197而結果197超出了機器所能表示的8位有符號數(shù)的范圍:-128~127。,11.5OF標志,示例指令:moval,0F0H;0F0H,為有符號數(shù)-16的補碼addal,88H;88H,為有符號數(shù)-120的補碼執(zhí)行后將產(chǎn)生溢出。因為addal,88H進行的有符號數(shù)運算是:(al)=(al)+(-120)=(-16)+(-120)=-136而結果-136超出了機器所能表示的8位有符號數(shù)的范圍:-128~127。,11.5OF標志,如果在進行有符號數(shù)運算時發(fā)生溢出,那么運算的結果將不正確。就上面的兩個例子來說:moval,98addal,99add指令運算的結果是(al)=0C5H,因為進行的是有符號數(shù)運算,所以al中存儲的是有符號數(shù),而0C5H是有符號數(shù)-59的補碼。,11.5OF標志,如果我們用add指令進行的是有符號數(shù)運算,則98+99=-59這樣的結果讓人無法接受。造成這種情況的原因,就是實際的結果197,作為一個有符號數(shù),在8位寄存器al中存放不下。,11.5OF標志,同樣,對于:moval,0F0H;0F0H,為有符號數(shù)-16的補碼addal,88H;88H,為有符號數(shù)-120的補碼add指令運算的結果是(al)=78H,因為進行的是有符號數(shù)運算,所以al中存儲的是有符號數(shù),而78H表示有符號數(shù)120。,11.5OF標志,如果我們用add指令進行的是有符號數(shù)運算,則-16-120=120這樣的結果顯然不正確。造成這種情況的原因,就是實際的結果-136,作為一個有符號數(shù),在8位寄存器al中存放不下。,11.5OF標志,由于在進行有符號數(shù)運算時,可能發(fā)生溢出而造成結果的錯誤。則CPU需要對指令執(zhí)行后是否產(chǎn)生溢出進行記錄。flag的第11位是OF,溢出標志位。,11.5OF標志,一般情況下,OF記錄了有符號數(shù)運算的結果是否發(fā)生了溢出。如果發(fā)生溢出,OF=1,如果沒有,OF=0。,11.5OF標志,一定要注意CF和OF的區(qū)別:CF是對無符號數(shù)運算有意義的標志位;而OF是對有符號數(shù)運算有意義的標志位。,11.5OF標志,比如:moval,98addal,99add指令執(zhí)行后:CF=0,OF=1。前面我們講過,CPU在執(zhí)行add等指令的時候,就包含了兩種含義:無符號數(shù)運算和有符號數(shù)運算。,11.5OF標志,對于無符號數(shù)運算,CPU用CF位來記錄是否產(chǎn)生了進位;對于有符號數(shù)運算,CPU用OF位來記錄是否產(chǎn)生了溢出,當然,還要用SF位來記錄結果的符號。,11.5OF標志,對于無符號數(shù)運算,98+99沒有進位,CF=0;對于有符號數(shù)運算,98+99發(fā)生溢出,OF=1。,11.5OF標志,moval,0F0Haddal,88Hadd指令執(zhí)行后:CF=1,OF=1。對于無符號數(shù)運算,0F0H+88H有進位,CF=1;對于有符號數(shù)運算,0F0H+88H發(fā)生溢出,OF=1。,11.5OF標志,moval,0F0Haddal,78Hadd指令執(zhí)行后:CF=1,OF=0。對于無符號運算,0F0H+78H有進位,CF=1;對于有符號數(shù)運算,0F0H+78H不發(fā)生溢出,OF=0。,11.5OF標志,我們可以看出,CF和OF所表示的進位和溢出,是分別對無符號數(shù)和有符號數(shù)運算而言的,它們之間沒有任何關系。,特別提示,檢測點11.2(page219)沒有完成此檢測點,請不要向下進行。,11.6adc指令,adc是帶進位加法指令,它利用了CF位上記錄的進位值。格式:adc操作對象1,操作對象2功能:操作對象1=操作對象1+操作對象2+CF比如:adcax,bx實現(xiàn)的功能是:(ax)=(ax)+(bx)+CFadc指令執(zhí)行過程演示,11.6adc指令,adc指令示例(一)movax,2movbx,1subbx,axadcax,l執(zhí)行后,(ax)=4。adc執(zhí)行時,相當于計算:(ax)+1+CF=2+1+1=4。,11.6adc指令,adc指令示例(二)movax,1addax,axadcax,3執(zhí)行后,(ax)=5。adc執(zhí)行時,相當于計算:(ax)+3+CF=2+3+0=5。,11.6adc指令,adc指令示例(三)moval,98Haddal,aladcal,3執(zhí)行后,(ax)=34H。adc執(zhí)行時,相當于計算:(ax)+3+CF=30H+3+1=34H。,11.6adc指令,可以看出,adc指令比add指令多加了一個CF位的值。為什么要加上CF的值呢?CPU為什么要提供這樣一條指令呢?我們先來看一下CF的值的含義。,11.6adc指令,在執(zhí)行adc指令的時候加上的CF的值的含義,由adc指令前面的指令決定的,也就是說,關鍵在于所加上的CF值是被什么指令設置的。顯然,如果CF的值是被sub指令設置的,那么它的含義就是借位值;如果是被add指令設置的,那么它的含義就是進位值。,11.6adc指令,我們來看一下兩個數(shù)據(jù):0198H和0183H如何相加的:0198+01831-----------------031B可以看出,加法可以分兩步來進行:(1)低位相加;(2)高位相加再加上低位相加產(chǎn)生的進位值。,11.6adc指令,下面的指令和addax,bx具有相同的結果:addal,bladcah,bh看來CPU提供adc指令的目的,就是來進行加法的第二步運算的。adc指令和add指令相配合就可以對更大的數(shù)據(jù)進行加法運算。,11.6adc指令,編程計算1EF000H+201000H,結果放在ax(高16位)和bx(低16位)中。分析,11.6adc指令,分析:因為兩個數(shù)據(jù)的位數(shù)都大于16,用add指令無法進行計算。我們將計算分兩步進行,先將低16位相加,然后將高16位和進位值相加。程序如下,11.6adc指令,程序:movax,001EHmovbx,0F000Haddbx,1000Hadcax,0020Hadc指令執(zhí)行后,也可能產(chǎn)生進位值,所以也會對CF位進行設置。,11.6adc指令,由于有這樣的功能,我們就可以對任意大的數(shù)據(jù)進行加法運算??匆粋€例子,11.6adc指令,編程計算1EF0001000H+2010001EF0H,結果放在ax(高16位),bx(次高16位),cx(低16位)中。分析,11.6adc指令,分析:計算分3步進行:(1)先將低16位相加,完成后,CF中記錄本次相加的進位值;(2)再將次高16位和CF(來自低16位的進位值)相加,完成后,CF中記錄本次相加的進位值;(3)最后高16位和CF(來自次高16位的進位值)相加,完成后,CF中記錄本次相加的進位值。,11.6adc指令,程序代碼movax,001EHmovbx,0F000Hmovcx,1000Haddcx,1EF0Hadcbx,1000Hadcax,0020H,11.6adc指令,下面我們,編寫一個子程序,對兩個128位數(shù)據(jù)進行相加。名稱:add128功能:兩個128位數(shù)據(jù)進行相加參數(shù),11.6adc指令,參數(shù):ds:si指向存儲第一個數(shù)的內(nèi)存空間,因數(shù)據(jù)為128位,所以需要8個字單元,由低地址單元到高地址單元依次存放128位數(shù)據(jù)由低到高的各個字。運算結果存儲在第一個數(shù)的存儲空間中。ds:di指向存儲第二個數(shù)的內(nèi)存空間程序代碼思考,11.6adc指令,思考:inc和loop指令不影響CF位,上面的程序中,能不能將4個inc指令,用:addsi,2addsi,2取代?,11.7sbb指令,sbb是帶錯位減法指令,它利用了CF位上記錄的借位值。格式:sbb操作對象1,操作對象2功能:操作對象1=操作對象1–操作對象2–CF比如:sbbax,bx實現(xiàn)功能:(ax)=(ax)–(bx)–CF,11.7sbb指令,sbb指令執(zhí)行后,將對CF進行設置。利用sbb指令我們可以對任意大的數(shù)據(jù)進行減法運算。,11.7sbb指令,比如,計算003E100OH–00202000H,結果放在ax,bx中,程序如下:movbx,1000Hmovax,003EHsubbx,2000Hsbbax,0020H,11.7sbb指令,sbb和adc是基于同樣的思想設計的兩條指令,在應用思路上和adc類似。在這里,我們就不再進行過多的討論。通過學習這兩條指令,我們可以進一步領會一下標志寄存器CF位的作用和意義。,11.8cmp指令,cmp是比較指令,功能相當于減法指令,只是不保存結果。cmp指令執(zhí)行后,將對標志寄存器產(chǎn)生影響。其他相關指令通過識別這些被影響的標志寄存器位來得知比較結果。,11.8cmp指令,cmp指令格式:cmp操作對象1,操作對象2功能:計算操作對象1–操作對象2但并不保存結果,僅僅根據(jù)計算結果對標志寄存器進行設置。,11.8cmp指令,比如:cmpax,ax做(ax)–(ax)的運算,結果為0,但并不在ax中保存,僅影響flag的相關各位。指令執(zhí)行后:ZF=1,PF=1,SF=0,CF=0,OF=0。,11.8cmp指令,下面的指令:movax,8movbx,3cmpax,bx執(zhí)行后:(ax)=8,ZF=0,PF=1,SF=0,CF=0,OF=0。,11.8cmp指令,其實,我們通過cmp指令執(zhí)行后,相關標志位的值就可以看出比較的結果。cmpax,bx,11.8cmp指令,現(xiàn)在我們可以看出比較指令的設計思路,即:通過做減法運算,影響標志寄存器,標志寄存器的相關位記錄了比較的結果。反過來看上面的例子cmpax,bx,11.8cmp指令,指令cmpax,bx的邏輯含意是比較ax和bx中的值,如果執(zhí)行后:,11.8cmp指令,同add、sub指令一樣,CPU在執(zhí)行cmp指令的時候,也包含兩種含義:進行無符號數(shù)運算和進行有符號數(shù)運算。所以利用cmp指令可以對無符號數(shù)進行比較,也可以對有符號數(shù)進行比較。,11.8cmp指令,上面所講的是用cmp進行無符號數(shù)比較時,相關標志位對比較結果的記錄。下面我們再來看一下如果用cmp來進行有符號數(shù)比較時,CPU用哪些標志位對比較結果進行記錄。,11.8cmp指令,我們以cmpah,bh為例進行說明:cmpah,bh如果(ah)=(bh)則(ah)-(bh)=0,所以:ZF=1;如果(ah)≠(bh)則(ah)-(bh)≠0,所以:ZF=0;所以,我們根據(jù)cmp指令執(zhí)行后ZF的值,就可以知道兩個數(shù)據(jù)是否相等。,11.8cmp指令,我們繼續(xù)看,如果(ah)<(bh)則可能發(fā)生什么情況呢?對于有符號數(shù)運算,在(ah)<(bh)情況下,(ah)-(bh)顯然可能引起SF=1,即結果為負。,11.8cmp指令,比如:(ah)=1,(bh)=2:則(ah)-(bh)=0FFH,0FFH為-1的補碼,因為結果為負,所以SF=1。(ah)=0FEH,(bx)=0FFH:則(ah)-(bh)=2-(-1)=0FFH,因為結果為負,所以SF=1。,11.8cmp指令,通過上面的例子,我們是不是可以得到這樣的結論:cmp操作對象1,操作對象2指令執(zhí)行后,SF=1,就說明操作對象1<操作對象2?當然不是。我們再看兩個例子。,11.8cmp指令,(ah)=22H,(bh)=0A0H:則(ah)-(bh)=34-(-96)=82H,82H是-126的補碼,所以SF=1。這里雖然SF=1,但是并不能說明(ah)-96。,11.8cmp指令,兩個有符號數(shù)A和B相減,得到的是負數(shù),那么可以肯定A- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 匯編語言講 匯編語言 PPT 課件
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://italysoccerbets.com/p-3205629.html