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