微機原理第02章-5_第1頁
微機原理第02章-5_第2頁
微機原理第02章-5_第3頁
微機原理第02章-5_第4頁
微機原理第02章-5_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第2章2.6控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令用于實現(xiàn)分支、循環(huán)、過程等程序結(jié)構(gòu),是僅次于傳送指令的常用指令重點掌握:

JMP/Jcc/LOOP/JCXZ

CALL/RETINTn/IRET

常用系統(tǒng)功能調(diào)用控制轉(zhuǎn)移類指令通過改變IP(和CS)值,實現(xiàn)程序執(zhí)行順序的改變目標地址的尋址方式相對尋址方式指令代碼中提供目的地址相對于當前IP的位移量,轉(zhuǎn)移到的目的地址(轉(zhuǎn)移后的IP值)就是當前IP值加上位移量直接尋址方式指令代碼中提供目的邏輯地址,轉(zhuǎn)移后的CS和IP值直接來自指令操作碼后的目的地址操作數(shù)間接尋址方式指令代碼中指示寄存器或存儲單元,目的地址從寄存器或存儲單元中間接獲得用標號表達用標號表達用寄存器或存儲器操作數(shù)表達目標地址的尋址范圍:段內(nèi)尋址段內(nèi)轉(zhuǎn)移——近轉(zhuǎn)移(near)在當前代碼段64KB范圍內(nèi)轉(zhuǎn)移(±32KB范圍)不需要更改CS段地址,只要改變IP偏移地址段內(nèi)轉(zhuǎn)移——短轉(zhuǎn)移(short)轉(zhuǎn)移范圍可以用一個字節(jié)表達,在段內(nèi)-128~+127范圍的轉(zhuǎn)移代碼段代碼段目標地址的尋址范圍:段間尋址段間轉(zhuǎn)移——遠轉(zhuǎn)移(far)從當前代碼段跳轉(zhuǎn)到另一個代碼段,可以在1MB范圍需要更改CS段地址和IP偏移地址目標地址必須用一個32位數(shù)表達,叫做32位遠指針,它就是邏輯地址代碼段代碼段實際編程時,匯編程序會根據(jù)目標地址的屬性,自動處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠轉(zhuǎn)移程序員可用操作符short、nearptr

或farptr

強制成為需要的轉(zhuǎn)移類型2.6.1無條件轉(zhuǎn)移指令使程序無條件轉(zhuǎn)移到指定的目標地址,從目標地址處開始執(zhí)行指令操作數(shù)label是要轉(zhuǎn)移到的目標地址(目的地址、轉(zhuǎn)移地址)JMP指令分成4種類型:⑴段內(nèi)轉(zhuǎn)移、相對尋址⑵段內(nèi)轉(zhuǎn)移、間接尋址⑶段間轉(zhuǎn)移、直接尋址⑷段間轉(zhuǎn)移、間接尋址JMPlabel ;程序轉(zhuǎn)向label標號指定的地址無條件轉(zhuǎn)移指令JMP(jump)JMPlabel

;段內(nèi)轉(zhuǎn)移、相對尋址

;IP←IP+位移量

JMPr16/m16 ;段內(nèi)轉(zhuǎn)移、間接尋址

;IP←r16/m16

JMPfarptrlabel

;段間轉(zhuǎn)移、直接尋址

;IP←偏移地址,CS←段地址

JMPfarptrmem

;段間轉(zhuǎn)移,間接尋址

;IP←[mem],CS←[mem+2]演示演示演示演示演示2.6.2條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令Jcc根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移。其通用格式為:

Jcc

label

;條件滿足,發(fā)生轉(zhuǎn)移 ;IP←IP+8位位移量; ;否則,順序執(zhí)行l(wèi)abel是一個標號、一個8位位移量,表示Jcc指令后的那條目標指令的地址位移label只支持短轉(zhuǎn)移的相對尋址方式Jcc指令的分類Jcc指令不影響標志,但要利用標志(表2-4)根據(jù)利用的標志位不同,分成三種情況:⑴判斷單個標志位狀態(tài)⑵比較無符號數(shù)高低⑶比較有符號數(shù)大小

Jcc指令實際雖然只有16條,但卻有30個助記符采用多個助記符,目的是為了方便記憶和使用1.判斷單個標志位狀態(tài)⑴

JZ/JE和JNZ/JNE

利用零標志ZF,判斷結(jié)果是否為零(或相等)⑵JS和JNS

利用符號標志SF,判斷結(jié)果是正是負⑶JO和JNO

利用溢出標志OF,判斷結(jié)果是否產(chǎn)生溢出⑷JP/JPE和JNP/JPO

利用奇偶標志PF,判斷結(jié)果中“1”的個數(shù)是偶是奇⑸JC/JB/JNAE和JNC/JNB/JAE

利用進位標志CF,判斷結(jié)果是否進位或借位例題2.22題目:將AX中存放的無符號數(shù)除以2,如果是奇數(shù)則加1后除以2問題:如何判斷AX中的數(shù)據(jù)是奇數(shù)還是偶數(shù)?解答:判斷AX最低位是“0”(偶數(shù)),還是“1”(奇數(shù))。可以用位操作類指令1:用邏輯與指令將除最低位外的其他位變成0,保留最低位不變。判斷這個數(shù)據(jù)是0,AX就是偶數(shù);否則,為奇數(shù)2:將最低位用移位指令移至進位標志,判斷進位標志是0,AX就是偶數(shù);否則,為奇數(shù)3:將最低位用移位指令移至最高位(符號位),判斷符號標志是0,AX就是偶數(shù);否則,為奇數(shù)例題2.22解答1用JZ指令實現(xiàn)

testax,01h;測試AX的最低位D0(不用AND指令,以免改變AX)

jz

even;標志ZF=1,即D0=0:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移

addax,1;標志ZF=0,即D0=1:AX內(nèi)的奇數(shù),加1even:

shrax,1 ;AX←AX÷2例題2.22解答2用JNC指令實現(xiàn)

mov

bx,ax

shrbx,1;將AX的最低位D0移進CF

jnc

even;標志CF=0,即D0=0:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移

addax,1;標志CF=1,即D0=1:AX內(nèi)的奇數(shù),加1even:

shrax,1 ;AX←AX÷2還可用SAR、ROR和RCR指令例題2.22解答3用JNS指令實現(xiàn)

mov

bx,ax

rorbx,1;將AX的最低位D0移進最高位(符號位SF)

jns

even;標志SF=0,即D0=0:AX內(nèi)是偶數(shù),程序轉(zhuǎn)移

addax,1;標志SF=1,即D0=1:AX內(nèi)的奇數(shù),加1even:

shrax,1 ;AX←AX÷2錯誤!循環(huán)指令不影響SF等標志ADDBX,0 ;增加一條指令例2.23判斷是否為字母Y;寄存器AL中是字母Y(含大小寫),則令AH=0,否則令AH=-1

cmp

al,’y’ ;比較AL與小寫字母y

jenext

;相等,轉(zhuǎn)移

cmp

al,’Y’ ;不相等, ;繼續(xù)比較AL與大寫字母Y

jenext

;相等,轉(zhuǎn)移

movah,-1 ;不相等,令AH=-1

jmpdone

;無條件轉(zhuǎn)移指令next: movah,0

;相等的處理:令AH=0done: ……例2.24偶校驗;對DL寄存器中8位數(shù)據(jù)進行偶校驗;校驗位存入CF標志

testdl,0ffh

;使CF=0,同時設置PF標志

jpe

done

;DL中“1”的個數(shù)為偶數(shù) ;正好CF=0,轉(zhuǎn)向done

stc

;DL中“1”的個數(shù)為奇數(shù),設置CF=1done: …… ;完成2.比較無符號數(shù)高低無符號數(shù)的大小用高(Above)、低(Below)表示,需要利用CF確定高低、利用ZF標志確定相等(Equal)兩數(shù)的高低分成4種關系,對應4條指令JB(JNAE):目的操作數(shù)低于(不高于等于)源操作數(shù)JNB(JAE):目的操作數(shù)不低于(高于等于)源操作數(shù)JBE(JNA):目的操作數(shù)低于等于(不高于)源操作數(shù)JNBE(JA):目的操作數(shù)不低于等于(高于)源操作數(shù)3.比較有符號數(shù)大小判斷有符號數(shù)的大(Greater)、?。↙ess),需要組合OF、SF標志、并利用ZF標志確定相等與否兩數(shù)的大小分成4種關系,分別對應4條指令JL(JNGE):目的操作數(shù)小于(不大于等于)源操作數(shù)JNL(JGE):目的操作數(shù)不小于(大于等于)源操作數(shù)JLE(JNG):目的操作數(shù)小于等于(不大于)源操作數(shù)JNLE(JG):目的操作數(shù)不小于等于(大于)源操作數(shù)例:MOVAL,A;設機器字長n=8

CMPAL,B

JLLESS;A<B,則轉(zhuǎn)到LESS去執(zhí)行(1)A=120,B=12,求A-B=?自然丟失[A-B]補=01101100B

,A-B的真值=+1101100B=+108[A-B]補=此時,SF=0,OF=0,差值為正,無溢出,AB1,01101100正確結(jié)果解:[A]補=01111000,[B]補=00001100,[-B]補=11110100

[A]補=01111000+[-B]補=11110100(2)A=12,B=120,求A-B=?[A-B]補=10010100B

,[A-B]原=11101100B

,A-B=-108[A-B]補=此時,SF=1,OF=0,差值為負,無溢出,A<B10010100綜合(1)(2)得結(jié)論:當OF=0(無溢出)時,SF=0,則AB

;SF=1,則A<B正確結(jié)果

[A]補=00001100+[-B]補=10001000解:[A]補=00001100

,[B]補=01111000,[-B]補=10001000

(3)A=-12,B=120,求A-B=?解:[A]補=11110100

,[B]補=01111000,[-B]補=10001000

[A]補=11110100+[-B]補=10001000[A-B]補=01111100B

,A-B=+124[A-B]補=此時,SF=0,OF=1,差值為正,有溢出(負溢),A<B1,01111100錯誤結(jié)果自然丟失(4)A=12,B=-120,求A-B=?解:[A]補=00001100

,[B]補=10001000,[-B]補=01111000

[A]補=00001100+[-B]補=01111000[A-B]補=10000100B

,[A-B]原=11111100B

,A-B=-124[A-B]補=此時,SF=1,OF=1,差值為負,有溢出(正溢),AB10000100錯誤結(jié)果綜合(3)(4)得結(jié)論:當OF=1(溢出)時,SF=0,則A<B;SF=1,則AB綜合(1)(2)(3)(4)得結(jié)論:測試條件滿足:SF⊕OF=1時,A<B測試條件滿足:SF⊕OF=0時,AB

有符號數(shù)比較大小的測試條件:JL(JNGE);SF⊕OF=1JNL(JGE);SF⊕OF=0

JLE(JNG);SF⊕OF=1或ZF=1JNLE(JG);SF⊕OF=0且ZF=0例2.25求較大值

cmp

ax,bx

;比較AX和BX

jaenext ;若AX≥BX,轉(zhuǎn)移

xchg

ax,bx

;若AX<BX,交換next: mov

wmax,ax如果AX和BX存放的是有符號數(shù),則條件轉(zhuǎn)移指令應采用JGE指令例2.25求較大值(另解)

cmp

ax,bx

;比較AX和BX

jae

next

mov

wmax,bx

;若AX<BX,wmax←BX

jmp

donenext: mov

wmax,ax

;若AX≥BX,wmax←AXdone:

……例2.25求較大值(另解對比)

cmp

ax,bx

;比較AX和BX

jbe

next

mov

wmax,ax

;若AX>BX,wmax←AX

jmp

donenext: mov

wmax,bx

;若AX≤BX,wmax←BXdone:

……2.6.3循環(huán)指令一段代碼序列多次重復執(zhí)行就是循環(huán)8088設計有針對CX計數(shù)器的計數(shù)循環(huán)指令

LOOPlabel ;循環(huán)指令 ;首先CX←CX-1;然后判斷;若CX≠0,轉(zhuǎn)移

JCXZlabel ;為0循環(huán)指令 :如果CX=0,則轉(zhuǎn)移label操作數(shù)采用相對短尋址方式還有LOOPZ/LOOPE和LOOPNZ/LOOPNE兩條指令dec

cxjnzlabel例2.26數(shù)據(jù)塊傳送(字節(jié))

movcx,400h

;設置循環(huán)次數(shù):1K=1024=400H

mov

si,offset

sbuf

;設置循環(huán)初值:SI指向數(shù)據(jù)段源緩沖區(qū)開始

mov

di,offset

dbuf

;DI指向附加段目的緩沖區(qū)開始(附加段)again: mov

al,[si]

;循環(huán)體:實現(xiàn)數(shù)據(jù)傳送

mov

es:[di],al

;每次傳送一個字節(jié)

incsi

;SI和DI指向下一個單元

incdi

loopagain

;循環(huán)條件判定:循環(huán)次數(shù)減1,不為0轉(zhuǎn)移(循環(huán))例2.26數(shù)據(jù)塊傳送(字)

movcx,200h

;設置循環(huán)次數(shù):1K÷2=200H

mov

si,offset

sbuf

;設置循環(huán)初值:SI指向數(shù)據(jù)段源緩沖區(qū)開始

mov

di,offset

dbuf

;DI指向附加段目的緩沖區(qū)開始(附加段)again: mov

ax,[si]

;循環(huán)體:實現(xiàn)數(shù)據(jù)傳送

mov

es:[di],ax

;每次傳送一個字

add

si,2

;指向下一個(字)單元

add

di,2

loopagain

;循環(huán)條件判定:循環(huán)次數(shù)減1,不為0轉(zhuǎn)移(循環(huán))2.6.4子程序指令子程序是完成特定功能的一段程序當主程序(調(diào)用程序)需要執(zhí)行這個功能時,采用CALL調(diào)用指令轉(zhuǎn)移到該子程序的起始處執(zhí)行當運行完子程序功能后,采用RET返回指令回到主程序繼續(xù)執(zhí)行演示

轉(zhuǎn)移指令有去無回子程序調(diào)用需要返回,其中利用堆棧保存返回地址1.子程序調(diào)用指令CALLCALL指令分成4種類型(類似JMP)CALLlabel

;段內(nèi)調(diào)用、相對尋址CALLr16/m16

;段內(nèi)調(diào)用、間接尋址CALLfarptrlabel

;段間調(diào)用、直接尋址CALLfarptrmem

;段間調(diào)用、間接尋址CALL指令需要保存返回地址:段內(nèi)調(diào)用——入棧偏移地址IPSP←SP-2,SS:[SP]←IP段間調(diào)用——入棧偏移地址IP和段地址CSSP←SP-2,SS:[SP]←CSSP←SP-2,SS:[SP]←IP2.子程序返回指令RET根據(jù)段內(nèi)和段間、有無參數(shù),分成4種類型RET

;無參數(shù)段內(nèi)返回RETi16

;有參數(shù)段內(nèi)返回RET

;無參數(shù)段間返回RETi16

;有參數(shù)段間返回需要彈出CALL指令壓入堆棧的返回地址段內(nèi)返回——出棧偏移地址IPIP←SS:[SP],SP←SP+2段間返回——出棧偏移地址IP和段地址CSIP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2例2.27十六進制轉(zhuǎn)換為ASCII碼的子程序;子程序:將DL低4位的一位16進制數(shù)轉(zhuǎn)換成ASCII碼htoasc proc anddl,0fh ;只取DL的低4位

ordl,30h ;DL高4位變成3

cmpdl,39h ;是0~9,還是0Ah~0Fh?

jbe

htoend

;是0~9,轉(zhuǎn)移

adddl,7 ;是0Ah~0Fh,加上7htoend: ret

;子程序返回htoasc

endp轉(zhuǎn)換原理;主程序:調(diào)用子程序movdl,28hcall

htoasc2.6.5中斷指令和系統(tǒng)功能調(diào)用中斷(Interrupt)是又一種改變程序執(zhí)行順序的方法8088CPU支持256個中斷,每個中斷用一個編號(中斷向量號)區(qū)別中斷指令有3條:

INTi8IRETINTO本節(jié)主要掌握類似子程序調(diào)用指令的中斷調(diào)用指令INTi8,進而掌握系統(tǒng)功能調(diào)用1.中斷指令INTi8;中斷調(diào)用指令:產(chǎn)生i8號中斷;主程序使用,其中i8表示中斷向量號IRET;中斷返回指令:實現(xiàn)中斷返回;中斷服務程序使用2.系統(tǒng)功能調(diào)用方法匯編程序提供給匯編語言程序員的功能非常有限程序員需要利用ROM-BIOS和操作系統(tǒng)提供的資源系統(tǒng)功能調(diào)用是程序設計的一個重要方面裸機ROM-BIOSDOS功能調(diào)用匯編語言程序系統(tǒng)功能調(diào)用步驟通常按照如下4個步驟進行:

在AH寄存器中設置系統(tǒng)功能調(diào)用號

在指定寄存器中設置入口參數(shù)

用中斷調(diào)用指令(INTi8)執(zhí)行功能調(diào)用

⑷根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況3.DOS輸入輸出功能調(diào)用DOS利用21H號中斷提供給用戶近百個系統(tǒng)功能,主要包括設備管理、目錄管理和文件管理三個方面的功能重點掌握:輸出一個字符,02H號功能調(diào)用輸出一個字符串,09H號功能調(diào)用02H號DOS功能調(diào)用輸出一個字符⑴

功能調(diào)用號:AH=02H⑵入口參數(shù):DL=欲顯示字符的ASCII碼⑶

功能調(diào)用:INT21H⑷

出口參數(shù):無;顯示一個問號“?”movah,02h

;設置功能調(diào)用號movdl,’?’

;設置入口參數(shù)int21h

;功能調(diào)用例2.28回車換行的子程序crlf proc pushax

;保護寄存器

pushdx

movah,2

movdl,0dh

;回車功能的ASCII碼是0DH

int21h

movah,2

movdl,0ah

;換行功能的ASCII碼是0AH

int21h popdx

;恢復寄存器

popax

retcrlf

endp09H號DOS功能調(diào)用輸出一個字符串⑴

功能調(diào)用號:AH=09H⑵入口參數(shù):

DS:DX=欲顯示字符串在內(nèi)存中的首地址(邏輯地址形式:DS=段地址,DX=偏移地址) 內(nèi)存中的字符串以ASCII碼形式保存,最后必須添加一個“$”結(jié)尾(并不顯示)⑶

功能調(diào)用:INT21H⑷

出口參數(shù):無例2.29提示按任意鍵繼續(xù) ;在數(shù)據(jù)段定義要顯示的字符串msgkey db‘Pressanykeytocontiune…’,’$’

;在代碼段編寫程序

movah,9

mov

dx,offset

msgkey

;設置入口參數(shù):

;DS=數(shù)據(jù)段地址(假設已經(jīng)設置好)

;DX=字符串的偏移地址

int21h4.ROM-BIOS輸入輸出功能調(diào)用ROM-BIOS也以中斷服務程序的形式,向程序員提供系統(tǒng)的基本輸入輸出程序ROM-BIOS功能更加基本,且與操作系統(tǒng)無關當DOS沒有啟動或不允許使用DOS功能調(diào)用時,可以使用ROM-BIOS功能調(diào)用熟悉輸出一個字符:⑴

功能調(diào)用號:AH=0EH⑵入口參數(shù):AL=欲顯示字符的ASCII碼通常BX=0⑶

功能調(diào)用:INT10H⑷

出口參數(shù):無2.7處理器控制類指令處理器控制類指令用來控制CPU的狀態(tài),使CPU暫停、等待或空操作等NOP

;空操作指令SEG:

;段超越前綴指令:CS:,SS:,

DS:,ES:HLT

;暫停指令:CPU進入暫停狀態(tài)還有其他指令:

LOCKESCWAIT總結(jié)本章展開了8088CPU16位指令系統(tǒng)的常用指令希望大家就如下幾個方面進行一下總結(jié):操作數(shù)尋址方式和目的地址尋址方式指令支持的操作數(shù)形式常用指令的助記符和功能指令對標志的影響通過復習整理,形成指令系統(tǒng)的整體概念,進而掌握常用指令指令執(zhí)行教學要求了解微處理器基本結(jié)構(gòu)、8088/8086的功能結(jié)構(gòu)掌握8088/8086的寄存器結(jié)構(gòu)、存儲器結(jié)構(gòu)和尋址方式熟悉匯編語言的語句格式,掌握8088/8086基本指令:數(shù)據(jù)傳送:MOV/XCHG/XLAT、PUSH/POP、LEA加減運算:ADD/SUB、ADC/SBB、CMP、INC/DEC位操作:AND/OR/XOR/NOT/TEST、SHL/SHR/SAR、ROL/ROR/RCL/RCR控制轉(zhuǎn)移:JMP/Jcc/LOOP、CALL/RET、INTn掌握DOS字符/字符串輸出功能調(diào)用方法;了解ROM-BIOS的字符輸出功能

溫馨提示

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

評論

0/150

提交評論