匯編11標(biāo)志寄存器課件_第1頁
匯編11標(biāo)志寄存器課件_第2頁
匯編11標(biāo)志寄存器課件_第3頁
匯編11標(biāo)志寄存器課件_第4頁
匯編11標(biāo)志寄存器課件_第5頁
已閱讀5頁,還剩99頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第11章標(biāo)志寄存器 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檢測比較結(jié)果的條件轉(zhuǎn)移指令11.10DF標(biāo)志和串傳送指令11.11pushf和popf11.12標(biāo)志寄存器在Debug中的表示引言8086CPU的標(biāo)志寄存器有16位,其中存儲的信息通常被稱為程序狀態(tài)字(PSW)。我們己經(jīng)使用過8086CPU的ax、bx、cx、dx、si、di、bp、sp、ip、cs、ss、ds、es等13個寄存器了。本章中的標(biāo)志寄存器(以下簡稱為flag)是我們要學(xué)習(xí)的最后一個寄存器。引言flag和其他寄存器不一樣,其他寄存器是用來存放數(shù)據(jù)的,都是整個寄存器具有一個含義。而flag寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的信息。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)志注意:在8086CPU的指令集中,有的指令的執(zhí)行是影響標(biāo)志寄存器的,比如:add、sub、mul、div、inc、or、and等,它們大都是運(yùn)算指令(進(jìn)行邏輯或算術(shù)運(yùn)算);有的指令的執(zhí)行對標(biāo)志寄存器沒有影響,比如:mov、push、pop等,它們大都是傳送指令。11.2PF標(biāo)志示例指令:moval,1addal,10執(zhí)行后,結(jié)果為00001011B,其中有3(奇數(shù))個1,則PF=0;指令:moval,1oral,10執(zhí)行后,結(jié)果為00000011B,其中有2(偶數(shù))個1,則PF=1;11.3SF標(biāo)志flag的第7位是SF,符號標(biāo)志位。它記錄指令執(zhí)行后,結(jié)果為負(fù),SF=1;結(jié)果為正,SF=0。示例moval,10000001Baddal,1結(jié)果:(al)=10000010B我們可以將add指令進(jìn)行的運(yùn)算當(dāng)作無符號數(shù)的運(yùn)算,那么add指令相當(dāng)于計算129+1,結(jié)果為130(10000010B);也可以將add指令進(jìn)行的運(yùn)算當(dāng)作有符號數(shù)的運(yùn)算,那么add指令相當(dāng)于計算-127+1,結(jié)果為-126(10000010B)。11.3SF標(biāo)志比如:moval,10000001B

addal,1執(zhí)行后,結(jié)果為10000010B,SF=1,表示:如果指令進(jìn)行的是有符號數(shù)運(yùn)算,那么結(jié)果為負(fù);

11.4CF標(biāo)志flag的第0位是CF,進(jìn)位標(biāo)志位。一般情況下,在進(jìn)行無符號數(shù)運(yùn)算的時候,它記錄了運(yùn)算結(jié)果的最高有效位向更高位的進(jìn)位值,或從更高位的借位值。11.4CF標(biāo)志對于位數(shù)為N的無符號數(shù)來說,其對應(yīng)的二進(jìn)制信息的最高位,即第N-1位,而假想存在的第N位,就是相對于最高有效位的更高位。11.4CF標(biāo)志當(dāng)兩個數(shù)據(jù)相加的時候,有可能產(chǎn)生從最高有效位向更高位的進(jìn)位。比如:98H+98H,將產(chǎn)生進(jìn)位。由于這個進(jìn)位值在8位數(shù)中無法保存,我們在前面的課程中,就只是簡單地說這個進(jìn)位值丟失了。11.4CF標(biāo)志比如,下面的指令:

moval,98Haddal,al;執(zhí)行后:(al)=30H,CF=1,;CF記錄了最高有效位向更高位的進(jìn)位值addal,al;執(zhí)行后:(al)=30H,CF=1,;CF記錄了最高有效位向更高位的進(jìn)位值11.4CF標(biāo)志而當(dāng)兩個數(shù)據(jù)做減法的時候,有可能向更高位借位。比如:97H-98H,將產(chǎn)生借位,借位后,相當(dāng)于計算197H-98H。而flag的CF位也可以用來記錄這個借位值。

11.4CF標(biāo)志比如,下面的指令:

moval,98Haddal,al;執(zhí)行后:(al)=30H,CF=1,;CF記錄了最高有效位向更高位的進(jìn)位值

addal,al;執(zhí)行后:(al)=30H,CF=1,;CF記錄了最高有效位向更高位的進(jìn)位值11.5OF標(biāo)志示例指令moval,98

addal,99執(zhí)行后將產(chǎn)生溢出。因為addal,99進(jìn)行的有符號數(shù)運(yùn)算是:(al)=(al)+99=98+99=197而結(jié)果197超出了機(jī)器所能表示的8位有符號數(shù)的范圍:-128~127。11.5OF標(biāo)志示例指令:moval,0F0H;0F0H,為有符號數(shù)-16的補(bǔ)碼

addal,88H;88H,為有符號數(shù)-120的補(bǔ)碼執(zhí)行后將產(chǎn)生溢出。因為addal,88H進(jìn)行的有符號數(shù)運(yùn)算是:(al)=(al)+(-120)=(-16)+(-120)=-136而結(jié)果-136超出了機(jī)器所能表示的8位有符號數(shù)的范圍:-128~127。11.5OF標(biāo)志如果在進(jìn)行有符號數(shù)運(yùn)算時發(fā)生溢出,那么運(yùn)算的結(jié)果將不正確。就上面的兩個例子來說:

moval,98

addal,99

add指令運(yùn)算的結(jié)果是(al)=0C5H,因為進(jìn)行的是有符號數(shù)運(yùn)算,所以al中存儲的是有符號數(shù),而0C5H是有符號數(shù)-59的補(bǔ)碼。11.5OF標(biāo)志同樣,對于:moval,0F0H;0F0H,為有符號數(shù)-16的補(bǔ)碼

addal,88H;88H,為有符號數(shù)-120的補(bǔ)碼add指令運(yùn)算的結(jié)果是(al)=78H,因為進(jìn)行的是有符號數(shù)運(yùn)算,所以al中存儲的是有符號數(shù),而78H表示有符號數(shù)120。11.5OF標(biāo)志由于在進(jìn)行有符號數(shù)運(yùn)算時,可能發(fā)生溢出而造成結(jié)果的錯誤。則CPU需要對指令執(zhí)行后是否產(chǎn)生溢出進(jìn)行記錄。flag的第11位是OF,溢出標(biāo)志位。11.5OF標(biāo)志一般情況下,OF記錄了有符號數(shù)運(yùn)算的結(jié)果是否發(fā)生了溢出。如果發(fā)生溢出,OF=1,如果沒有,OF=0。11.5OF標(biāo)志比如:moval,98

addal,99add指令執(zhí)行后:CF=0,OF=1。CPU在執(zhí)行add等指令的時候,就包含了兩種含義:無符號數(shù)運(yùn)算和有符號數(shù)運(yùn)算。對于無符號數(shù)運(yùn)算,CPU用CF位來記錄是否產(chǎn)生了進(jìn)位;對于有符號數(shù)運(yùn)算,CPU用OF位來記錄是否產(chǎn)生了溢出11.5OF標(biāo)志對于無符號數(shù)運(yùn)算,98+99沒有進(jìn)位,CF=0;對于有符號數(shù)運(yùn)算,98+99發(fā)生溢出,OF=1。

11.5OF標(biāo)志moval,0F0H

addal,88H

add指令執(zhí)行后:CF=1,OF=1。對于無符號數(shù)運(yùn)算,0F0H+88H有進(jìn)位,CF=1;對于有符號數(shù)運(yùn)算,0F0H+88H發(fā)生溢出,OF=1。11.5OF標(biāo)志moval,0F0H

addal,78H

add指令執(zhí)行后:CF=1,OF=0。對于無符號運(yùn)算,0F0H+78H有進(jìn)位,CF=1;對于有符號數(shù)運(yùn)算,0F0H+78H不發(fā)生溢出,OF=0。

11.5OF標(biāo)志CF和OF所表示的進(jìn)位和溢出,是分別對無符號數(shù)和有符號數(shù)運(yùn)算而言的,它們之間沒有任何關(guān)系。11.6adc指令adc是帶進(jìn)位加法指令,它利用了CF位上記錄的進(jìn)位值。格式:adc操作對象1,操作對象2功能:操作對象1=操作對象1+操作對象2+CF比如:adcax,bx實現(xiàn)的功能是:(ax)=(ax)+(bx)+CF11.6adc指令adc指令示例(一)movax,2

movbx,1

subbx,ax

adcax,l執(zhí)行后,(ax)=4。adc執(zhí)行時,相當(dāng)于計算:(ax)+1+CF=2+1+1=4。11.6adc指令adc指令示例(二)movax,1

addax,ax

adcax,3執(zhí)行后,(ax)=5。adc執(zhí)行時,相當(dāng)于計算:(ax)+3+CF=2+3+0=5。11.6adc指令adc指令示例(三)moval,98H

addal,al

adcal,3執(zhí)行后,(ax)=34H。adc執(zhí)行時,相當(dāng)于計算:(ax)+3+CF=30H+3+1=34H。11.6adc指令編程計算1EF0001000H+2010001EF0H,結(jié)果放在ax(高16位),bx(次高16位),cx(低16位)中。

分析11.6adc指令分析:計算分3步進(jìn)行:(1)先將低16位相加,完成后,CF中記錄本次相加的進(jìn)位值;(2)再將次高16位和CF(來自低16位的進(jìn)位值)相加,完成后,CF中記錄本次相加的進(jìn)位值;(3)最后高16位和CF(來自次高16位的進(jìn)位值)相加,完成后,CF中記錄本次相加的進(jìn)位值。11.6adc指令程序代碼movax,001EHmovbx,0F000Hmovcx,1000Haddcx,1EF0Hadcbx,1000Hadcax,0020H11.6adc指令編寫一個子程序,對兩個128位數(shù)據(jù)進(jìn)行相加。名稱:add128功能:兩個128位數(shù)據(jù)進(jìn)行相加參數(shù)11.6adc指令參數(shù):ds:si指向存儲第一個數(shù)的內(nèi)存空間,因數(shù)據(jù)為128位,所以需要8個字單元,由低地址單元到高地址單元依次存放128位數(shù)據(jù)由低到高的各個字。運(yùn)算結(jié)果存儲在第一個數(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)–CF11.7sbb指令sbb指令執(zhí)行后,將對CF進(jìn)行設(shè)置。利用sbb指令我們可以對任意大的數(shù)據(jù)進(jìn)行減法運(yùn)算。11.7sbb指令比如,計算003E100OH–00202000H,結(jié)果放在ax,bx中,程序如下:movbx,1000Hmovax,003EHsubbx,2000Hsubax,0020H11.8cmp指令cmp是比較指令,功能相當(dāng)于減法指令,只是不保存結(jié)果。cmp指令執(zhí)行后,將對標(biāo)志寄存器產(chǎn)生影響。其他相關(guān)指令通過識別這些被影響的標(biāo)志寄存器位來得知比較結(jié)果。11.8cmp指令cmp指令格式:cmp操作對象1,操作對象2功能:計算操作對象1–操作對象2但并不保存結(jié)果,僅僅根據(jù)計算結(jié)果對標(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指令其實,我們通過cmp指令執(zhí)行后,相關(guān)標(biāo)志位的值就可以看出比較的結(jié)果。cmpax,bx11.8cmp指令現(xiàn)在我們可以看出比較指令的設(shè)計思路,即:通過做減法運(yùn)算,影響標(biāo)志寄存器,標(biāo)志寄存器的相關(guān)位記錄了比較的結(jié)果。11.8cmp指令指令cmpax,bx的邏輯含意是比較ax和bx中的值,如果執(zhí)行后:11.8cmp指令同add、sub指令一樣,CPU在執(zhí)行cmp指令的時候,也包含兩種含義:進(jìn)行無符號數(shù)運(yùn)算和進(jìn)行有符號數(shù)運(yùn)算。所以利用cmp指令可以對無符號數(shù)進(jìn)行比較,也可以對有符號數(shù)進(jìn)行比較。11.8cmp指令上面所講的是用cmp進(jìn)行無符號數(shù)比較時,相關(guān)標(biāo)志位對比較結(jié)果的記錄。下面我們再來看一下如果用cmp來進(jìn)行有符號數(shù)比較時,CPU用哪些標(biāo)志位對比較結(jié)果進(jìn)行記錄。11.8cmp指令以cmpah,bh為例,總結(jié)一下CPU執(zhí)行cmp指令后,SF和OF的值是如何來說明比較的結(jié)果的。11.8cmp指令(1)如果SF=1,而OF=0OF=0,說明沒有溢出,邏輯上真正結(jié)果的正負(fù)=實際結(jié)果的正負(fù);因SF=1,實際結(jié)果為負(fù),所以邏輯上真正的結(jié)果為負(fù),所以(ah)<(bh)。11.8cmp指令(2)如果SF=1,而OF=1OF=1,說明有溢出,邏輯上真正結(jié)果的正負(fù)≠實際結(jié)果的正負(fù);因SF=1,實際結(jié)果為負(fù),實際結(jié)果為負(fù),而又有溢出,這說明是由于溢出導(dǎo)致了實際結(jié)果為負(fù),簡單分析一下,就可以看出,如果因為溢出導(dǎo)致了實際結(jié)果為負(fù),那么邏輯上真正的結(jié)果必然為正。這樣,SF=1,OF=1,說明了(ah)>(bh)。11.8cmp指令(3)如果SF=0,而OF=1OF=1,說明有溢出,邏輯上真正結(jié)果的正負(fù)≠實際結(jié)果的正負(fù);因SF=0,實際結(jié)果非負(fù),而OF=1說明有溢出,則結(jié)果非0,所以,實際結(jié)果為正。實際結(jié)果為正,而又有溢出,這說明是由于溢出導(dǎo)致了實際結(jié)果非負(fù),簡單分析一下,就可以看出,如果因為溢出導(dǎo)致了實際結(jié)果為正,那么邏輯上真正的結(jié)果必然為負(fù)。這樣,SF=0,OF=1,說明了(ah)<(bh)。11.8cmp指令(4)如果SF=0,而OF=0OF=0,說明沒有溢出,邏輯上真正結(jié)果的正負(fù)=實際結(jié)果的正負(fù);因SF=0,實際結(jié)果非負(fù),所以邏輯上真正的結(jié)果必然非負(fù)。所以(ah)≥(bh)。結(jié)論:

SF異或OF=1,肯定是小于的情形SF異或OF=0,是大于或者等于的情形11.8cmp指令上面,我們深入討論了cmp指令在進(jìn)行有符號數(shù)和無符號數(shù)比較時,對flag相關(guān)標(biāo)志位的影響,和CPU如何通過相關(guān)的標(biāo)志位來表示比較的結(jié)果。在學(xué)習(xí)中,要注意領(lǐng)會8086CPU這種工作機(jī)制的設(shè)計思想。實際上,這種設(shè)計思想對于各種處理機(jī)來說是普遍的。11.8cmp指令下面的內(nèi)容中我們將學(xué)習(xí)一些根據(jù)cmp指令的比較結(jié)果(即,cmp指令執(zhí)行后,相關(guān)標(biāo)志位的值)進(jìn)行工作的指令。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令“轉(zhuǎn)移”指的是它能夠修改IP,而“條件”指的是它可以根據(jù)某種條件,決定是否修改IP。比如:jcxz就是一個條件轉(zhuǎn)移指令,它可以檢測cx中的數(shù)值,如果(cx)=0,就修改IP,否則什么也不做。所有條件轉(zhuǎn)移指令的轉(zhuǎn)移位移都是[-128,127]。

11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令除了jcxz之外,CPU還提供了其他條件轉(zhuǎn)移指令,大多數(shù)條件轉(zhuǎn)移指令都檢測標(biāo)志寄存器的相關(guān)標(biāo)志位,根據(jù)檢測的結(jié)果來決定是否修改IP。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令它們檢測的是哪些標(biāo)志位呢?就是被cmp指令影響的那些,表示比較結(jié)果的標(biāo)志位。這些條件轉(zhuǎn)移指令通常都和cmp相配合使用,就好像call和ret指令通常相配合使用一樣。

11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令因為cmp指令可以同時進(jìn)行兩種比較,無符號數(shù)比較和有符號數(shù)比較,所以根據(jù)cmp指令的比較結(jié)果進(jìn)行轉(zhuǎn)移的指令也分為兩種,即:根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令,它們檢測ZF、CF的值;和根據(jù)有符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令,它們檢測SF、OF和ZF的值。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令我們看一下根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令。下表是常用的根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令助記:e:表示equal;ne:表示notequal;b:表示below;nb:表示notbelow;a:表示above;na:表示notabove。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令注意觀察一下它們所檢測的標(biāo)志位,都是cmp指令進(jìn)行無符號數(shù)比較時候,記錄比較結(jié)果的標(biāo)志位。比如je,檢測ZF位,當(dāng)ZF=1的時候進(jìn)行轉(zhuǎn)移,如果在je前面使用了cmp指令,那么je對ZF的檢測,實際上就是間接地檢測cmp的比較結(jié)果是否為兩數(shù)相等。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令編程實現(xiàn)如下功能:如果(ah)=(bh)則(ah)=(ah)+(ah),否則(ah)=(ah)+(bh)。cmpah,bhjesaddah,bhjmpshortoks:addah,ahok:ret11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令至于究竟在je之前使不使用cmp指令,在于我們的安排。je檢測的是ZF位置,不管je前面是什么指令,只要CPU執(zhí)行je指令時,ZF=1,那么就會發(fā)生轉(zhuǎn)移。比如11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令比如:movax,0addax,0jesincaxs:incax執(zhí)行后,(ax)=1。addax,0使得ZF=1,所以je指令將進(jìn)行轉(zhuǎn)移。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令對于jne、jb、jnb、ja、jna等指令和cmp指令配合使用的思想和je相同11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令我們來看一組程序:data段中的8個字節(jié)如下:datasegmentdb8,11,8,1,8,5,63,38dataends(1)編程:統(tǒng)計data段中數(shù)值為8的字節(jié)的個數(shù),用ax保存統(tǒng)計結(jié)果。(2)編程:統(tǒng)計data段中數(shù)值大于8的字節(jié)的個數(shù),用ax保存統(tǒng)計結(jié)果。(3)編程:統(tǒng)計data段中數(shù)值小于8的字節(jié)的個數(shù),用ax保存統(tǒng)計結(jié)果。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令(1)編程:統(tǒng)計data段中數(shù)值為8的字節(jié)的個數(shù),用ax保存統(tǒng)計結(jié)果。編程思路:初始設(shè)置(ax)=0,然后用循環(huán)依次比較每個字節(jié)的值,找到一個和8相等的數(shù)就將ax的值加1。程序如下另一種實現(xiàn)方式11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令movax,datamovds,axmovbx,0;ds:bx指向第一個字節(jié)movax,0;初始化累加器movcx,0s:cmpbyteptr[bx],8;和8進(jìn)行比較jnenext;如果不相等轉(zhuǎn)到next,繼續(xù)循環(huán)incax;如果相等就將計數(shù)值加1next:incbxloops;程序執(zhí)行后:(ax)=311.9檢測比較結(jié)果的條件轉(zhuǎn)移指令movax,datamovds,axmovbx,0;ds:bx指向第一個字節(jié)movax,0;初始化累加器movcx,0s:cmpbyteptr[bx],8;和8進(jìn)行比較jeok;如果相等就轉(zhuǎn)到ok,繼續(xù)循環(huán)jmpshortnext;如果不相等就轉(zhuǎn)到next,繼續(xù)循環(huán)ok:incax;如果相等就將計數(shù)值加1next:incbxloops11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令比起第一個程序,它直接的遵循了“等于8則計數(shù)值加1”的原則,用je指令檢測等于8的情況,但是沒有第一個程序精簡。第一個程序用jne檢測不等于8的情況,從而間接地檢測等于8的情況。要注意在使用cmp和條件轉(zhuǎn)移指令時的這種編程思想。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令(2)編程:統(tǒng)計data段中數(shù)值大于8的字節(jié)的個數(shù),用ax保存統(tǒng)計結(jié)果。編程思路:初始設(shè)置(ax)=0,然后用循環(huán)依次比較每個字節(jié)的值,找到一個大于8的數(shù)就將ax的值加1。程序如下11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令movax,datamovds,axmovbx,0;ds:bx指向第一個字節(jié)movax,0;初始化累加器movcx,0s:cmpbyteptr[bx],8;和8進(jìn)行比較jnenext;如果不大于8轉(zhuǎn)到next,繼續(xù)循環(huán)incax;如果大于8就將計數(shù)值加1next:incbxloops;程序執(zhí)行后:(ax)=311.9檢測比較結(jié)果的條件轉(zhuǎn)移指令(3)編程:統(tǒng)計data段中數(shù)值小于8的字節(jié)的個數(shù),用ax保存統(tǒng)計結(jié)果。編程思路:初始設(shè)置(ax)=0,然后用循環(huán)依次比較每個字節(jié)的值,找到一個小于8的數(shù)就將ax的值加1。程序如下11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令movax,datamovds,axmovbx,0;ds:bx指向第一個字節(jié)movax,0;初始化累加器movcx,0s:cmpbyteptr[bx],8;和8進(jìn)行比較jnbnext;如果不小于8轉(zhuǎn)到next,繼續(xù)循環(huán)incax;如果小于8就將計數(shù)值加1next:incbxloops;程序執(zhí)行后:(ax)=211.9檢測比較結(jié)果的條件轉(zhuǎn)移指令上面講解了根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令。根據(jù)有符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令的工作原理和無符號的相同,只是檢測了不同的標(biāo)志位。11.9檢測比較結(jié)果的條件轉(zhuǎn)移指令我們在這里主要探討的是cmp、標(biāo)志寄存器的相關(guān)位、條件轉(zhuǎn)移指令三者配合應(yīng)用的原理,這個原理具有普遍性,而不是逐條講解條件轉(zhuǎn)移指令。條件轉(zhuǎn)移指令—涉及單個條件標(biāo)志指令 含義 檢測的標(biāo)志位JZ 為0轉(zhuǎn)移 ZF=1JNZ 不為0轉(zhuǎn)移 ZF=0JS 為負(fù)轉(zhuǎn)移 SF=1JNS 為正轉(zhuǎn)移 SF=0JO 溢出轉(zhuǎn)移 OF=1JNO 不溢出轉(zhuǎn)移 OF=0JP|JPE 為奇轉(zhuǎn)移 PF=1JNP|JPO 為偶轉(zhuǎn)移 PF=0JC 有進(jìn)位轉(zhuǎn)移 CF=1JNC 無進(jìn)位轉(zhuǎn)移 CF=0條件轉(zhuǎn)移指令—涉及無符號數(shù)的比較指令 含義 檢測的標(biāo)志位JZ 相等轉(zhuǎn)移 ZF=1JNZ 不相等轉(zhuǎn)移 ZF=0JB 小于則轉(zhuǎn)移 CF=1JNB 不小于則轉(zhuǎn)移 CF=0JA 大于則轉(zhuǎn)移 CF=0且ZF=0JNA 不大于則轉(zhuǎn)移 CF=1或者ZF=1條件轉(zhuǎn)移指令—涉及有符號數(shù)的比較指令 含義 檢測的標(biāo)志位JZ 相等轉(zhuǎn)移 ZF=1JNZ 不相等轉(zhuǎn)移 ZF=0JL 小于則轉(zhuǎn)移 SF或OF=1JNL 不小于則轉(zhuǎn)移 SF或OF=0JG 大于則轉(zhuǎn)移 SF異或OF=0且ZF=0JNG 不大于則轉(zhuǎn)移 SF異或OF=1或者ZF=111.10DF標(biāo)志和串傳送指令flag的第10位是DF,方向標(biāo)志位。在串處理指令中,控制每次操作后si,di的增減。DF=0:每次操作后si,di遞增;DF=1:每次操作后si,di遞減。11.10DF標(biāo)志和串傳送指令格式1:movsb功能:(以字節(jié)為單位傳送)(1)((es)×16+(di))=((ds)×16+(si))(2)如果DF=0則:(si)=(si)+1(di)=(di)+1如果DF=1則:(si)=(si)-1(di)=(di)-111.10DF標(biāo)志和串傳送指令用匯編語法描述movsb的功能如下:moves:[di],byteptrds:[si]8086并不支持這樣的指令。 如果DF=0:incsiincdi如果DF=1:decsidecdi11.10DF標(biāo)志和串傳送指令movsb的功能是將ds:si指向的內(nèi)存單元中的字節(jié)送入es:di中,然后根據(jù)標(biāo)志寄存器DF位的值,將si和di遞增或遞減。也可以傳送一個字,movsw指令11.10DF標(biāo)志和串傳送指令格式2:movsw功能:(以字為單位傳送)將ds:si指向的內(nèi)存字單元中word送入es:di中,然后根據(jù)標(biāo)志寄存器DF位的值,將si和di遞增2或遞減2。11.10DF標(biāo)志和串傳送指令用匯編語法描述movsw的功能:moves:[di],wordptrds:[si] 如果DF=0:addsi,2adddi,2如果DF=1:subsi,2subdi,211.10DF標(biāo)志和串傳送指令一般來說,movsb和movsw都和rep配合使用,格式如下:repmovsb

用匯編語法來描述repmovsb的功能就是:

s:movsb

loopsrepmovsw

用匯編語法來描述repmovsw的功能就是:

s:movsw

loops

11.10DF標(biāo)志和串傳送指令rep的作用:是根據(jù)cx的值,重復(fù)執(zhí)行后面的串傳送指令。由于每執(zhí)行一次movsb指令si和di都會遞增或遞減指向后一個單元或前個單元,則repmovsb就可以循環(huán)實現(xiàn)(cx)個字符的傳送。11.10DF標(biāo)志和串傳送指令flag的DF位決定著串傳送指令執(zhí)行后,si和di改變的方向,所以CPU應(yīng)該提供相應(yīng)的指令來對DF位進(jìn)行設(shè)置,從而使程序員能夠決定傳送的方向。

11.10DF標(biāo)志和串傳送指令8086CPU提供下而兩條指令對DF位進(jìn)行設(shè)置:cld指令:將標(biāo)志寄存器的DF位置0std指令:將標(biāo)志寄存器的DF位置1我們來看兩個程序

編程1

編程211.10DF標(biāo)志和串傳送指令編程:用串傳送指令,將data段中的第一個字符串復(fù)制到它后面的空間中。datasegmentdb‘Welcometomasm!’db16dup(0)dataends分析11.10DF標(biāo)志和串傳送指令分析:使用串傳送指令進(jìn)行數(shù)據(jù)的傳送,需要給它提供一些必要的信息,它們是:①傳送的原始位置:ds:si;②傳送的目的位置:es:di;③傳送的長度:cx;④傳送的方向:DF。

11.10DF標(biāo)志和串傳送指令在這個問題中,這些信息如下:①傳送的原始位置:data:0;②傳送的目的位置:data:16;③傳送的長度:16;④傳送的方向:因為正向傳送(每次串傳送指令執(zhí)行后,si和di遞增)比較方便,所以設(shè)置DF=0。程序11.10DF標(biāo)志和串傳送指令

movax,datamovds,axmovsi,0;ds:si指向data:0moves,axmovdi,16;es:di指向data:16movcx,16;(cx)=16,rep循環(huán)16次cld;設(shè)置DF=0,正向傳送repmovsb11.10DF標(biāo)志和串傳送指令編程:用串傳送指令,將F000H段中的最后16個字符復(fù)制到data段中。datasegmentdb16dup(0)dataends分析11.10DF標(biāo)志和串傳送指令我們還是先來看一下應(yīng)該為串傳送指令提供什么樣的信息:要傳送的字符串位于F000H段的最后16個單元中,那么它的最后一個字符的位置:F000:FFFF,是顯而易見的。我們可以將ds:si指向F000H段的最后一個單元,將es:di指向data段中的最后一個單元,然后逆向(即從高地址向低地址)傳送16個字節(jié)即可。11.10DF標(biāo)志和串傳送指令相關(guān)信息如下:①傳送的原始位置:F000:FFFF;②傳送的目的位置:data:15;③傳送的長度:16;④傳送的方向:因為逆向傳送(每次串傳送指令執(zhí)行后,si和di遞減)比較方便,所以設(shè)置DF=1。

程序代碼11.10DF標(biāo)志和串傳送指令

movax,0f000hmovds,axmovsi,0ffffh;ds:si指向f000:ffffmovax,datamoves,axmovdi,15;es:di指向data:15

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論