《匯編語言》講稿_11_第1頁
《匯編語言》講稿_11_第2頁
《匯編語言》講稿_11_第3頁
《匯編語言》講稿_11_第4頁
《匯編語言》講稿_11_第5頁
已閱讀5頁,還剩151頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1匯編語言課件Microsoft PowerPoint2003本課件由匯編網(wǎng)()制作提供第11章 標(biāo)志寄存器n11.1 ZF標(biāo)志n11.2 PF標(biāo)志n11.3 SF標(biāo)志n11.4 CF標(biāo)志n11.5 OF標(biāo)志n11.6 adc指令n11.7 sbb指令n11.8 cmp指令n11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n11.10 DF標(biāo)志和串傳送指令n11.11 pushf和popfn11.12 標(biāo)志寄存器在Debug中的表示本課件由匯編網(wǎng)()制作提供引言n8086CPU的標(biāo)志寄存器有16位,其中存儲的信息通常被稱為程序狀態(tài)字(PSW)。n我們己經(jīng)使用過8086CPU的ax、bx、cx、dx、si、

2、di、bp、sp、ip、cs、ss、ds、es等13個(gè)寄存器了。n本章中的標(biāo)志寄存器(以下簡稱為flag)是我們要學(xué)習(xí)的最后一個(gè)寄存器。本課件由匯編網(wǎng)()制作提供引言nflag 和其他寄存器不一樣,其他寄存器是用來存放數(shù)據(jù)的,都是整個(gè)寄存器具有一個(gè)含義。n而flag寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的信息。本課件由匯編網(wǎng)()制作提供引言n8086CPU的flag寄存器的結(jié)構(gòu):nflag的1、3、5、12、13、14、15位在8086CPU中沒有使用,不具有任何含義。而0、2、4、6、7、8、9、10、11位都具有特殊的含義。本課件由匯編網(wǎng)()制作提供引言n在這一

3、章中,我們學(xué)習(xí)標(biāo)志寄存器中的CF、PF、ZF、SF、OF、DF 標(biāo)志位,和一些與其相關(guān)的典型指令。本課件由匯編網(wǎng)()制作提供11.1 ZF標(biāo)志nflag的第6位是ZF,零標(biāo)志位。 它記錄相關(guān)指令執(zhí)行后,n結(jié)果為0 ,ZF = 1n結(jié)果不為0,ZF = 0n示例本課件由匯編網(wǎng)()制作提供11.1 ZF標(biāo)志n比如: mov ax,1 sub ax,1 指令執(zhí)行后,結(jié)果為0,則ZF = 1。 mov ax,2 sub ax,1 指令執(zhí)行后,結(jié)果為1,則ZF = 0。本課件由匯編網(wǎng)()制作提供11.1 ZF標(biāo)志n對于ZF的值,我們可以這樣來看,ZF標(biāo)記相關(guān)指令的計(jì)算結(jié)果是否為0,如果為0,則在ZF要記

4、錄下“是0”這樣的肯定信息。n在計(jì)算機(jī)中1 表示邏輯真,表示肯定,所以當(dāng)結(jié)果為0的時(shí)候 ZF=1,表示“結(jié)果是0 ”。如果結(jié)果不為0,則ZF要記錄下“不是0”這樣的否定信息。n在計(jì)算機(jī)中0表示邏輯假,表示否定,所以當(dāng)結(jié)果不為0 的時(shí)候ZF=0,表示“結(jié)果不是0”。n示例本課件由匯編網(wǎng)()制作提供11.1 ZF標(biāo)志n示例 指令:mov ax,1 and ax,0 執(zhí)行后,結(jié)果為0,則ZF=1,表示“結(jié)果是0”。 指令:mov ax,1 or ax,0 執(zhí)行后,結(jié)果不為0,則ZF=0,表示“結(jié)果非0”。本課件由匯編網(wǎng)()制作提供11.1 ZF標(biāo)志n注意: 在8086CPU的指令集中,有的指令的執(zhí)行

5、是影響標(biāo)志寄存器的,比如:add、sub、mul、div、inc、or、and等,它們大都是運(yùn)算指令(進(jìn)行邏輯或算術(shù)運(yùn)算); 有的指令的執(zhí)行對標(biāo)志寄存器沒有影響,比如:mov、push、pop等,它們大都是傳送指令。本課件由匯編網(wǎng)()制作提供11.1 ZF標(biāo)志n注意: 我們在使用一條指令的時(shí)候,要注意這條指令的全部功能,其中包括,執(zhí)行結(jié)果對標(biāo)記寄存器的哪些標(biāo)志位造成影響。 本課件由匯編網(wǎng)()制作提供11.2 PF標(biāo)志nflag的第2位是PF,奇偶標(biāo)志位。 它記錄指令執(zhí)行后,結(jié)果的所有二進(jìn)制位中1的個(gè)數(shù):n為偶數(shù),PF = 1;n為奇數(shù),PF = 0。n示例本課件由匯編網(wǎng)()制作提供11.2 P

6、F標(biāo)志n示例n指令:mov al,1 add al,10 執(zhí)行后,結(jié)果為00001011B,其中有3(奇數(shù))個(gè)1,則PF=0;n指令:mov al,1 or al,10 執(zhí)行后,結(jié)果為00000011B,其中有2(偶數(shù))個(gè)1,則PF=1;本課件由匯編網(wǎng)()制作提供11.3 SF標(biāo)志nflag的第7位是SF,符號標(biāo)志位。 它記錄指令執(zhí)行后,n結(jié)果為負(fù),SF = 1;n結(jié)果為正,SF = 0。n有符號數(shù)與補(bǔ)碼n示例 mov al,10000001B add al,1 結(jié)果: (al)=10000010B本課件由匯編網(wǎng)()制作提供有符號數(shù)與補(bǔ)碼n我們知道計(jì)算機(jī)中通常用補(bǔ)碼來表示有符號數(shù)據(jù)。計(jì)算機(jī)中的

7、一個(gè)數(shù)據(jù)可以看作是有符號數(shù),也可以看成是無符號數(shù)。n比如:n00000001B ,可以看作為無符號數(shù) 1 ,或有符號數(shù)1;n10000001B ,可以看作為無符號數(shù)129,也可以看作有符號數(shù)-127。本課件由匯編網(wǎng)()制作提供有符號數(shù)與補(bǔ)碼n這也就是說,對于同一個(gè)二進(jìn)制數(shù)據(jù),計(jì)算機(jī)可以將它當(dāng)作無符號數(shù)據(jù)來運(yùn)算,也可以當(dāng)作有符號數(shù)據(jù)來運(yùn)算。 本課件由匯編網(wǎng)()制作提供11.3 SF標(biāo)志n我們可以將add指令進(jìn)行的運(yùn)算當(dāng)作無符號數(shù)的運(yùn)算,那么add指令相當(dāng)于計(jì)算129+1,結(jié)果為130(10000010B);n也可以將add指令進(jìn)行的運(yùn)算當(dāng)作有符號數(shù)的運(yùn)算,那么add指令相當(dāng)于計(jì)算-127+1,結(jié)

8、果為-126(10000010B)。本課件由匯編網(wǎng)()制作提供11.3 SF標(biāo)志n不管我們?nèi)绾慰创珻PU 在執(zhí)行add等指令的時(shí)候,就已經(jīng)包含了兩種含義,也將得到用同一種信息來記錄的兩種結(jié)果。n關(guān)鍵在于我們的程序需要哪一種結(jié)果。本課件由匯編網(wǎng)()制作提供11.3 SF標(biāo)志nSF 標(biāo)志,就是CPU對有符號數(shù)運(yùn)算結(jié)果的一種記錄 ,它記錄數(shù)據(jù)的正負(fù)。 在我們將數(shù)據(jù)當(dāng)作有符號數(shù)來運(yùn)算的時(shí)候,可以通過它來得知結(jié)果的正負(fù)。n如果我們將數(shù)據(jù)當(dāng)作無符號數(shù)來運(yùn)算,SF的值則沒有意義,雖然相關(guān)的指令影響了它的值。本課件由匯編網(wǎng)()制作提供11.3 SF標(biāo)志n這也就是說,CPU在執(zhí)行 add 等指令時(shí),是必然要影

9、響到SF標(biāo)志位的值的。n至于我們需不需要這種影響,那就看我們?nèi)绾慰创噶钏M(jìn)行的運(yùn)算了。本課件由匯編網(wǎng)()制作提供11.3 SF標(biāo)志n比如: mov al,10000001B add al,1 執(zhí)行后,結(jié)果為10000010B,SF=1, 表示:如果指令進(jìn)行的是有符號數(shù)運(yùn)算,那么結(jié)果為負(fù); 本課件由匯編網(wǎng)()制作提供11.3 SF標(biāo)志n再比如: mov al,10000001B add al,01111111B 執(zhí)行后,結(jié)果為0,SF=0, 表示:如果指令進(jìn)行的是有符號數(shù)運(yùn)算,那么結(jié)果為非負(fù)。本課件由匯編網(wǎng)()制作提供11.3 SF標(biāo)志n某此指令將影響標(biāo)志寄存器中的多個(gè)標(biāo)志位,這些被影響的標(biāo)記

10、位比較全面地記錄了指令的執(zhí)行結(jié)果,為相關(guān)的處理提供了所需的依據(jù)。n比如指令sub al,al執(zhí)行后,ZF、PF、SF等標(biāo)志位都要受到影響,它們分別為:1、1、0。 本課件由匯編網(wǎng)()制作提供特別提示n檢測點(diǎn)11.1(p205)n沒有完成此檢測點(diǎn),請不要向下進(jìn)行。本課件由匯編網(wǎng)()制作提供11.4 CF標(biāo)志nflag的第0位是CF,進(jìn)位標(biāo)志位。n一般情況下,在進(jìn)行無符號數(shù)運(yùn)算的時(shí)候,它記錄了運(yùn)算結(jié)果的最高有效位向更高位的進(jìn)位值,或從更高位的借位值。本課件由匯編網(wǎng)()制作提供11.4 CF標(biāo)志n對于位數(shù)為N的無符號數(shù)來說,其對應(yīng)的二進(jìn)制信息的最高位,即第N-1位,的最高有效位,而假想存在的第N位,

11、就是相對于最高有效位的更高位。本課件由匯編網(wǎng)()制作提供11.4 CF標(biāo)志n我們知道,當(dāng)兩個(gè)數(shù)據(jù)相加的時(shí)候,有可能產(chǎn)生從最高有效位向更高位的進(jìn)位。n比如,兩個(gè)8 位數(shù)據(jù):98H+98H,將產(chǎn)生進(jìn)位。 由于這個(gè)進(jìn)位值在8位數(shù)中無法保存,我們在前面的課程中,就只是簡單地說這個(gè)進(jìn)位值丟失了。本課件由匯編網(wǎng)()制作提供11.4 CF標(biāo)志n其實(shí)CPU在運(yùn)算的時(shí)候,并不丟棄這個(gè)進(jìn)位值,而是記錄在一個(gè)特殊的寄存器的某一位上。n8086CPU 就用flag的CF位來記錄這個(gè)進(jìn)位值。 本課件由匯編網(wǎng)()制作提供11.4 CF標(biāo)志n比如,下面的指令: mov al,98H add al,al ;執(zhí)行后: (al)

12、=30H,CF=1, ;CF記錄了最高有效位向更高位的進(jìn)位值 add al,al ;執(zhí)行后: (al)=30H,CF=1, ;CF記錄了最高有效位向更高位的進(jìn)位值本課件由匯編網(wǎng)()制作提供11.4 CF標(biāo)志n而當(dāng)兩個(gè)數(shù)據(jù)做減法的時(shí)候,有可能向更高位借位。n比如,兩個(gè) 8 位數(shù)據(jù):97H-98H,將產(chǎn)生借位,借位后,相當(dāng)于計(jì)算197H-98H。 而flag的CF位也可以用來記錄這個(gè)借位值。 本課件由匯編網(wǎng)()制作提供11.4 CF標(biāo)志n比如,下面的指令: mov al,98H add al,al ;執(zhí)行后: (al)=30H,CF=1, ;CF記錄了最高有效位向更高位的進(jìn)位值 add al,al

13、 ;執(zhí)行后: (al)=30H,CF=1, ;CF記錄了最高有效位向更高位的進(jìn)位值本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n我們先來談?wù)勔绯龅膯栴}。 在進(jìn)行有符號數(shù)運(yùn)算的時(shí)候,如結(jié)果超過了機(jī)器所能表示的范圍稱為溢出。n那么,什么是機(jī)器所能表示的范圍呢?本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n比如說,指令運(yùn)算的結(jié)果用 8 位寄存器或內(nèi)存單元來存放。n比如:add al,3 ,那么對于 8 位的有符號數(shù)據(jù),機(jī)器所能表示的范圍就是-128127。 同理,對于16 位有符號數(shù),機(jī)器所能表示的范圍是-3276832767。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n如果運(yùn)算結(jié)果超出了機(jī)器所能

14、表達(dá)的范圍,將產(chǎn)生溢出。n注意,這里所講的溢出,只是對有符號數(shù)運(yùn)算而言。n下面我們看兩個(gè)溢出的例子。 本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n示例指令 mov al,98 add al,99 執(zhí)行后將產(chǎn)生溢出。 因?yàn)閍dd al,99 進(jìn)行的有符號數(shù)運(yùn)算是:(al)=(al)+99=98+99=197 而結(jié)果197超出了機(jī)器所能表示的8位有符號數(shù)的范圍:-128127。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n示例指令: mov al,0F0H ;0F0H,為有符號數(shù)-16的補(bǔ)碼 add al,88H ;88H,為有符號數(shù)-120的補(bǔ)碼 執(zhí)行后將產(chǎn)生溢出。 因?yàn)閍dd al,88H進(jìn)

15、行的有符號數(shù)運(yùn)算是: (al)=(al)+(-120)=(-16)+(-120)=-136 而結(jié)果-136超出了機(jī)器所能表示的8位有符號數(shù)的范圍:-128127。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n如果在進(jìn)行有符號數(shù)運(yùn)算時(shí)發(fā)生溢出,那么運(yùn)算的結(jié)果將不正確。n就上面的兩個(gè)例子來說: mov al,98 add al,99 add指令運(yùn)算的結(jié)果是(al)=0C5H ,因?yàn)檫M(jìn)行的是有符號數(shù)運(yùn)算,所以 al中存儲的是有符號數(shù),而0C5H是有符號數(shù)-59的補(bǔ)碼。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n如果我們用add 指令進(jìn)行的是有符號數(shù)運(yùn)算,則98+99=-59這樣的結(jié)果讓人無法接受。

16、n造成這種情況的原因,就是實(shí)際的結(jié)果 197,作為一個(gè)有符號數(shù),在 8 位寄存器al中存放不下。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n同樣,對于: mov al,0F0H ;0F0H,為有符號數(shù)-16的補(bǔ)碼add al,88H ;88H,為有符號數(shù)-120的補(bǔ)碼 add指令運(yùn)算的結(jié)果是(al)=78H, 因?yàn)檫M(jìn)行的是有符號數(shù)運(yùn)算,所以 al中存儲的是有符號數(shù),而78H表示有符號數(shù)120。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n如果我們用add 指令進(jìn)行的是有符號數(shù)運(yùn)算,則-16-120=120這樣的結(jié)果顯然不正確。n造成這種情況的原因,就是實(shí)際的結(jié)果 -136,作為一個(gè)有符號數(shù),

17、在 8位寄存器al中存放不下。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n由于在進(jìn)行有符號數(shù)運(yùn)算時(shí),可能發(fā)生溢出而造成結(jié)果的錯(cuò)誤。 則CPU需要對指令執(zhí)行后是否產(chǎn)生溢出進(jìn)行記錄。nflag的第11位是OF,溢出標(biāo)志位。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n一般情況下,OF記錄了有符號數(shù)運(yùn)算的結(jié)果是否發(fā)生了溢出。n如果發(fā)生溢出,OF=1,n如果沒有,OF=0。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n一定要注意CF和OF的區(qū)別: CF是對無符號數(shù)運(yùn)算有意義的標(biāo)志位; 而OF是對有符號數(shù)運(yùn)算有意義的標(biāo)志位。 本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n比如: mov al,98 a

18、dd al,99 add指令執(zhí)行后:CF=0,OF=1。n前面我們講過,CPU在執(zhí)行add等指令的時(shí)候,就包含了兩種含義:無符號數(shù)運(yùn)算和有符號數(shù)運(yùn)算。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n對于無符號數(shù)運(yùn)算,CPU用CF位來記錄是否產(chǎn)生了進(jìn)位;n對于有符號數(shù)運(yùn)算,CPU 用 OF 位來記錄是否產(chǎn)生了溢出, 當(dāng)然,還要用SF位來記錄結(jié)果的符號。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n對于無符號數(shù)運(yùn)算,98+99沒有進(jìn)位,CF=0;n對于有符號數(shù)運(yùn)算,98+99發(fā)生溢出,OF=1。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志 mov al,0F0H add al,88H add指令執(zhí)行

19、后:CF=1,OF=1。n對于無符號數(shù)運(yùn)算,0F0H+88H有進(jìn)位,CF=1;n對于有符號數(shù)運(yùn)算,0F0H+88H發(fā)生溢出,OF=1。 本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志 mov al,0F0H add al,78H add指令執(zhí)行后:CF=1,OF=0。n對于無符號運(yùn)算,0F0H+78H有進(jìn)位,CF=1;n對于有符號數(shù)運(yùn)算,0F0H +78H不發(fā)生溢出,OF=0。本課件由匯編網(wǎng)()制作提供11.5 OF標(biāo)志n我們可以看出,CF 和OF 所表示的進(jìn)位和溢出,是分別對無符號數(shù)和有符號數(shù)運(yùn)算而言的,它們之間沒有任何關(guān)系。本課件由匯編網(wǎng)()制作提供特別提示n檢測點(diǎn)11.2 (page207

20、)n沒有完成此檢測點(diǎn),請不要向下進(jìn)行。本課件由匯編網(wǎng)()制作提供11.6 adc指令nadc是帶進(jìn)位加法指令 ,它利用了CF位上記錄的進(jìn)位值。n格式: adc 操作對象1,操作對象2n功能: 操作對象1=操作對象1+操作對象2+CFn比如:adc ax,bx 實(shí)現(xiàn)的功能是: (ax)=(ax)+(bx)+CFnadc指令執(zhí)行過程演示本課件由匯編網(wǎng)()制作提供本課件由匯編網(wǎng)()制作提供11.6 adc指令nadc指令示例(一)nmov ax,2 mov bx,1 sub bx,ax adc ax,l 執(zhí)行后,(ax)=4。 adc執(zhí)行時(shí),相當(dāng)于計(jì)算: (ax)+1+CF=2+1+1=4。本課件由

21、匯編網(wǎng)()制作提供11.6 adc指令nadc指令示例(二)nmov ax,1 add ax,ax adc ax,3 執(zhí)行后,(ax)=5。 adc執(zhí)行時(shí),相當(dāng)于計(jì)算: (ax)+3+CF=2+3+0=5。本課件由匯編網(wǎng)()制作提供11.6 adc指令nadc指令示例(三)nmov al,98H add al,aladc al,3 執(zhí)行后,(ax)=34H。 adc執(zhí)行時(shí),相當(dāng)于計(jì)算: (ax)+3+CF=30H+3+1=34H。本課件由匯編網(wǎng)()制作提供11.6 adc指令n可以看出,adc指令比add指令多加了一個(gè)CF位的值。 為什么要加上CF的值呢? CPU為什么要提供這樣一條指令呢?n

22、我們先來看一下CF的值的含義。本課件由匯編網(wǎng)()制作提供11.6 adc指令n在執(zhí)行 adc 指令的時(shí)候加上的 CF 的值的含義,由 adc指令前面的指令決定的,也就是說,關(guān)鍵在于所加上的CF值是被什么指令設(shè)置的。n顯然,如果CF 的值是被sub指令設(shè)置的,那么它的含義就是借位值;如果是被add指令設(shè)置的,那么它的含義就是進(jìn)位值。本課件由匯編網(wǎng)()制作提供11.6 adc指令n我們來看一下兩個(gè)數(shù)據(jù):0198H和0183H如何相加的: 01 98 + 01 83 1 - 03 1B 可以看出,加法可以分兩步來進(jìn)行:n(1)低位相加;n(2)高位相加再加上低位相加產(chǎn)生的進(jìn)位值。本課件由匯編網(wǎng)()制

23、作提供11.6 adc指令n下面的指令和add ax , bx具有相同的結(jié)果: add al,bl adc ah,bh 看來CPU提供 adc 指令的目的,就是來進(jìn)行加法的第二步運(yùn)算的。nadc指令和add指令相配合就可以對更大的數(shù)據(jù)進(jìn)行加法運(yùn)算。本課件由匯編網(wǎng)()制作提供11.6 adc指令n編程計(jì)算1EF000H+201000H,結(jié)果放在ax(高16位)和bx(低16位)中。 分析本課件由匯編網(wǎng)()制作提供11.6 adc指令n分析: 因?yàn)閮蓚€(gè)數(shù)據(jù)的位數(shù)都大于16,用add 指令無法進(jìn)行計(jì)算。我們將計(jì)算分兩步進(jìn)行,先將低16位相加,然后將高 16 位和進(jìn)位值相加。 程序如下本課件由匯編網(wǎng)(

24、)制作提供11.6 adc指令n程序: mov ax,001EH mov bx,0F000H add bx,1000H adc ax,0020H adc 指令執(zhí)行后,也可能產(chǎn)生進(jìn)位值,所以也會對CF位進(jìn)行設(shè)置。本課件由匯編網(wǎng)()制作提供11.6 adc指令n由于有這樣的功能,我們就可以對任意大的數(shù)據(jù)進(jìn)行加法運(yùn)算。 n看一個(gè)例子本課件由匯編網(wǎng)()制作提供11.6 adc指令n編程計(jì)算 1EF0001000H+2010001EF0H,結(jié)果放在ax(高16位),bx(次高16位),cx(低16位)中。 分析 本課件由匯編網(wǎng)()制作提供11.6 adc指令n分析: 計(jì)算分3步進(jìn)行:n(1)先將低16位

25、相加,完成后,CF 中記錄本次相加的進(jìn)位值;n(2)再將次高16位和 CF(來自低16位的進(jìn)位值)相加,完成后,CF中記錄本次相加的進(jìn)位值;n(3)最后高16 位和CF(來自次高16位的進(jìn)位值)相加,完成后,CF中記錄本次相加的進(jìn)位值。本課件由匯編網(wǎng)()制作提供11.6 adc指令n程序代碼 mov ax,001EH mov bx,0F000H mov cx,1000H add cx,1EF0H adc bx,1000H adc ax,0020H本課件由匯編網(wǎng)()制作提供11.6 adc指令n下面我們,編寫一個(gè)子程序,對兩個(gè)128位數(shù)據(jù)進(jìn)行相加。n名稱:add128n功能:兩個(gè)128位數(shù)據(jù)進(jìn)行

26、相加n參數(shù)本課件由匯編網(wǎng)()制作提供11.6 adc指令n參數(shù):nds:si指向存儲第一個(gè)數(shù)的內(nèi)存空間,因數(shù)據(jù)為128位,所以需要8個(gè)字單元,由低地址單元到高地址單元依次存放 128位數(shù)據(jù)由低到高的各個(gè)字。運(yùn)算結(jié)果存儲在第一個(gè)數(shù)的存儲空間中。 nds:di指向存儲第二個(gè)數(shù)的內(nèi)存空間n程序代碼 思考本課件由匯編網(wǎng)()制作提供11.6 adc指令n思考: inc和loop指令不影響CF位,上面的程序中,能不能將4個(gè)inc指令,用: add si,2 add si,2 取代?本課件由匯編網(wǎng)()制作提供11.7 sbb指令nsbb是帶錯(cuò)位減法指令,它利用了CF位上記錄的借位值。n格式:sbb 操作對象

27、1,操作對象2n功能: 操作對象1=操作對象1操作對象2CFn比如:sbb ax,bx 實(shí)現(xiàn)功能: (ax) = (ax) (bx) CF本課件由匯編網(wǎng)()制作提供11.7 sbb指令nsbb指令執(zhí)行后,將對CF進(jìn)行設(shè)置。n利用sbb指令我們可以對任意大的數(shù)據(jù)進(jìn)行減法運(yùn)算。本課件由匯編網(wǎng)()制作提供11.7 sbb指令n比如,計(jì)算003E100OH00202000H,結(jié)果放在ax,bx中,程序如下: mov bx,1000H mov ax,003EH sub bx,2000H sub ax,0020H本課件由匯編網(wǎng)()制作提供11.7 sbb指令nsbb和adc是基于同樣的思想設(shè)計(jì)的兩條指令,

28、在應(yīng)用思路上和adc類似。在這里,我們就不再進(jìn)行過多的討論。n通過學(xué)習(xí)這兩條指令,我們可以進(jìn)一步領(lǐng)會一下標(biāo)志寄存器CF位的作用和意義。本課件由匯編網(wǎng)()制作提供11.8 cmp指令ncmp 是比較指令,功能相當(dāng)于減法指令,只是不保存結(jié)果。ncmp 指令執(zhí)行后,將對標(biāo)志寄存器產(chǎn)生影響。 其他相關(guān)指令通過識別這些被影響的標(biāo)志寄存器位來得知比較結(jié)果。本課件由匯編網(wǎng)()制作提供11.8 cmp指令ncmp指令n格式:cmp 操作對象1,操作對象2n功能:計(jì)算操作對象1操作對象2 但并不保存結(jié)果,僅僅根據(jù)計(jì)算結(jié)果對標(biāo)志寄存器進(jìn)行設(shè)置。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n比如:cmp ax,a

29、x 做(ax)(ax)的運(yùn)算,結(jié)果為0,但并不在ax中保存,僅影響flag的相關(guān)各位。 指令執(zhí)行后: ZF=1, PF=1, SF=0, CF=0, OF=0。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n下面的指令: mov ax,8 mov bx,3 cmp ax,bx 執(zhí)行后: (ax)=8, ZF=0, PF=1, SF=0, CF=0, OF=0。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n其實(shí),我們通過cmp 指令執(zhí)行后,相關(guān)標(biāo)志位的值就可以看出比較的結(jié)果。 ncmp ax,bx本課件由匯編網(wǎng)()制作提供11.8 cmp指令n現(xiàn)在我們可以看出比較指令的設(shè)計(jì)思路,即:通過做減法

30、運(yùn)算,影響標(biāo)志寄存器,標(biāo)志寄存器的相關(guān)位記錄了比較的結(jié)果。n反過來看上面的例子 cmp ax,ax本課件由匯編網(wǎng)()制作提供11.8 cmp指令n指令 cmp ax,bx 的邏輯含意是比較ax和bx中的值,如果執(zhí)行后:本課件由匯編網(wǎng)()制作提供11.8 cmp指令n同 add、sub 指令一樣,CPU 在執(zhí)行cmp指令的時(shí)候,也包含兩種含義: 進(jìn)行無符號數(shù)運(yùn)算和進(jìn)行有符號數(shù)運(yùn)算。n所以利用cmp指令可以對無符號數(shù)進(jìn)行比較,也可以對有符號數(shù)進(jìn)行比較。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n上面所講的是用 cmp 進(jìn)行無符號數(shù)比較時(shí),相關(guān)標(biāo)志位對比較結(jié)果的記錄。n下面我們再來看一下如果用c

31、mp來進(jìn)行有符號數(shù)比較時(shí),CPU用哪些標(biāo)志位對比較結(jié)果進(jìn)行記錄。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n我們以cmp ah,bh為例進(jìn)行說明: cmp ah,bh 如果(ah)=(bh) 則(ah)-(bh)=0,所以:ZF=1; 如果(ah)(bh) 則(ah)-(bh) 0,所以:ZF=0; 所以,我們根據(jù)cmp指令執(zhí)行后ZF的值,就可以知道兩個(gè)數(shù)據(jù)是否相等。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n我們繼續(xù)看,如果(ah)(bh)則可能發(fā)生什么情況呢?n對于有符號數(shù)運(yùn)算,在 (ah)(bh) 情況下,(ah)-(bh)顯然可能引起SF=1,即結(jié)果為負(fù)。本課件由匯編網(wǎng)()

32、制作提供11.8 cmp指令n比如:n(ah)=1,(bh)=2: 則(ah)-(bh)=0FFH,0FFH 為 -1 的補(bǔ)碼,因?yàn)榻Y(jié)果為負(fù),所以SF=1。n(ah)=0FEH,(bx)=0FFH: 則(ah)-(bh)=2-(-1)=0FFH,因?yàn)榻Y(jié)果為負(fù),所以SF=1。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n通過上面的例子,我們是不是可以得到這樣的結(jié)論: cmp 操作對象1,操作對象2 指令執(zhí)行后,SF=1,就說明操作對象1操作對象2? 當(dāng)然不是。 我們再看兩個(gè)例子。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n (ah)=22H,(bh)=0A0H: 則(ah)-(bh)=3

33、4-(-96)=82H,82H是-126的補(bǔ)碼,所以SF=1。n這里雖然SF=1,但是并不能說明(ah)-96。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n兩個(gè)有符號數(shù)A 和B 相減,得到的是負(fù)數(shù),那么可以肯定AB,這個(gè)思路沒有錯(cuò)誤;n關(guān)鍵在于我們根據(jù)什么來斷定得到的是一個(gè)負(fù)數(shù)。nCPU將 cmp 指令得到的結(jié)果記錄在flag的相關(guān)標(biāo)志位中。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n我們可以根據(jù)指令執(zhí)行后,相關(guān)標(biāo)志位的值來判斷比較的結(jié)果。n單純地考察SF 的值不可能知道結(jié)果的正負(fù)。因?yàn)镾F 記錄的只是可以在計(jì)算機(jī)中存放的相應(yīng)位數(shù)的結(jié)果的正負(fù)。 比如add ah, al執(zhí)行后,SF記

34、錄的是ah中的8位二進(jìn)制信息所表示的數(shù)據(jù)的正負(fù)。本課件由匯編網(wǎng)()制作提供11.8 cmp指令ncmp ah,bh執(zhí)行后,SF記錄的是(ah) -(bh)所得到的8位結(jié)果數(shù)據(jù)的正負(fù);n雖然這個(gè)結(jié)果沒有在我們能夠使用的寄存器或內(nèi)存單元中保存,但是在指令執(zhí)行的過程中,它暫存在CPU 內(nèi)部的暫存器中。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n所得到的相應(yīng)結(jié)果的正負(fù),并不能說明,運(yùn)算所應(yīng)該得到的結(jié)果的正負(fù)。 這是因?yàn)樵谶\(yùn)算的過程中可能發(fā)生溢出。 如果有這樣的情況發(fā)生,那么,SF的值就不能說明任何問題。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n比如: mov ah,22H mov bh,0

35、A0H sub ah,bh 結(jié)果SF=1,運(yùn)算實(shí)際得到的結(jié)果是(ah)=82H,但是在邏輯上,運(yùn)算所應(yīng)該得到的結(jié)果是:34-(-96)=130。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n就是因?yàn)?30 這個(gè)結(jié)果作為一個(gè)有符號數(shù)超出了-128127這個(gè)范圍,在ah 中不能表示,而ah中的結(jié)果被CPU當(dāng)作有符號數(shù)解釋為-126。n而SF被用來記錄這個(gè)實(shí)際結(jié)果的正負(fù),所以SF=1。 但SF=1不能說明在邏輯上運(yùn)算所得的正確結(jié)果的正負(fù)。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n又比如: mov ah,0A0H mov bh,0CBH cmp ah,bh 結(jié)果SF=1,運(yùn)算 (ah)-(b

36、h) 實(shí)際得到的結(jié)果是D5H,但是在邏輯上,運(yùn)算所應(yīng)該得到的結(jié)果是:160-(-53)=213。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n但是邏輯上的結(jié)果的正負(fù),才是cmp指令所求的真正結(jié)果,因?yàn)槲覀兙褪且克玫絻蓚€(gè)操作對象的比較信息。n所以cmp 指令所作的比較結(jié)果,不是僅僅靠SF就能記錄的,因?yàn)樗荒苡涗泴?shí)際結(jié)果的正負(fù)。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n我們考慮一下 ,兩種結(jié)果之間的關(guān)系,實(shí)際結(jié)果的正負(fù),和邏輯上真正結(jié)果的正負(fù),它們之間有多大的距離呢? 從上面的分析中,我們知道,實(shí)際結(jié)果的正負(fù),之所以不能說明邏輯上真正結(jié)果的正負(fù),關(guān)鍵的原因在于發(fā)生了溢出。本課件由匯編

37、網(wǎng)()制作提供11.8 cmp指令n如果沒有溢出發(fā)生的話,那么,實(shí)際結(jié)果的正負(fù)和邏輯上真正結(jié)果的正負(fù)就一致了。 所以,我們應(yīng)該在考察SF(得知實(shí)際結(jié)果的正負(fù))的同時(shí)考察OF(得知有沒有溢出),就可以得知邏輯上真正結(jié)果的正負(fù),同時(shí)就可以知道比較的結(jié)果。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n下面,我們以cmp ah,bh為例,總結(jié)一下CPU執(zhí)行cmp指令后,SF和OF的值是如何來說明比較的結(jié)果的。本課件由匯編網(wǎng)()制作提供11.8 cmp指令n(1)如果SF=1,而OF=0 OF=0,說明沒有溢出,邏輯上真正結(jié)果的正負(fù)=實(shí)際結(jié)果的正負(fù); 因SF=1,實(shí)際結(jié)果為負(fù),所以邏輯上真正的結(jié)果為負(fù)

38、,所以(ah)(bh)。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n(3)如果SF=0,而OF=1 OF=1 ,說明有溢出,邏輯上真正結(jié)果的正負(fù)實(shí)際結(jié)果的正負(fù); 因SF=0,實(shí)際結(jié)果非負(fù),而OF=1說明有溢出,則結(jié)果非 0 ,所以,實(shí)際結(jié)果為正。實(shí)際結(jié)果為正,而又有溢出,這說明是由于溢出導(dǎo)致了實(shí)際結(jié)果非負(fù), 簡單分析一下,就可以看出,如果因?yàn)橐绯鰧?dǎo)致了實(shí)際結(jié)果為正,那么邏輯上真正的結(jié)果必然為負(fù)。這樣,SF=0,OF = 1 ,說明了(ah)(bh)。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n(4)如果SF=0,而OF=0 OF=0,說明沒有溢出,邏輯上真正結(jié)果的正負(fù)=實(shí)際結(jié)果的正

39、負(fù); 因SF=0,實(shí)際結(jié)果非負(fù),所以邏輯上真正的結(jié)果必然非負(fù)。所以(ah)(bh)。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n上面,我們深入討論了cmp指令在進(jìn)行有符號數(shù)和無符號數(shù)比較時(shí),對flag 相關(guān)標(biāo)志位的影響,和CPU如何通過相關(guān)的標(biāo)志位來表示比較的結(jié)果。n在學(xué)習(xí)中,要注意領(lǐng)會8086CPU這種工作機(jī)制的設(shè)計(jì)思想。實(shí)際上,這種設(shè)計(jì)思想對于各種處理機(jī)來說是普遍的。 本課件由匯編網(wǎng)()制作提供11.8 cmp指令n下面的內(nèi)容中我們將學(xué)習(xí)一些根據(jù)cmp指令的比較結(jié)果(即,cmp指令執(zhí)行后,相關(guān)標(biāo)志位的值)進(jìn)行工作的指令。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n

40、“轉(zhuǎn)移”指的是它能夠修改IP,而“條件”指的是它可以根據(jù)某種條件 ,決定是否修改IP。n比如:jcxz就是一個(gè)條件轉(zhuǎn)移指令,它可以檢測 cx 中的數(shù)值,如果(cx)=0,就修改IP,否則什么也不做。n所有條件轉(zhuǎn)移指令的轉(zhuǎn)移位移都是 -128,127。 本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n除了 jcxz 之外,CPU還提供了其他條件轉(zhuǎn)移指令,大多數(shù)條件轉(zhuǎn)移指令都檢測標(biāo)志寄存器的相關(guān)標(biāo)志位,根據(jù)檢測的結(jié)果來決定是否修改IP。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n它們檢測的是哪些標(biāo)志位呢? 就是被cmp指令影響的那些,表示比較結(jié)果的標(biāo)志位。n這些

41、條件轉(zhuǎn)移指令通常都和cmp相配合使用,就好像 call 和 ret 指令通常相配合使用一樣。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n因?yàn)?cmp 指令可以同時(shí)進(jìn)行兩種比較,無符號數(shù)比較和有符號數(shù)比較,所以根據(jù) cmp 指令的比較結(jié)果進(jìn)行轉(zhuǎn)移的指令也分為兩種,即:n根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令,它們檢測ZF、CF的值;n和根據(jù)有符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令,它們檢測 SF、OF和 ZF的值。 本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n我們看一下根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令。 下表是常用的根據(jù)無符號數(shù)的比較結(jié)果

42、進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令。 本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n這些指令比較常用,它們都很好記憶,它們的第一個(gè)字母都是j,表示jump;后面的:n e:表示equal; nne:表示not equal;n b:表示below;n nb:表示not below;n a:表示above;n na:表示not above。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n注意觀察一下它們所檢測的標(biāo)志位,都是cmp指令進(jìn)行無符號數(shù)比較時(shí)候,記錄比較結(jié)果的標(biāo)志位。n比如je,檢測 ZF位,當(dāng) ZF=1的時(shí)候進(jìn)行轉(zhuǎn)移,如果在 je 前面使用了 cmp 指令,那么je

43、對ZF的檢測,實(shí)際上就是間接地檢測cmp的比較結(jié)果是否為兩數(shù)相等。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n編程實(shí)現(xiàn)如下功能: 如果(ah)=(bh)則(ah)=(ah)+(ah),否則(ah)=(ah)+(bh)。 cmp ah,bh je s add ah,bh jmp short ok s: add ah,ah ok: ret本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n上面的程序執(zhí)行時(shí),如果(ah)=(bh) ,則cmp ah,bh使ZF=1,而je檢測ZF是否為1,如果為1,將轉(zhuǎn)移到標(biāo)號s 處執(zhí)行指令add ah,ah。n這也可以說,cmp 比

44、較 ah、bh 后所得到的相等的結(jié)果使得je 指令進(jìn)行轉(zhuǎn)移。從而很好地體現(xiàn)了 je指令的邏輯含義,相等則轉(zhuǎn)移。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n雖然 je 的邏輯含義是“相等則轉(zhuǎn)移”,但它進(jìn)行的操作是,ZF=1時(shí)則轉(zhuǎn)移。n“相等則轉(zhuǎn)移”這種邏輯含義,是通過和 cmp 指令配合使用來體現(xiàn)的,因?yàn)槭莄mp 指令為“ZF=1”賦予了“兩數(shù)相等”的含義。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n至于究竟在je之前使不使用cmp指令,在于我們的安排。 je檢測的是ZF位置,不管je 前面是什么指令,只要CPU執(zhí)行je指令時(shí),ZF=1,那么就會發(fā)生轉(zhuǎn)移。

45、n比如本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n比如: mov ax,0 add ax,0 je s inc ax s: inc ax 執(zhí)行后,(ax)=1。add ax,0使得ZF=1,所以je指令將進(jìn)行轉(zhuǎn)移。 本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n可在這個(gè)時(shí)候發(fā)生的轉(zhuǎn)移確不帶有“相等則轉(zhuǎn)移”的含義。因?yàn)榇颂幍膉e指令檢測到的ZF=1 ,不是由cmp等比較指令設(shè)置的,而是由add指令設(shè)置的,并不具有“兩數(shù)相等”的含義。n但無論“ZF=1” 的含義如何,是什么指令設(shè)置的,只要是ZF=1,就可以使得je指令發(fā)生轉(zhuǎn)移。本課件由匯編網(wǎng)()制作提供11.

46、9 檢測比較結(jié)果的條件轉(zhuǎn)移指令nCPU提供了cmp指令,也提供了 je 等條件轉(zhuǎn)移指令,如果將它們配合使用,可以實(shí)現(xiàn)根據(jù)比較結(jié)果進(jìn)行轉(zhuǎn)移的功能。n但這只是“如果”,只是一種合理的建議,和事實(shí)上常用的方法。n但究竟是否配合使用它們,完全是你自己的事情。 這就好像,call和ret指令的關(guān)系一樣。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n對于jne、jb、jnb、ja、jna等指令和cmp指令配合使用的思想和je相同,可以自己分析一下。n雖然我們分別討論了cmp指令和與其比較結(jié)果相關(guān)的有條件轉(zhuǎn)移指令,但是它們經(jīng)常在一起配合使用。 所以我們在聯(lián)合應(yīng)用它們的時(shí)候,不必再考慮cmp

47、指令對相關(guān)標(biāo)志位的影響和je 等指令對相關(guān)標(biāo)志位的檢測。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n因?yàn)橄嚓P(guān)的標(biāo)志位,只是為cmp和je等指令傳遞比較結(jié)果。n我們可以直接考慮cmp和je等指令配合使用時(shí),表現(xiàn)出來的邏輯含義。n它們在聯(lián)合使用的時(shí)候表現(xiàn)出來的功能有些像高級語言中的IF語句。 本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n我們來看一組程序: data段中的8個(gè)字節(jié)如下: data segment db 8,11,8,1,8,5,63,38 data endsn(1)編程:統(tǒng)計(jì)data段中數(shù)值為8的字節(jié)的個(gè)數(shù),用ax保存統(tǒng)計(jì)結(jié)果。n(2)編程:統(tǒng)

48、計(jì)data段中數(shù)值大于8的字節(jié)的個(gè)數(shù),用ax保存統(tǒng)計(jì)結(jié)果。n(3)編程:統(tǒng)計(jì)data段中數(shù)值小于8的字節(jié)的個(gè)數(shù),用ax保存統(tǒng)計(jì)結(jié)果。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n(1)編程:統(tǒng)計(jì)data段中數(shù)值為8的字節(jié)的個(gè)數(shù),用ax保存統(tǒng)計(jì)結(jié)果。n編程思路:初始設(shè)置(ax)=0,然后用循環(huán)依次比較每個(gè)字節(jié)的值,找到一個(gè)和8相等的數(shù)就將ax的值加1。n程序如下 n另一種實(shí)現(xiàn)方式本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令 mov ax,data mov ds,ax mov bx,0 ;ds:bx指向第一個(gè)字節(jié) mov ax,0 ;初始化累加器 mov cx,

49、0 s: cmp byte ptr bx,8 ;和8進(jìn)行比較 jne next ;如果不相等轉(zhuǎn)到next,繼續(xù)循環(huán) inc ax ;如果相等就將計(jì)數(shù)值加1 next: inc bx loop s ;程序執(zhí)行后: (ax)=3本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令 mov ax,data mov ds,ax mov bx,0 ;ds:bx指向第一個(gè)字節(jié) mov ax,0 ;初始化累加器 mov cx,0 s: cmp byte ptr bx,8 ;和8進(jìn)行比較 je ok ;如果相等就轉(zhuǎn)到ok,繼續(xù)循環(huán) jmp short next ;如果不相等就轉(zhuǎn)到next,繼續(xù)循環(huán)

50、ok: inc ax ;如果相等就將計(jì)數(shù)值加1 next: inc bx loop s本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n比起第一個(gè)程序,它直接的遵循了“等于8則計(jì)數(shù)值加1”的原則,用je指令檢測等于8的情況,但是沒有第一個(gè)程序精簡。n第一個(gè)程序用 jne 檢測不等于 8 的情況 ,從而間接地檢測等于 8 的情況。 要注意在使用 cmp 和條件轉(zhuǎn)移指令時(shí)的這種編程思想。 本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n(2)編程:統(tǒng)計(jì)data段中數(shù)值大于8的字節(jié)的個(gè)數(shù),用ax保存統(tǒng)計(jì)結(jié)果。n編程思路:初始設(shè)置(ax)=0,然后用循環(huán)依次比較每個(gè)字節(jié)的

51、值,找到一個(gè)大于8的數(shù)就將ax的值加1。n程序如下 本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令 mov ax,data mov ds,ax mov bx,0 ;ds:bx指向第一個(gè)字節(jié) mov ax,0 ;初始化累加器 mov cx,0 s: cmp byte ptr bx,8 ;和8進(jìn)行比較 jne next ;如果不大于8轉(zhuǎn)到next,繼續(xù)循環(huán) inc ax ;如果大于8就將計(jì)數(shù)值加1 next: inc bx loop s ;程序執(zhí)行后: (ax)=3本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n(3)編程:統(tǒng)計(jì)data段中數(shù)值小于8的字節(jié)的個(gè)數(shù),用

52、ax保存統(tǒng)計(jì)結(jié)果。n編程思路:初始設(shè)置(ax)=0,然后用循環(huán)依次比較每個(gè)字節(jié)的值,找到一個(gè)小于8的數(shù)就將ax的值加1。n程序如下 本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令 mov ax,data mov ds,ax mov bx,0 ;ds:bx指向第一個(gè)字節(jié) mov ax,0 ;初始化累加器 mov cx,0 s: cmp byte ptr bx,8 ;和8進(jìn)行比較 jnb next ;如果不小于8轉(zhuǎn)到next,繼續(xù)循環(huán) inc ax ;如果小于8就將計(jì)數(shù)值加1 next: inc bx loop s ;程序執(zhí)行后: (ax)=2本課件由匯編網(wǎng)()制作提供11.9 檢

53、測比較結(jié)果的條件轉(zhuǎn)移指令n上面講解了根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令。n根據(jù)有符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令的工作原理和無符號的相同,只是檢測了不同的標(biāo)志位。本課件由匯編網(wǎng)()制作提供11.9 檢測比較結(jié)果的條件轉(zhuǎn)移指令n我們在這里主要探討的是cmp、標(biāo)志寄存器的相關(guān)位、條件轉(zhuǎn)移指令三者配合應(yīng)用的原理,這個(gè)原理具有普遍性,而不是逐條講解條件轉(zhuǎn)移指令。n對這些指令感興趣的學(xué)習(xí)者可以查看相關(guān)的指令手冊。本課件由匯編網(wǎng)()制作提供特別提示n檢測點(diǎn)11.3(p219)n沒有完成此檢測點(diǎn),請不要向下進(jìn)行。本課件由匯編網(wǎng)()制作提供11.10 DF標(biāo)志和串傳送指令nflag的第10位是

54、DF,方向標(biāo)志位。n在串處理指令中,控制每次操作后si,di的增減。nDF = 0:每次操作后si,di遞增;nDF = 1:每次操作后si,di遞減。本課件由匯編網(wǎng)()制作提供11.10 DF標(biāo)志和串傳送指令n格式1: movsb n功能:(以字節(jié)為單位傳送)n(1) (es)16 + (di) = (ds) 16 + (si)n(2) 如果DF = 0則: (si) = (si) + 1 (di) = (di) + 1 如果DF = 0則:(si) = (si) - 1 (di) = (di) - 1本課件由匯編網(wǎng)()制作提供11.10 DF標(biāo)志和串傳送指令n我們可以用匯編語法描述movs

55、b的功能如下: mov es:di,byte ptr ds:si;8086 并不支持這樣的指令,這里只是個(gè)描述。n 如果DF=0:inc si inc din 如果DF=1:dec si dec di本課件由匯編網(wǎng)()制作提供11.10 DF標(biāo)志和串傳送指令n可以看出,movsb 的功能是將 ds:si 指向的內(nèi)存單元中的字節(jié)送入 es:di中,然后根據(jù)標(biāo)志寄存器DF位的值,將 si和di遞增或遞減。n當(dāng)然,也可以傳送一個(gè)字, movsw指令本課件由匯編網(wǎng)()制作提供11.10 DF標(biāo)志和串傳送指令n格式2:movswn功能:(以字為單位傳送) 將 ds:si指向的內(nèi)存字單元中word送入es

56、:di中,然后根據(jù)標(biāo)志寄存器DF位的值,將si和di遞增2或遞減2。本課件由匯編網(wǎng)()制作提供11.10 DF標(biāo)志和串傳送指令n我們可以用匯編語法描述movsw的功能如下: mov es:di,word ptr ds:si;8086 并不支持這樣的指令,這里只是個(gè)描述。n 如果DF=0:add si,2 add di,2n 如果DF=1:sub si,2 sub di,2本課件由匯編網(wǎng)()制作提供11.10 DF標(biāo)志和串傳送指令nmovsb和movsw進(jìn)行的是串傳送操作中的一個(gè)步驟,一般來說,movsb 和 movsw 都和rep配合使用,格式如下: nrep movsb 用匯編語法來描述rep movsb的功能就是: s : movsb loop snrep movsw用匯編語法來描述rep m

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論