微機(jī)原理第03章4程序控制類.ppt
第3章(4),第3章:3.6 控制轉(zhuǎn)移類指令,控制轉(zhuǎn)移類指令用于實(shí)現(xiàn)分支、循環(huán)、過程等程序結(jié)構(gòu),是僅次于傳送指令的常用指令 重點(diǎn)掌握: JMP/Jcc/LOOP/JCXZ CALL/RET INT n/IRET 常用系統(tǒng)功能調(diào)用,控制轉(zhuǎn)移類指令通過改變IP(和CS)值,實(shí)現(xiàn)程序執(zhí)行順序的改變,第3章:目標(biāo)地址的尋址方式,相對(duì)尋址方式 指令代碼中提供目的地址相對(duì)于當(dāng)前IP的位移量,轉(zhuǎn)移到的目的地址(轉(zhuǎn)移后的IP值)就是當(dāng)前IP值加上位移量 直接尋址方式 指令代碼中提供目的邏輯地址,轉(zhuǎn)移后的CS和IP值直接來自指令操作碼后的目的地址操作數(shù) 間接尋址方式 指令代碼中指示寄存器或存儲(chǔ)單元,目的地址從寄存器或存儲(chǔ)單元中間接獲得,用標(biāo)號(hào)表達(dá),用標(biāo)號(hào)表達(dá),用寄存器或存儲(chǔ)器操作數(shù)表達(dá),第3章:目標(biāo)地址的尋址范圍:段內(nèi)尋址,段內(nèi)轉(zhuǎn)移近轉(zhuǎn)移(near) 在當(dāng)前代碼段64KB范圍內(nèi)轉(zhuǎn)移( 32KB范圍) 不需要更改CS段地址,只要改變IP偏移地址 段內(nèi)轉(zhuǎn)移短轉(zhuǎn)移(short) 轉(zhuǎn)移范圍可以用一個(gè)字節(jié)表達(dá),在段內(nèi)128127范圍的轉(zhuǎn)移,第3章:目標(biāo)地址的尋址范圍:段間尋址,段間轉(zhuǎn)移遠(yuǎn)轉(zhuǎn)移(far) 從當(dāng)前代碼段跳轉(zhuǎn)到另一個(gè)代碼段,可以在1MB范圍 需要更改CS段地址和IP偏移地址 目標(biāo)地址必須用一個(gè)32位數(shù)表達(dá),叫做32位遠(yuǎn)指針,它就是邏輯地址,代碼段,代碼段,實(shí)際編程時(shí),匯編程序會(huì)根據(jù)目標(biāo)地址的屬性,自動(dòng)處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移 程序員可用操作符short、near ptr 或far ptr 強(qiáng)制成為需要的轉(zhuǎn)移類型,第3章:3.6.1 無條件轉(zhuǎn)移指令,只要執(zhí)行無條件轉(zhuǎn)移指令JMP,就使程序轉(zhuǎn)到指定的目標(biāo)地址,從目標(biāo)地址處開始執(zhí)行指令 操作數(shù)label是要轉(zhuǎn)移到的目標(biāo)地址(目的地址、轉(zhuǎn)移地址) JMP指令分成4種類型: 段內(nèi)轉(zhuǎn)移、相對(duì)尋址 段內(nèi)轉(zhuǎn)移、間接尋址 段間轉(zhuǎn)移、直接尋址 段間轉(zhuǎn)移、間接尋址,JMP label ;程序轉(zhuǎn)向label標(biāo)號(hào)指定的地址,第3章:無條件轉(zhuǎn)移指令JMP(jump),JMP label ;段內(nèi)轉(zhuǎn)移、相對(duì)尋址 ;IPIP位移量 JMP r16/m16 ;段內(nèi)轉(zhuǎn)移、間接尋址 ;IPr16/m16 JMP far ptr label ;段間轉(zhuǎn)移、直接尋址 ;IP偏移地址,CS段地址 JMP far ptr mem ;段間轉(zhuǎn)移,間接尋址 ;IPmem,CSmem2,演示,演示,演示,演示,演示,第3章:3.6.2 條件轉(zhuǎn)移指令,條件轉(zhuǎn)移指令Jcc根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移。其通用格式為: Jcc label ;條件滿足,發(fā)生轉(zhuǎn)移 ;IPIP8位位移量; ;否則,順序執(zhí)行 label是一個(gè)標(biāo)號(hào)、一個(gè)8位位移量,表示Jcc指令后的那條指令的偏移地址,到目標(biāo)指令的偏移地址的地址位移 label只支持短轉(zhuǎn)移的相對(duì)尋址方式,第3章:Jcc指令的分類,Jcc指令不影響標(biāo)志,但要利用標(biāo)志 根據(jù)利用的標(biāo)志位不同,分成三種情況: 判斷單個(gè)標(biāo)志位狀態(tài) 比較無符號(hào)數(shù)高低 比較有符號(hào)數(shù)大小,Jcc指令實(shí)際雖然只有16條,但卻有30個(gè)助記符 采用多個(gè)助記符,目的是為了方便記憶和使用,第3章:1. 判斷單個(gè)標(biāo)志位狀態(tài), JZ/JE和JNZ/JNE 利用零標(biāo)志ZF,判斷結(jié)果是否為零(或相等) JS和JNS 利用符號(hào)標(biāo)志SF,判斷結(jié)果是正是負(fù) JO和JNO 利用溢出標(biāo)志OF,判斷結(jié)果是否產(chǎn)生溢出 JP/JPE和JNP/JPO 利用奇偶標(biāo)志PF,判斷結(jié)果中“1”的個(gè)數(shù)是偶是奇 JC/JB/JNAE和JNC/JNB/JAE 利用進(jìn)位標(biāo)志CF,判斷結(jié)果是否進(jìn)位或借位,第3章:1. 判斷單個(gè)標(biāo)志位狀態(tài),英文解釋,第3章:例題3.22,題目:將AX中存放的無符號(hào)數(shù)除以2,如果是奇數(shù)則加1后除以2 問題:如何判斷AX中的數(shù)據(jù)是奇數(shù)還是偶數(shù)? 解答:判斷AX最低位是“0”(偶數(shù)),還是“1”(奇數(shù))??梢杂梦徊僮黝愔噶?1:用邏輯與指令將除最低位外的其他位變成0,保留最低位不變。判斷這個(gè)數(shù)據(jù)是0,AX就是偶數(shù);否則,為奇數(shù) 2:將最低位用移位指令移至進(jìn)位標(biāo)志,判斷進(jìn)位標(biāo)志是0,AX就是偶數(shù);否則,為奇數(shù) 3:將最低位用移位指令移至最高位(符號(hào)位),判斷符號(hào)標(biāo)志是0,AX就是偶數(shù);否則,為奇數(shù),第3章:例題3.22解答1 用JZ指令實(shí)現(xiàn),test ax,01h ;測試AX的最低位D0(不用AND指令,以免改變AX) jz even ;標(biāo)志ZF1,即D00:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移 add ax,1 ;否則標(biāo)志ZF0,即D01:AX為奇數(shù)且加1 even: shr ax,1 ;AXAX2,用右移一位的方法實(shí)現(xiàn)除以2。 本例中用RCR指令比SHR指令更好。,第3章:例題3.22解答2 用JNC指令實(shí)現(xiàn),mov bx,ax shr bx,1 ;將AX的最低位D0移進(jìn)CF jnc even ;標(biāo)志CF0,即D00:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移 add ax,1 ;標(biāo)志CF1,即D01:AX內(nèi)的奇數(shù),加1 even: shr ax,1 ;AXAX2,還可用SAR、ROR和RCR指令,第3章:例題3.22解答3 用JNS指令實(shí)現(xiàn),mov bx,ax ror bx,1 ;將AX的最低位D0移進(jìn)最高位(符號(hào)位SF) jns even ;標(biāo)志SF0,即D00:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移 add ax,1 ;標(biāo)志SF1,即D01:AX內(nèi)的奇數(shù),加1 even: shr ax,1 ;AXAX2,錯(cuò)誤!循環(huán)指令不影響SF等標(biāo)志,第3章:例3.23 判斷是否為字母Y,;寄存器AL中是字母Y(含大小寫),則令A(yù)H0,否則令A(yù)H1 cmp al,y ;比較AL與小寫字母y je next ;相等,轉(zhuǎn)移 cmp al,Y ;不相等, ;繼續(xù)比較AL與大寫字母Y je next ;相等,轉(zhuǎn)移 mov ah,-1 ;不相等,令A(yù)H1 jmp done ;無條件轉(zhuǎn)移指令 next: mov ah,0 ;相等的處理:令A(yù)H0 done: ,第2章:例3.24 偶校驗(yàn),;對(duì)DL寄存器中8位數(shù)據(jù)進(jìn)行偶校驗(yàn) ;校驗(yàn)位結(jié)果存入CF標(biāo)志 test dl,0ffh ;使CF0,同時(shí)設(shè)置PF標(biāo)志 jpe done ;DL中“1”的個(gè)數(shù)為偶數(shù) ;正好CF0,轉(zhuǎn)向done stc ;DL中“1”的個(gè)數(shù)為奇數(shù),設(shè)置CF1 done: ;完成,第3章:2. 比較無符號(hào)數(shù)高低,無符號(hào)數(shù)的大小用高(Above)、低(Below)表示,需要利用CF確定高低、利用ZF標(biāo)志確定相等(Equal) 兩數(shù)的高低分成4種關(guān)系,對(duì)應(yīng)4條指令 JB(JNAE):目的操作數(shù)低于(不高于等于)源操作數(shù) JNB(JAE):目的操作數(shù)不低于(高于等于)源操作數(shù) JBE(JNA):目的操作數(shù)低于等于(不高于)源操作數(shù) JNBE(JA):目的操作數(shù)不低于等于(高于)源操作數(shù),第3章:3. 比較有符號(hào)數(shù)大小,判斷有符號(hào)數(shù)的大(Greater)、?。↙ess),需要組合OF、SF標(biāo)志、并利用ZF標(biāo)志確定相等與否 兩數(shù)的大小分成4種關(guān)系,分別對(duì)應(yīng)4條指令 JL(JNGE):目的操作數(shù)小于(不大于等于)源操作數(shù) JNL(JGE):目的操作數(shù)不小于(大于等于)源操作數(shù) JLE(JNG):目的操作數(shù)小于等于(不大于)源操作數(shù) JNLE(JG):目的操作數(shù)不小于等于(大于)源操作數(shù),第3章:例3.25 求較大值,cmp ax,bx ;比較AX和BX jae next ;若AXBX,轉(zhuǎn)移 xchg ax,bx ;若AXBX,交換 next: mov wmax,ax,如果AX和BX存放的是有符號(hào)數(shù), 則條件轉(zhuǎn)移指令應(yīng)采用JGE指令,第3章:例3.25 求較大值(另解),cmp ax,bx ;比較AX和BX jae next mov wmax, bx ;若AXBX,wmaxBX jmp done next: mov wmax,ax ;若AXBX,wmaxAX done: ,第3章:例3.25 求較大值(另解對(duì)比),cmp ax,bx ;比較AX和BX jbe next mov wmax, ax ;若AXBX,wmaxAX jmp done next: mov wmax,bx ;若AXBX,wmaxBX done: ,第3章:3.6.3 循環(huán)指令,一段代碼序列多次重復(fù)執(zhí)行就是循環(huán) 8088設(shè)計(jì)有針對(duì)CX計(jì)數(shù)器的計(jì)數(shù)循環(huán)指令 LOOP label ;循環(huán)指令 ;首先CXCX1;然后判斷;若CX0,轉(zhuǎn)移 JCXZ label ;為0循環(huán)指令 :如果CX0,則轉(zhuǎn)移 label操作數(shù)采用相對(duì)短尋址方式 還有LOOPZ/LOOPE和LOOPNZ/LOOPNE兩條指令,第3章:例3.26 數(shù)據(jù)塊傳送(字節(jié)),mov cx,400h ;設(shè)置循環(huán)次數(shù):1K1024400H mov si,offset sbuf ;設(shè)置循環(huán)初值:SI指向數(shù)據(jù)段源緩沖區(qū)開始 mov di,offset dbuf ;DI指向附加段目的緩沖區(qū)開始(附加段) again: mov al,si ;循環(huán)體:實(shí)現(xiàn)數(shù)據(jù)傳送 mov es:di,al ;每次傳送一個(gè)字節(jié) inc si ;SI和DI指向下一個(gè)單元 inc di loop again ;循環(huán)條件判定:循環(huán)次數(shù)減1,不為0轉(zhuǎn)移(循環(huán)),第3章:例3.26 數(shù)據(jù)塊傳送(字),mov cx,200h ;設(shè)置循環(huán)次數(shù):1K2200H mov si,offset sbuf ;設(shè)置循環(huán)初值:SI指向數(shù)據(jù)段源緩沖區(qū)開始 mov di,offset dbuf ;DI指向附加段目的緩沖區(qū)開始(附加段) again: mov ax,si ;循環(huán)體:實(shí)現(xiàn)數(shù)據(jù)傳送 mov es:di,ax ;每次傳送一個(gè)字 add si,2 ;指向下一個(gè)(字)單元 add di,2 loop again ;循環(huán)條件判定:循環(huán)次數(shù)減1,不為0轉(zhuǎn)移(循環(huán)),第3章:3.6.4 子程序指令,子程序是完成特定功能的一段程序 當(dāng)主程序(調(diào)用程序)需要執(zhí)行這個(gè)功能時(shí),采用CALL調(diào)用指令轉(zhuǎn)移到該子程序的起始處執(zhí)行 當(dāng)運(yùn)行完子程序功能后,采用RET返回指令回到主程序繼續(xù)執(zhí)行,演示,轉(zhuǎn)移指令有去無回 子程序調(diào)用需要返回, 其中利用堆棧保存返回地址,第3章: 1. 子程序調(diào)用指令CALL,CALL指令分成4種類型(類似JMP) CALL label ;段內(nèi)調(diào)用、直接尋址 CALL r16/m16 ;段內(nèi)調(diào)用、間接尋址 CALL far ptr label ;段間調(diào)用、直接尋址 CALL far ptr mem ;段間調(diào)用、間接尋址 CALL指令需要保存返回地址: 段內(nèi)調(diào)用入棧偏移地址IP SPSP2,SS:SPIP 段間調(diào)用入棧偏移地址IP和段地址CS SPSP2,SS:SPCS SPSP2,SS:SPIP,第3章: 2. 子程序返回指令RET,根據(jù)段內(nèi)和段間、有無參數(shù),分成4種類型 RET ;無參數(shù)段內(nèi)返回 RET i16 ;有參數(shù)段內(nèi)返回 RET ;無參數(shù)段間返回 RET i16 ;有參數(shù)段間返回 需要彈出CALL指令壓入堆棧的返回地址 段內(nèi)返回出棧偏移地址IP IPSS:SP, SPSP2 段間返回出棧偏移地址IP和段地址CS IPSS:SP,SPSP2 CSSS:SP,SPSP2,第3章:例3.27 十六進(jìn)制轉(zhuǎn)換為ASCII碼的子程序,;子程序:將DL低4位的一位16進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼 htoasc proc and dl,0fh ;只取DL的低4位 or dl,30h ;DL高4位變成3 cmp dl,39h ;是09,還是0Ah0Fh ? jbe htoend ;是09,轉(zhuǎn)移 add dl,7 ;是0Ah0Fh,加上7 htoend: ret ;子程序返回 htoasc endp,轉(zhuǎn)換原理,;主程序:調(diào)用子程序 mov dl,28h call htoasc,第3章:3.6.5 中斷指令,中斷(Interrupt)是又一種改變程序執(zhí)行順序的方法 8088CPU支持256個(gè)中斷,每個(gè)中斷用一個(gè)編號(hào)(中斷向量號(hào))區(qū)別 中斷指令有3條: INT i8 IRET INTO 本節(jié)主要掌握類似子程序調(diào)用指令的中斷調(diào)用指令I(lǐng)NT i8,進(jìn)而掌握系統(tǒng)功能調(diào)用,第3章:中斷指令,INT i8 ;中斷調(diào)用指令:產(chǎn)生i8號(hào)中斷 ;主程序使用,其中i8表示中斷向量號(hào) IRET ;中斷返回指令:實(shí)現(xiàn)中斷返回 ;中斷服務(wù)程序使用,第3章:3.7 處理器控制類指令,處理器控制類指令用來控制CPU的狀態(tài),使CPU暫停、等待或空操作等 對(duì)標(biāo)志位進(jìn)行設(shè)置的指令 CLC STC CMC CLD STD CLI STI 對(duì)CPU狀態(tài)進(jìn)行控制的指令 NOP CS: SS: DS: ES: LOCK HLT ESC WAIT,空操作指令NOP,不執(zhí)行任何操作,但占用一個(gè)字節(jié)存儲(chǔ)單元,空耗一個(gè)指令執(zhí)行周期 NOP常用于程序調(diào)試 在需要預(yù)留指令空間時(shí)用NOP填充 代碼空間多余時(shí)也可以用NOP填充 還可以用NOP實(shí)現(xiàn)軟件延時(shí) 事實(shí)上,NOP和XCHG AX,AX的指令代碼一樣,都是 90H,封鎖前綴指令LOCK,LOCK ;封鎖總線 這是一個(gè)指令前綴,可放在任何指令前 這個(gè)前綴使得在這個(gè)指令執(zhí)行時(shí)間內(nèi),8086 處理器的封鎖輸出引腳有效,即把總線封鎖,使別的控制器不能控制總線;直到該指令執(zhí)行完后,總線封鎖解除,暫停指令HLT,HLT ;進(jìn)入暫停狀態(tài) 暫停指令使CPU進(jìn)入暫停狀態(tài),這時(shí)CPU不進(jìn)行任何操作。當(dāng)CPU發(fā)生復(fù)位或來自外部的中斷時(shí),CPU脫離暫停狀態(tài) HLT指令可用于程序中等待中斷。當(dāng)程序中必須等待中斷時(shí),可用HLT,而不必用軟件死循環(huán)。然后,中斷使CPU脫離暫停狀態(tài),返回執(zhí)行HLT的下一條指令,交權(quán)指令 ESC,ESC 6位立即數(shù),reg/mem ;把浮點(diǎn)指令交給浮點(diǎn)處理器執(zhí)行 浮點(diǎn)協(xié)處理器8087指令是與8086的整數(shù)指令組合在一起的,當(dāng)8086發(fā)現(xiàn)是一條浮點(diǎn)指令時(shí),就利用ESC指令將浮點(diǎn)指令交給8087執(zhí)行 實(shí)際編寫程序時(shí),一般采用易于理解的浮點(diǎn)指令助記符格式 ESC 6,SI ;實(shí)數(shù)除法指令:FDIV dword ptr SI ESC 20H,AL ;整數(shù)加法指令:FADD ST(0),ST,等待指令WAIT,WAIT ;進(jìn)入等待狀態(tài) 8086利用WAIT指令和測試引腳實(shí)現(xiàn)與8087同步運(yùn)行 浮點(diǎn)指令經(jīng)由8086處理發(fā)往8087,并與8086本身的整數(shù)指令在同一個(gè)指令序列;而8087執(zhí)行浮點(diǎn)指令較慢,所以8086必須與8087保持同步,第3章:總結(jié),本章展開了8088CPU16位指令系統(tǒng)的常用指令 希望大家就如下幾個(gè)方面進(jìn)行一下總結(jié): 操作數(shù)尋址方式和目的地址尋址方式 指令支持的操作數(shù)形式 常用指令的助記符和功能 指令對(duì)標(biāo)志的影響 通過復(fù)習(xí)整理,形成指令系統(tǒng)的整體概念,進(jìn)而掌握常用指令,指令執(zhí)行,第3章:教學(xué)要求,了解微處理器基本結(jié)構(gòu)、8088/8086的功能結(jié)構(gòu) 掌握8088/8086的寄存器結(jié)構(gòu)、存儲(chǔ)器結(jié)構(gòu)和尋址方式 熟悉匯編語言的語句格式,掌握8088/8086基本指令: 數(shù)據(jù)傳送:MOVXCHGXLAT、PUSHPOP、LEA 加減運(yùn)算:ADDSUB、ADCSBB、CMP、INCDEC 位操作:ANDORXORNOTTEST、SHLSHRSAR、ROLRORRCLRCR 控制轉(zhuǎn)移:JMPJccLOOP、CALLRET、INT n 掌握DOS字符字符串輸出功能調(diào)用方法,目的地址相對(duì)尋址方式,目的地址寄存器段內(nèi)間接尋址方式,目的地址存儲(chǔ)器段內(nèi)間接尋址方式,目的地址段間直接尋址方式,目的地址存儲(chǔ)器段間間接尋址方式,條件轉(zhuǎn)移指令的含義,JZ/JE Jump on Zero/Equal JNZ/JNE Jump on Not Zero/Equal JS Jump on Sign JNS Jump on Not Sign JP/JPE Jump on Parity/Parity Even JNP/JPO Jump on Not Parity/Parity Odd JO Jump on Overflow JNO Jump on Not Overflow JC/JB/JNAE Jump on Carry/Below/Not Above or Equal JNC/JNB/JAE Jump on Not Carry/Not Below/Above or Equal JBE/JNA Jump on Below or Equal/Not Above JNBE/JA Jump on Not Below or Equal/Above JL/JNGE Jump on Less/Not Greater or Equal JNL/JGE Jump on Not Less/Greater or Equal JLE/JNG Jump on Less or Equal/Not Greater JNLE/JG Jump on Not Less or Equal/Greater,奇偶校驗(yàn),奇偶校驗(yàn)是計(jì)算機(jī)中最常使用的校驗(yàn)方法,因?yàn)椴徽撚糜布€是用軟件都很容易實(shí)現(xiàn) 偶校驗(yàn):如果數(shù)據(jù)中“1”的個(gè)數(shù)不是偶數(shù),則校驗(yàn)位是1,使得包括校驗(yàn)位在內(nèi)的數(shù)據(jù)中“1”的個(gè)數(shù)為偶數(shù);否則,校驗(yàn)位為0 奇校驗(yàn):如果數(shù)據(jù)中“1”的個(gè)數(shù)不是奇數(shù),則校驗(yàn)位是1,使得包括校驗(yàn)位在內(nèi)的數(shù)據(jù)中“1”的個(gè)數(shù)為奇數(shù);否則,校驗(yàn)位為0,主程序與子程序,CALL label,主程序,RET,子程序,回到CALL指令后的指令處返回地址,十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼的原理,主程序與中斷服務(wù)程序,主程序,IRET,中斷服務(wù)程序,斷點(diǎn),中斷請(qǐng)求,中斷請(qǐng)求可以來自處理器外部的中斷源, 也可以由處理器執(zhí)行指令引起: 例如執(zhí)行INT i8指令。,8088的指令執(zhí)行,