版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023/1/301微型計(jì)算機(jī)技術(shù)WeixinɡJisuɑnjiJishu
(第3版)
2023/1/302
第3章
8086的匯編語言程序設(shè)計(jì)2023/1/3038086的匯編語言程序設(shè)計(jì)3.18086的指令系統(tǒng)3.2匯編語言的基本語法3.3匯編語言程序設(shè)計(jì)基礎(chǔ)2023/1/3043.18086的指令系統(tǒng)3.1.18086指令的尋址方式3.1.28086指令簡(jiǎn)析2023/1/3053.1.18086指令的尋址方式所謂指令的尋址方式(AddressingMode)是指在指令中操作數(shù)的表示方式。由于程序編寫上的需要,大多數(shù)情況下,指令中并不直接給出操作數(shù)的數(shù)值,而是給出操作數(shù)存放的地址———
寄存器的地址或存儲(chǔ)單元的地址。同時(shí),在許多情況下,操作數(shù)的地址也不直接給出,而是給出計(jì)算操作數(shù)地址的方法。計(jì)算機(jī)執(zhí)行程序時(shí),根據(jù)指令給出的尋址方式,計(jì)算出操作數(shù)的地址,然后從該地址中取出操作數(shù)進(jìn)行指令操作碼指定的操作,把操作結(jié)果送入指定的目的操作數(shù)中。一般來說,計(jì)算機(jī)的尋址方式越豐富,指令系統(tǒng)的功能就越強(qiáng),工作的靈活性也越大。2023/1/306
8086指令的尋址方式立即尋址、寄存器尋址、存儲(chǔ)器尋址、串操作尋址、外設(shè)I/O端口尋址以及程序轉(zhuǎn)移操作尋址。其中,變化最多的是存儲(chǔ)器尋址,這種尋址方式又分為:直接尋址、寄存器間接尋址、基址尋址、變址尋址以及基址變址尋址。注意:根據(jù)尋址方式計(jì)算而得的地址只是有效地址EA
———
段內(nèi)偏移地址,這一地址還需與所在段的段基值組合后才能形成20位的物理地址。2023/1/307
立即尋址(ImmediateAddressing)立即尋址(的指令直接給出操作數(shù)的數(shù)值,即指令機(jī)器碼的最后1個(gè)或2個(gè)字節(jié)就是操作數(shù)———立即數(shù)。立即數(shù)只能作為源操作數(shù),在匯編碼指令中,可用十六進(jìn)制數(shù)(以H結(jié)尾)、二進(jìn)制數(shù)(以B結(jié)尾)和十進(jìn)制數(shù)(不需加特殊符號(hào))表示,也可以使用撇號(hào)“′”括起來的ASCII碼表達(dá)的字符和字符串。注意,如果十六進(jìn)制數(shù)以字母A~F打頭,則必須在前面加上一個(gè)“0”,這是匯編程序的要求。由于立即數(shù)是直接從指令中取得的,所以取數(shù)速度較快,這種尋址方式常用來給寄存器或存儲(chǔ)器賦初值。2023/1/308寄存器尋址(RegisterAddressing)操作數(shù)在寄存器中,即寄存器的內(nèi)容就是操作數(shù)的數(shù)值。在匯編碼指令中,操作數(shù)用寄存器的符號(hào)來表示。例如,INCAX,其功能為AX+1→AX。這類尋址方式的指令的機(jī)器碼字節(jié)最短,因?yàn)椋競(jìng)€(gè)通用寄存器只要用3個(gè)代碼即可區(qū)分。另外,由于寄存器是在微處理器芯片的內(nèi)部,整個(gè)操作都在微處理器內(nèi)部進(jìn)行,不必執(zhí)行訪問內(nèi)存的總線周期,因此其執(zhí)行速度最快。8086的寄存器尋址中,可用的寄存器有通用寄存器和段寄存器,寄存器可作為源寄存器或/與目的寄存器。例如“
MOVDS,AX”
。2023/1/309存儲(chǔ)器尋址(MemoryAddressing)對(duì)于存儲(chǔ)器尋址的指令,操作數(shù)在存儲(chǔ)器中,在指令操作中,存儲(chǔ)器操作數(shù)出入微處理器都需經(jīng)過總線。當(dāng)EU讀或?qū)懸粋€(gè)存儲(chǔ)器操作數(shù)時(shí),必須將一個(gè)偏移地址(OffsetAddress)傳送給BIU,BIU經(jīng)過地址運(yùn)算后產(chǎn)生一個(gè)20位的物理地址,然后執(zhí)行存取該操作數(shù)所需的總線周期。EU為一個(gè)存儲(chǔ)器操作數(shù)而計(jì)算出來的偏移量稱為操作數(shù)的有效地址EA,這是一個(gè)16位無符號(hào)數(shù),表示該操作數(shù)所在存儲(chǔ)單元與所在段起始地址的距離(以字節(jié)為單位)。2023/1/3010存儲(chǔ)器尋址一條存儲(chǔ)器尋址的指令能訪問由基址寄存器內(nèi)容或/與變址寄存器內(nèi)容或/與DISP值組合而得的有效地址EA所決定的存儲(chǔ)單元。其中,DISP(Displacement)為位移量,是一個(gè)8位或16位數(shù),DISP包含在指令中,根據(jù)程序中操作數(shù)名稱(變量或標(biāo)號(hào))的位置推算而得,程序員可修改或規(guī)定此值。2023/1/3011按其有效地址EA的形成方法可分為如下幾種1)直接尋址
2)寄存器間接尋址3)基址尋址4)變址尋址5)基址變址尋址2023/1/30121)直接尋址(DirectAddressing)
由指令直接給出操作數(shù)的偏移地址,它緊跟在操作碼之后。例如,INCBYTEPTR[04A3H]指令中,存儲(chǔ)器操作數(shù)的偏移地址為4A3H。直接尋址指令的另一種表示形式為
INCADDR,指令中存儲(chǔ)器操作數(shù)的地址用符號(hào)地址(變量,Variable)ADDR表示。2023/1/30132)寄存器間接尋址
(RegisterIndirectAddressing)
存儲(chǔ)器操作數(shù)的有效地址直接取自一個(gè)基址寄存器(BX)或變址寄存器(SI或DI)。例如INCBYTEPTR[BX]。2023/1/3014
3)基址尋址(BasedAddressing)以基址寄存器BX或BP的內(nèi)容為基準(zhǔn)地址,指令中再給出一個(gè)地址位移量D(D8或D16),它們組合而得存儲(chǔ)器操作數(shù)的有效地址。匯編碼指令中有效地址的表示方法有如下幾種:[BX(或BP)+D],其中,D為常量,例如INCBYTEPTR[BP+4]。
D[BX(或BP)],其中,D為變量或常量,例如INCADDR[BX]。當(dāng)使用BP作基址尋址時(shí),若無指定段替換,則內(nèi)定在堆棧段內(nèi)尋址。若D為常量,則以有符號(hào)的二進(jìn)制數(shù)表示,可為8位或16位值。當(dāng)D為8位值時(shí),有效地址計(jì)算中,位移量必須進(jìn)行符號(hào)擴(kuò)展。2023/1/30154)變址尋址(IndexedAddressing)
指令中給出一個(gè)位移量D作為基準(zhǔn)地址,再同變址寄存器SI(或DI)的內(nèi)容相加作為存儲(chǔ)器操作數(shù)的有效地址。匯編碼指令中的有效地址有[SI(或DI)+D]以及D[SI(或DI)]兩種表示,式中D的含義與基址尋址的相同。基址尋址和變址尋址又稱為寄存器相對(duì)尋址。2023/1/30165)基址變址尋址
(BasedIndexedAddressing)基址寄存器BX(或BP)中存放基準(zhǔn)地址,變址寄存器SI(或DI)存放變址值,指令中再給出一個(gè)位移量D,三者相加構(gòu)成存儲(chǔ)器操作數(shù)的有效地址。其中,D可為8位數(shù)或16位數(shù),也可以無此項(xiàng)。若為8位數(shù),在計(jì)算中應(yīng)進(jìn)行符號(hào)擴(kuò)展。2023/1/3017基址變址尋址匯編碼指令中的有效地址有兩種表示:1、[BX(或BP)+SI(或DI)+D],例如,INCBYTEPTR[BX+DI+4];2、D[BX(或BP)+SI(或DI)],例如,INCADDR[BX+SI]。采用BP作為基址時(shí),規(guī)定在當(dāng)前堆棧內(nèi)尋址。含有D項(xiàng)的基址變址方式又稱為相對(duì)基址變址尋址方式。2023/1/3018程序轉(zhuǎn)移尋址指令在順序執(zhí)行時(shí),下一條指令的偏移地址總是由指令指針I(yè)P自動(dòng)遞增而得,當(dāng)程序在本段內(nèi)發(fā)生轉(zhuǎn)移時(shí),需要給出即將轉(zhuǎn)移去執(zhí)行的那條指令的偏移地址,并用它去取代IP中的原有內(nèi)容。如果即將轉(zhuǎn)移去執(zhí)行的指令與原來執(zhí)行的指令不在同一段中,則還需用新的代碼段的段基值去取代CS中的原有內(nèi)容,此時(shí),操作數(shù)作為轉(zhuǎn)移地址使用,分別送到IP和CS。2023/1/3019程序轉(zhuǎn)移尋址程序轉(zhuǎn)移尋址方式用于條件轉(zhuǎn)移指令、無條件轉(zhuǎn)移指令、循環(huán)指令和轉(zhuǎn)子指令(調(diào)用指令)。程序轉(zhuǎn)移尋址方式按目的地址的形式可分為如下幾種。2023/1/30201)相對(duì)尋址以IP的內(nèi)容為基準(zhǔn)地址,加上緊跟指令操作碼后的相對(duì)位移量D,得到轉(zhuǎn)移地址的偏移地址。轉(zhuǎn)移地址的偏移地址為IP+D,D是帶符號(hào)的二進(jìn)制數(shù)。當(dāng)D為8位數(shù)時(shí),轉(zhuǎn)移范圍為-128~+128;當(dāng)D為16位數(shù)時(shí),轉(zhuǎn)移范圍為-32768~+32767(注意:不能越段)。例如,條件轉(zhuǎn)移指令JEA和無條件轉(zhuǎn)移指令JMPADDR,指令中的A、ADDR為轉(zhuǎn)移地址的標(biāo)號(hào)。這種尋址方式又稱為段內(nèi)直接轉(zhuǎn)移。2023/1/30212)段內(nèi)寄存器尋址以寄存器的內(nèi)容為轉(zhuǎn)移地址的偏移地址。例如,“
JMPBX”
,BX中的內(nèi)容即偏移地址。2023/1/30223)段內(nèi)間接轉(zhuǎn)移尋址包括前述的存儲(chǔ)器操作數(shù)中的寄存器間接尋址、變址尋址、基址尋址以及基址變址尋址等幾種尋址方式,這些尋址方式求得的操作數(shù)即為轉(zhuǎn)移地址的偏移地址。例如,JMPWORDPTR[BX],JMPVAR[BX][SI],JMPWORDPTR[EA](EA為有效地址)。指令中的[BX]及VAR[BX][SI]都表示段內(nèi)間接轉(zhuǎn)移地址為偏移地址。2023/1/30234)段間直接轉(zhuǎn)移尋址程序從一個(gè)代碼段轉(zhuǎn)移到另一個(gè)代碼段稱為段間轉(zhuǎn)移,實(shí)現(xiàn)段間轉(zhuǎn)移不僅要求改變IP中的指令偏移地址,還要改變CS中的段基值。這種尋址方式的轉(zhuǎn)移指令中帶有兩個(gè)16位地址,第一個(gè)地址為轉(zhuǎn)移地址的偏移值,第二個(gè)地址為轉(zhuǎn)移地址的段基值。2023/1/30245)段間間接轉(zhuǎn)移尋址在這種尋址方式的轉(zhuǎn)移指令中,要實(shí)現(xiàn)段間轉(zhuǎn)移所需的兩個(gè)16位地址,可以用任何數(shù)據(jù)存儲(chǔ)器的間接尋址方式求得,匯編碼指令形式為:JMPDWORDPTR[EA]。2023/1/3025
3.2
8086指令簡(jiǎn)析8086的匯編碼指令(即匯編語言指令)有100多條(以助記符計(jì)算),按功能可分為數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、位處理指令、串操作指令、程序轉(zhuǎn)移指令和處理器控制指令共6大類,2023/1/30261.數(shù)據(jù)傳送指令(共14條)助記符功能通用數(shù)據(jù)傳送指令MOV傳送字節(jié)或字PUSH字入棧POP字出棧XCHG交換字節(jié)或字XLAT字節(jié)轉(zhuǎn)換地址目標(biāo)傳送指令LEA裝入有效地址LDS將指針變量裝入寄存器及DSLES將指針變量裝入寄存器及ES標(biāo)志傳送指令LAHF標(biāo)志寄存器低字節(jié)送AHSAHFAH值送標(biāo)志寄存器低字節(jié)PUSHF標(biāo)志寄存器內(nèi)容進(jìn)棧POPF標(biāo)志寄存器內(nèi)容出棧I/O指令I(lǐng)N輸入字節(jié)或字OUT輸出字節(jié)或字2023/1/3027
數(shù)據(jù)傳送指令(共14條)
src/s源,dest/d目的reg/r寄存器,mem/m存儲(chǔ)器(內(nèi)存)sreg段寄存器,B字節(jié),W字2023/1/3028數(shù)據(jù)傳送指令(續(xù))1)MOVdest,src(B/W);ds2)PUSHsrc(W) ;SPSP-2 (SP+1)(SP)srcPOPdest(W); dest(SP+1)(SP)SPSP+23)XCHGdest,src(B/W);destsrc2023/1/3029數(shù)據(jù)傳送指令(續(xù))4.XLAT(B)XLAT變量名/表格首地址(B)AL[BX+AL]5.LEAreg16,mem(W);reg16EAsrc(loadeffectiveaddress)6.傳送是復(fù)制(COPY),除XCHG,XLAT外都不改變src.7.除POPF,SAHF外,不影響FR.2023/1/30302.算術(shù)運(yùn)算指令
(20條)助記符功能加法指令A(yù)DD加法ADC帶進(jìn)位的加法INC增量(加1)AAA加法的ASCII修正DAA加法的十進(jìn)制修正減法指令SUB減法SBB帶借位的減法DEC減量(減1)NEG求補(bǔ)(變負(fù))CMP比較AAS減法的ASCII修正DAS減法的十進(jìn)制修正2023/1/3031乘法指令MUL無符號(hào)數(shù)乘法IMUL整數(shù)乘法AAM乘法的ASCII修正除法指令DIV無符號(hào)數(shù)除法IDIV整數(shù)除法AAD除法的ASCII修正CBW字節(jié)轉(zhuǎn)換為字CWD字轉(zhuǎn)換為雙字2023/1/3032算術(shù)運(yùn)算指令
(續(xù))1)加法指令
ADDdest,src;B/WADCdest,src;B/WDest和src可以是帶符號(hào)數(shù),也可以是無符號(hào)數(shù)。
INCdest;B/Wdestdest+1INC指令不影響CF。2023/1/3033算術(shù)運(yùn)算指令
(續(xù))2)減法指令
SUBdest,src;B/WSBBdest,src;B/WCMPdest,src;B/WDECdest;B/Wdest-1destNEGdest;B/WDEC指令不影響CF。2023/1/3034
NEG指令的三種理解:
l)dest求補(bǔ)(全部位取反加l);2)dest變負(fù);3)零減dest。2023/1/3035算術(shù)運(yùn)算指令
(續(xù))3)修正指令
DAA,DAS
當(dāng)BCD碼進(jìn)行加或減法運(yùn)算時(shí),在加法指令和減法指令后,必須加上一條DAA指令(加法)或DAS(減法)指令。2023/1/3036算術(shù)運(yùn)算指令
(續(xù))4)乘除法指令(乘法)
MUL,DIVMULr/m(B/W)
當(dāng)r/m為8位時(shí),指令操作為AL*r/m送AX
當(dāng)r/m為16位時(shí),
指令操作為AX*r/m送DX_AX(DX_AX表示以DX和AX構(gòu)成的一個(gè)32位寄存器)2023/1/3037算術(shù)運(yùn)算指令
(續(xù))
乘除法指令(除法)
DIVr/m(B/W)
當(dāng)r/m為8位時(shí),指令操作為:AX/(r/m)B,結(jié)果商送AL,余數(shù)送AH;
當(dāng)r/m為l6位時(shí),指令操作為:DX_AX/(r/m)w,結(jié)果商送AX,余數(shù)送DX。2023/1/3038算術(shù)運(yùn)算指令
(續(xù))5)擴(kuò)展指令CBW;AL轉(zhuǎn)換為AX,且AX=ALCWD;AX轉(zhuǎn)換為DXAX,且DX_AX=AX都為符號(hào)擴(kuò)展。2023/1/30393.位處理指令(14條)助記符功能邏輯運(yùn)算指令A(yù)ND邏輯“與”O(jiān)R邏輯“或”NOT邏輯“非”XOR邏輯“異或”TEST測(cè)試移位指令SHL邏輯左移SAL算術(shù)左移SHR邏輯右移SAR算術(shù)右移循環(huán)移位指令ROL循環(huán)左移ROR循環(huán)右移RCL通過CF循環(huán)左移RCR通過CF循環(huán)右移2023/1/3040位處理指令(續(xù))1)邏輯運(yùn)算指令A(yù)ND、OR、XOR、TEST、NOT前三條指令執(zhí)行后,同時(shí)使CF=0TEST指令實(shí)現(xiàn)”與”操作,但不改變目的操作數(shù),將運(yùn)算結(jié)果的特性反映在標(biāo)志寄存器中NOT指令不影響標(biāo)志位。2023/1/3041位處理指令(續(xù))2)移位指令SHL/SAL(邏輯左移/算術(shù)左移),實(shí)現(xiàn)相同操作;功能:0(補(bǔ)零)CF dest2023/1/3042位處理指令(續(xù))移位指令SHR邏輯右移0dest CF2023/1/3043位處理指令(續(xù))SAR算術(shù)右移,實(shí)現(xiàn)帶符號(hào)數(shù)被2除,朝小取整。SH……shift,A……arithmetic
dest CF2023/1/3044位處理指令(續(xù))3)循環(huán)移位指令ROL小循環(huán)左移CF dest2023/1/3045位處理指令(續(xù))ROR小循環(huán)右移
dest CF2023/1/3046位處理指令(續(xù))RCL帶進(jìn)位位左移(大循環(huán)左移)CF dest2023/1/3047位處理指令(續(xù))RCR帶進(jìn)位位右移(大循環(huán)右移)dest CF2023/1/3048位處理指令(續(xù))注意:移位和循環(huán)移位后移出位都送標(biāo)志位CF指令格式:
SHL/RORreg/mem,countcount=1(移位次數(shù)為1時(shí))count=CL(移位次數(shù)大于1時(shí))2023/1/3049位處理指令(續(xù))例如:AL邏輯右移4次的指令為:
MOVCL,4SHRAL,CL2023/1/30504.串操作指令(共5條)助記符功能串操作指令MOV(MOVSB,MOVSW)串傳送(字節(jié)傳送,字傳送)CMPS(CMPSB,CMPSW)串比較(字節(jié)比較,字比較)STOS(STOSB,STOSW)存入串(存入字節(jié),存入字)LODS(LODSB,LODSW)取出串(取出字節(jié),取出字)SCAS(SCASB,SCASW)掃描串(掃描字節(jié),掃描子)重復(fù)前綴REP重復(fù)操作REPE/REPZ等于/為零重復(fù)REPNE/REPNZ不等于/不為零重復(fù)2023/1/3051助記符功能無條件轉(zhuǎn)移指令CALL調(diào)用過程(子過程)RET從過程(子程序)返回JMP無條件轉(zhuǎn)移條件轉(zhuǎn)移指令JA/JNBE高于/不低于等于,轉(zhuǎn)移JAE/JNB高于等于/不低于,轉(zhuǎn)移JB/JNAE低于/不高于等于,轉(zhuǎn)移JBE/JNA低于等于/不高于,轉(zhuǎn)移JC有進(jìn)位(借位),轉(zhuǎn)移JE/JZ等于/為零,轉(zhuǎn)移JG/JNLE大于/不小于等于,轉(zhuǎn)移JGE/JNL大于等于/不小于,轉(zhuǎn)移JL/JNGE小于/不大于等于,轉(zhuǎn)移JLE/JNG小于等于/不大于,轉(zhuǎn)移JNC無進(jìn)位(借位),轉(zhuǎn)移2023/1/3052條件轉(zhuǎn)移指令JNE/JNZ不等于/不為零,轉(zhuǎn)移JNO不溢出,轉(zhuǎn)移JNP/JPOPF為“0”/奇狀態(tài),轉(zhuǎn)移JNSSF為“0”,轉(zhuǎn)移JO溢出,轉(zhuǎn)移JP/JPEPF為“1”/偶狀態(tài),轉(zhuǎn)移JSSF為“1”,轉(zhuǎn)移JCXZ寄存器CX=0,轉(zhuǎn)移重復(fù)控制指令LOOP循環(huán)LOOPE/LOOPZ等于/為零,循環(huán)LOOPNE/LOOPNZ不等于/不為零,循環(huán)中斷指令I(lǐng)NT中斷INT3斷點(diǎn)中斷INTO溢出中斷IRET中斷返回2023/1/3053串操作指令(續(xù))1)MOVSB;[DS:SI]B→[ES:DI]B,SI/DI+/-1CMPSB;[DS:SI]B-[ES:DI]B,SI/DI+/-1STOSB;AL→[ES:DI]B,DI+/-1LODSB;[DS:SI]B
→AL,SI+/-1SCASB;AL-[ES:DI]B,DI+/-1(教材P50中CMPSB;[DS:SI]B→ES:DI]B
有誤)2023/1/3054串操作指令(續(xù))2)若MOVSB改為MOVSW,則改為字操作
[DS:SI]B
和[ES:DI]B
改為
[DS:SI]W
和[ES:DI]WCMPSW同MOVSW,STOSW、LODSW和SCASW指令中將原來的AL改為AX而SI/DI+/-1改為SI/DI+/-22023/1/3055串操作指令(續(xù))3)若五條串操作指令中來標(biāo)明B或W,則指令格式為:MOVS dest,srcCMPSsrc,destSTOSdestLODSsrcSCASdest2023/1/3056串操作指令(續(xù))
式中dest和src都為變量名,變量定義時(shí)所定義的類型屬性決定串操作中的操作類型。2023/1/3057串操作指令(續(xù))
4)5條重復(fù)前綴指令 例題:要求把內(nèi)存區(qū)中2000H:5000H開始的100個(gè)字節(jié)數(shù)傳送到3000H:4000H中,用串操作指令實(shí)現(xiàn)之。
注意,MOVSB指令每執(zhí)行一次只能傳送一個(gè)字節(jié),所以必須編寫一段循環(huán)程序,
2023/1/3058串操作指令(續(xù))
解: MOVAX,2000H MOVDS,AX MOVAX,3000H MOVES,AXMOVSI,5000HMOVDI,4000H MOVCX,100 LOP:MOVSB DECCX JNZLOP2023/1/3059串操作指令(續(xù))
若采用重復(fù)前綴REP,則最后三條指令可改為:
REPMOVSB REP的功能是:重復(fù)執(zhí)行右邊的串操作指令CX次2023/1/3060串操作指令(續(xù))另有4條重復(fù)前綴指令:REPZ……若CX≠0,且ZF=1,則重復(fù)執(zhí)行右邊的串操作指令若CX=0,或ZF=0,則結(jié)束串操作REPNZ……若CX≠0,且ZF=0,則重復(fù)執(zhí)行右邊的串操作指令若CX=0,或ZF=1,則結(jié)束串操作2023/1/3061串操作指令(續(xù))REPE與REPZ功能一樣,REPNE與REPNZ功能一樣。通常REP前綴用于MOVS/MOVSB/MOVSW和STOS/SORSB/STOSW而REPZ/REPE/REPNZ/REPNE前緩用于CMPS/CMPSB/CMPSW和SCAS/SCASB/SCASW。2023/1/30625.程序轉(zhuǎn)移指令助記符功能無條件轉(zhuǎn)移指令CALL調(diào)用過程(子過程)RET從過程(子程序)返回JMP無條件轉(zhuǎn)移條件轉(zhuǎn)移指令JA/JNBE高于/不低于等于,轉(zhuǎn)移JAE/JNB高于等于/不低于,轉(zhuǎn)移JB/JNAE低于/不高于等于,轉(zhuǎn)移JBE/JNA低于等于/不高于,轉(zhuǎn)移JC有進(jìn)位(借位),轉(zhuǎn)移JE/JZ等于/為零,轉(zhuǎn)移JG/JNLE大于/不小于等于,轉(zhuǎn)移JGE/JNL大于等于/不小于,轉(zhuǎn)移JL/JNGE小于/不大于等于,轉(zhuǎn)移JLE/JNG小于等于/不大于,轉(zhuǎn)移JNC無進(jìn)位(借位),轉(zhuǎn)移2023/1/3063條件轉(zhuǎn)移指令JNE/JNZ不等于/不為零,轉(zhuǎn)移JNO不溢出,轉(zhuǎn)移JNP/JPOPF為“0”/奇狀態(tài),轉(zhuǎn)移JNSSF為“0”,轉(zhuǎn)移JO溢出,轉(zhuǎn)移JP/JPEPF為“1”/偶狀態(tài),轉(zhuǎn)移JSSF為“1”,轉(zhuǎn)移JCXZ寄存器CX=0,轉(zhuǎn)移重復(fù)控制指令LOOP循環(huán)LOOPE/LOOPZ等于/為零,循環(huán)LOOPNE/LOOPNZ不等于/不為零,循環(huán)中斷指令I(lǐng)NT中斷INT3斷點(diǎn)中斷INTO溢出中斷IRET中斷返回2023/1/3064程序轉(zhuǎn)移指令(續(xù))1)無條件跳轉(zhuǎn)(1)JMP標(biāo)號(hào)/reg/mem①標(biāo)號(hào)(label)是代碼段中一條指令的符號(hào)地址,它可以作為程序轉(zhuǎn)移指令的操作數(shù)使用。2023/1/3065無條件跳轉(zhuǎn)
標(biāo)號(hào)有三屬性……
段屬性(段基值)
偏移量屬性(偏移地址)
類型屬性(NEAR或FAR)2023/1/3066無條件跳轉(zhuǎn)(續(xù))標(biāo)號(hào)的類型屬性為FAR,則實(shí)現(xiàn)段間轉(zhuǎn)移,指令為5字節(jié)長(zhǎng);標(biāo)號(hào)的類型屬性為NEAR,則實(shí)現(xiàn)段內(nèi)轉(zhuǎn)移,指令為3字節(jié)長(zhǎng);標(biāo)號(hào)的類型屬性為NEAR中的SHORT,則實(shí)現(xiàn)段內(nèi)短轉(zhuǎn)移,指令為2字節(jié)長(zhǎng)。2023/1/3067無條件跳轉(zhuǎn)(續(xù))段間跳轉(zhuǎn)時(shí)機(jī)器指令中的地址為絕對(duì)地址,是二個(gè)16位地址,偏移地址在前,段基值在后;段內(nèi)跳轉(zhuǎn)時(shí)機(jī)器指令中的地址為相對(duì)地址,是偏移地址的差值(16位);段內(nèi)短跳轉(zhuǎn)時(shí)機(jī)器指令中的地址為相對(duì)地址,是偏移地址的差值(8位)2023/1/3068無條件跳轉(zhuǎn)(續(xù))
②JMPBX;NEAR,功能為:IPBX
2023/1/3069無條件跳轉(zhuǎn)(續(xù))
③JMP[BX][BX]必須寫明:是WORDPTR[BX],
還是DWORDPTR[BX]若為WORDPTR[BX],則為段內(nèi)跳轉(zhuǎn),
功能是用[BX]W送IP;若為DWORDPTR[BX],則為段間跳轉(zhuǎn),
功能是用[BX]DW送CS:IP。2023/1/3070
分類范圍尋址方式操作數(shù)類型操作數(shù)使用方式示例段內(nèi)轉(zhuǎn)移直接標(biāo)號(hào)1字節(jié)立即數(shù)加入IPJMPSHORTSTARTJMPSTART2字節(jié)立即數(shù)加入IP間接寄存器操作數(shù)送入IPJMPBXJMPJTABLE[BX]存儲(chǔ)器操作數(shù)(2字節(jié))送入IP段間轉(zhuǎn)移直接標(biāo)號(hào)(4字節(jié)立即數(shù))送入IP/CSJMPSTART1間接存儲(chǔ)器操作數(shù)(4字節(jié))送入IP/CSJMPJTABLE1[BX]JMP指令的匯編表示2023/1/3071無條件跳轉(zhuǎn)(續(xù))(2)CALL標(biāo)號(hào)/reg/mem
調(diào)用指令,用來調(diào)用一個(gè)子程序(過程),又稱為轉(zhuǎn)子指令。
CALL指令的格式同JMP指令,區(qū)別在于CALL指令必須保存斷點(diǎn)(CS:IP),這是由硬件來實(shí)現(xiàn)的。2023/1/3072無條件跳轉(zhuǎn)(續(xù))(3)RET返回指令,從子程序返回主程序。2023/1/30732)條件轉(zhuǎn)移指令(1)JC/JZ/JS/JO/JP當(dāng)CF/ZF/SF/OF/PF=1時(shí)跳轉(zhuǎn);JNC/JNZ/JNS/JNO/JNP當(dāng)CF/ZF/SF/OF/PF=0時(shí)跳轉(zhuǎn)JP與JPE等價(jià),JNP與JPO等價(jià);JZ與JE等價(jià),JNZ與JNE等價(jià)。2023/1/3074條件跳轉(zhuǎn)(續(xù))
(2)JAabove> JBbelow< JGgreater> JLless< JA和JB用于無符號(hào)數(shù),JG和JL用于 帶符號(hào)數(shù)。
JA與JNBE等價(jià)2023/1/3075條件跳轉(zhuǎn)(續(xù))(3)JCXZ當(dāng)CX=0時(shí)跳轉(zhuǎn) 所有的條件轉(zhuǎn)移指令都為短跳轉(zhuǎn),操作數(shù)為標(biāo)號(hào)。2023/1/30763)重復(fù)控制指令
LOOP標(biāo)號(hào) 當(dāng)CX-1≠0時(shí)跳到標(biāo)號(hào)處。
LOOPZ/LOOPE當(dāng)CX-1≠0且ZF=1時(shí)跳轉(zhuǎn)
LOOPNZ/LOOPNE當(dāng)CX-1≠0且ZF=0時(shí)跳轉(zhuǎn)
LOOP標(biāo)號(hào)與DECCXJNZ標(biāo)號(hào)等價(jià)。2023/1/30774)中斷指令I(lǐng)NTN;指令中斷,N為0~255間的正整數(shù)
INT3;斷點(diǎn)中斷、單字節(jié)中斷指令
INTO;溢出中斷
IRET;中斷返回2023/1/30786.處理器控制指令助記符功能標(biāo)志操作STC進(jìn)位標(biāo)志置1CLC進(jìn)位標(biāo)志置0CMC進(jìn)位標(biāo)志取反STD方向標(biāo)志置1CLD方向標(biāo)志置0STI中斷允許標(biāo)志置1CLI中斷允許標(biāo)志置0外同步HLT暫停直至中斷或復(fù)位WAIT等待-TEST信號(hào)有效ESC交權(quán)給外部處理機(jī)LOCK在下一條指令期間封鎖總線空操作NOP空操作2023/1/3079處理器控制指令(續(xù))六條對(duì)標(biāo)志位置l和清0的指令:
STISTDSTCCLICLDCLCCF取反指令CMC暫停指令HLT三條控制CPU工作的指令:
WAIT(等待),ESC(交權(quán)),LOCK(封鎖指令)。2023/1/30803.2匯編語言的基本語法
3.2.1匯編語言源程序的格式
3.2.2常量、標(biāo)識(shí)符和表達(dá)式
3.2.3指示性語句
3.2.4指令性語句
3.2.5宏指令2023/1/30813.2.1匯編語言源程序的格式程序是為實(shí)現(xiàn)某一特定目的(例如,對(duì)數(shù)據(jù)進(jìn)行某種處理等)而編寫的一組指令的有序集合。匯編語言程序就是用匯編語言編寫的源程序。匯編語言是一種面向機(jī)器的語言。它是與計(jì)算機(jī)硬件密切關(guān)聯(lián)的,因而熟悉計(jì)算機(jī)硬件是匯編語言程序員必須具備的條件。與用高級(jí)語言編寫程序相比較,匯編語言程序具有更高的效率,它的程序執(zhí)行時(shí)間短且占用內(nèi)存少,這在計(jì)算機(jī)實(shí)時(shí)控制和實(shí)時(shí)處理中是十分重要的,因而在實(shí)時(shí)領(lǐng)域中得到廣泛的應(yīng)用。2023/1/3082匯編語言與匯編程序用匯編語言編寫的源程序必須用匯編程序(一種系統(tǒng)軟件)進(jìn)行匯編,將它轉(zhuǎn)換成用機(jī)器語言表示的目標(biāo)程序后,才能由CPU識(shí)別執(zhí)行。因此編制程序時(shí)必須遵循規(guī)定的格式和語法。不同型號(hào)的CPU和不同版本的匯編程序,其匯編語言是不同的。對(duì)于同一系列的CPU,則是向上兼容的2023/1/3083例3-1對(duì)10個(gè)字節(jié)數(shù)據(jù)a1~a10求和。DATA
SEGMENTAT2000HARRAYDBa1,a2,a3,…
,a10COUNTEQU$-ARRAYSUMDW?DATAENDSSTACKSEGMENTPARASTACK餐STACK餐STAKDB10
DUP(?)TOPEQULENGTHSTAKSTACKENDSCODESEGMENTASSUME
CS:CODE,DS:DATA,SS:STACK2023/1/3084例3-1START:MOVAX,DATAMOVDS,AXMOVAX,0MOVDI,OFFSETSUMMOVBX,OFFSETARRAYMOVCX,COUNTLOP:ADDAL,[BX]ADCAH,0INCBXLOOPLOPMOV[DI],AXMOVAH,4CHINT21
HCODEENDSENDSTART2023/1/3085匯編語言的兩個(gè)組成特點(diǎn)分段結(jié)構(gòu)和語句行
1.分段結(jié)構(gòu)8086/8088的程序是分段的,由此可知程序最多可由4種段組成,并分別將段寄存器CS、DS、ES和SS的內(nèi)容作為段基值,每段所占內(nèi)存容量可達(dá)64KB。上例程序共有3段,它們分別是數(shù)據(jù)段(段名DATA)、堆棧段(段名STACK)和代碼段(段名CODE),各段由命令SEGMENT開始,并由命令ENDS結(jié)束。2023/1/3086語句行2.語句行上例程序共有26行,即共有26個(gè)語句行。匯編語言程序的語句有兩類:指令性語句和指示性語句。2023/1/3087語句行
指令性語句是主要由指令構(gòu)成的語句,其格式為
[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]其中操作碼和操作數(shù)是用助記符表示的指令的兩個(gè)部分,操作數(shù)可以是1個(gè)、2個(gè)或幾個(gè),也可以無操作數(shù)(或是默認(rèn)的)。2023/1/3088
1)指令性語句其中帶方括號(hào)的有三項(xiàng):標(biāo)號(hào)、操作數(shù)和注釋。帶有方括號(hào)表示該項(xiàng)是任選項(xiàng),即根據(jù)具體編程需要該項(xiàng)可有可無,在實(shí)際語句中該項(xiàng)的方括號(hào)是不寫出來的。標(biāo)號(hào)具有該語句指令所在內(nèi)存地址的屬性,通常在轉(zhuǎn)移指令中用做目的地址。注意,標(biāo)號(hào)必須用冒號(hào)“:”結(jié)尾,這是語法的規(guī)定。用分號(hào)“;”開始的注釋用來說明該語句在程序中的作用,以方便程序的閱讀和修改,這項(xiàng)也是任選的。2023/1/30892)指示性語句指示性語句是主要由命令(也稱偽指令)構(gòu)成的語句,用來指示匯編程序進(jìn)行匯編操作,其格式為[名字/變量]命令參數(shù)[;注釋]其中,“命令”指示匯編程序進(jìn)行某種匯編操作,“參數(shù)”是有關(guān)的數(shù)據(jù),帶方括號(hào)的項(xiàng)是任選項(xiàng)。2023/1/30903.2.2常量、標(biāo)識(shí)符和表達(dá)式1.常量
2.標(biāo)識(shí)符
3.表達(dá)式2023/1/30911.常量常量是其值在程序中不能改變的量,
在匯編語言源程序中的常量有:
數(shù)字常量、字符常量和符號(hào)常量(1)數(shù)字常量可以是二進(jìn)制數(shù)、八進(jìn)制數(shù)、十進(jìn)制數(shù)或十六進(jìn)制數(shù)表示(2)字符常量是用單引號(hào)‘
’括起來的ASCII字符其值是該字符的ASCII代碼值(3)符號(hào)常量是用符號(hào)定義的常量。 例如,采用符號(hào)定義語句PORTAEQU80H,則指令MOVAL,PORTA與指令MOVAL,80H等價(jià)。
2023/1/30922.標(biāo)識(shí)符
在編程時(shí)建立的有特定意義的字符序列,標(biāo)識(shí)符可用作符號(hào)常量、名字、變量和標(biāo)號(hào)等。 組成標(biāo)識(shí)符有如下規(guī)定:
(1)組成標(biāo)識(shí)符的字符有: 英文大寫字母:A~Z; 英文小寫字母:a-z; 數(shù)字0~9; 字符?、@、_、$;
(2)字符長(zhǎng)度不超過3l個(gè);
(3)首字符不能是數(shù)字;
(4)?不能單獨(dú)作為一個(gè)標(biāo)識(shí)符;
(5)不能把保留字用作標(biāo)識(shí)符,保留字包括助記符、寄存器名等。
2023/1/30933.表達(dá)式
表達(dá)式由操作數(shù)和運(yùn)算符組成。 操作數(shù)可以是常量、名字、變量和標(biāo)號(hào)等。 運(yùn)算符包括算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、分析運(yùn)算符和合成運(yùn)算符等。
2023/1/3094表達(dá)式中的運(yùn)算符
高
優(yōu)先級(jí)低1括號(hào)中的項(xiàng),即(…)和[…]2LENGTH,SIZE,WIDTH,MASK3PTR,OFFSET,SEG,TYPE,THIS4*,/,MOD5+,-6EQ,NE,L,LE,GT,GE7NOT8AND9OR,XOR2023/1/30953.2.3指示性語句1.程序開始和結(jié)束語句2.段定義語句3.過程定義語句4.數(shù)據(jù)定義語句5.符號(hào)定義語句2023/1/30961.程序開始和結(jié)束語句(1)NAME命令 給程序模塊命名 格式:NAME名字(2)TITLE命令 格式:TITLE名字 名字作為每頁標(biāo)題打印出來,標(biāo)題名字符不大于60個(gè)2023/1/3097程序開始和結(jié)束語句(3)END命令 格式:END[標(biāo)號(hào)]
主模塊結(jié)束必須寫上標(biāo)號(hào), 標(biāo)號(hào)是程序中第一句指令性語句的標(biāo)號(hào)。
2023/1/30982.段定義語句
用來定義一個(gè)段
(1)SEGMENT/ENDS命令 格式:段名SEGMENT[參數(shù)] …….
段名ENDS
2023/1/3099段定義語句
段名由程序員定義,匯編時(shí)由系統(tǒng)為該段分配一個(gè)段基值,并將該值賦于段名。
SEGMENT語句中的參數(shù)為:[定位類型][組合類型][‘類別’]
用來設(shè)定該段在內(nèi)存中的位置和在匯編、連接時(shí),當(dāng)該段與其它段組合在一起時(shí)該段同其它段的連接關(guān)系。都是任選項(xiàng)。
2023/1/30100①定位類型(align—type)定位類型用來指定該段段基值的邊界條件,定位類型有以下四種:a.BYTE該段可從任何地址開始,即段基址=XXXX,XXXX,XXXX,XXXX,
XXXXB,其中X表示任意值,即1/0。b.WORD該段必須從字的邊界開始,即段基址=XXXX,XXXX,XXXX,XXXX,XXX0B。2023/1/30101定位類型
c.PARA該段必須從小節(jié)的邊界開始,即段基址=XXXX,XXXX,XXXX,XXXX,0000B。d.PAGE該段必須從頁的邊界開始,即段基值=XXXX,XXXX,XXXX,0000,0000B。注意:當(dāng)定位類型缺?。床粚懀r(shí),隱含值為PARA。2023/1/30102②組合類型(combine-type)
在匯編和連接時(shí),當(dāng)該段與其他段組合在一起時(shí),組合類型用來設(shè)定該段與其他段的連接關(guān)系,組合類型有以下六種。2023/1/30103組合類型a.PUBLIC該段連接時(shí)將與其他同名段依次連接起來,其連接次序由連接程序確定.b.COMMON該段連接時(shí)將與其他同名段有相同的段基值,即共享相同的存儲(chǔ)空間,亦即各段會(huì)產(chǎn)生覆蓋,但可節(jié)省內(nèi)存容量。c.ATexp—使段基值等于按表達(dá)式exp計(jì)算所得的16位數(shù),必須指出,對(duì)于代碼段不能用ATexp來設(shè)定段基值。2023/1/30104組合類型d.STACK—僅用于堆棧段,使同名段都連接成一個(gè)連續(xù)段,且系統(tǒng)自動(dòng)對(duì)SS和SP初始化。e.MEMORY指定該段在同名段的最后,即該段在同名段中位于最高的地址空間,若連接時(shí)有幾個(gè)組合類型為MEMORY的段,則只有最前面(最先遇到)的段按組合類型MEMORY處理,其他段句按組合類型PUBLIC處理。f.NONE—表示本段與其他段邏輯上不發(fā)生關(guān)系,各段都有自己的段基值。注意:當(dāng)組合類型缺?。床粚懀r(shí),隱含值為NONE。2023/1/30105段定義語句(2)ORG命令 偏移地址定位語句 指定某一語句在段內(nèi)的偏移地址
格式:ORGexp exp為能計(jì)算出16位立即數(shù)的表達(dá)式2023/1/30106段定義語句(3)ASSUME命令
ASSUME命令緊跟在代碼段的SEGMENT語句之后,用于指示下述程序中段寄存器同指定段名的對(duì)應(yīng)關(guān)系 格式:
ASSUMECS:段名1,DS:段名2, SS:段名3,ES:段名4
2023/1/30107段定義語句
注意:
ASSUME語句僅指出段寄存器同段名的對(duì)應(yīng)關(guān)系,并未對(duì)段寄存器賦值,在程序中未用到的段寄存器不必指示。2023/1/301083.過程定義語句
應(yīng)用PROC/ENDP命令定義過程(procedure),過程即子程序,是程序的一部分,程序中用CALL指令調(diào)用過程,過程結(jié)束用RET指令返回程序。
2023/1/30109
過程定義語句格式:過程名PROC類型
……
過程名ENDP
類型為FAR/[NEAR]
2023/1/301104.數(shù)據(jù)定義語句
用來為數(shù)據(jù)分配內(nèi)存單元。 格式:
[變量]命令參數(shù)1,參數(shù)2,……[;注釋]
變量是內(nèi)存中一組數(shù)的名字,由程序員在編程時(shí)用標(biāo)識(shí)符定義,
變量可以作為內(nèi)存操作數(shù)來使用。2023/1/30111數(shù)據(jù)定義語句
數(shù)據(jù)定義語句中的命令可以是:
DB定義字節(jié)數(shù)據(jù)(8位) DW定義字?jǐn)?shù)據(jù)(16位) DD定義雙字?jǐn)?shù)據(jù)(32位) DQ定義8字節(jié)數(shù)據(jù)(64位) DT定義10字節(jié)數(shù)據(jù)(80位)2023/1/30112數(shù)據(jù)定義語句
參數(shù)是相應(yīng)內(nèi)存單元中的數(shù)據(jù),可以是: 數(shù)字常量……用各種規(guī)定的數(shù)制表示; 字符常量……用單引號(hào)括起來的ASCII字符; 符號(hào)常量……用EQU語句定義。
2023/1/30113數(shù)據(jù)定義語句
?保留一個(gè)存儲(chǔ)單位,以備程序執(zhí)行過程中存入結(jié)果數(shù)據(jù);
????保留4個(gè)存儲(chǔ)單位;
ARYDB4DUP(43H)
表示定義一個(gè)變量ARY,在內(nèi)存中開辟一個(gè)數(shù)組,存放4個(gè)43H。2023/1/30114數(shù)據(jù)定義語句
DUP為復(fù)制符格式:復(fù)制次數(shù)DUP(數(shù)據(jù))
2023/1/30115數(shù)據(jù)定義語句(例)DATA1SEGMENTAT2000HORG3000HARY1DB12H,34H,56H,78HARY2DW1234H,5678HARY3DB‘A’,’B’,’C’,’D’,’ABCD’ARY4DW‘AB’ARY5DD‘AB’ARY6DWAYT2ARY7DDARY2
2023/1/30116數(shù)據(jù)定義語句(例)
在定義ARY6的語句中,參數(shù)為已定義的變量ARY2,其值為ARY2的偏移地址3004H;
在定義ARY7的語句中,參數(shù)為已定義的變量ARY2,其值為ARY2的偏移地址3004H和段基值2000H。
2023/1/301175.符號(hào)定義語句
(1)EQU命令等值命令 格式:名字/變量EQUexp(2)=命令等號(hào)命令 格式:名字=exp(3)PURGE命令 用來撤消已定義的符號(hào)常量 格式:PUREG名字 可同時(shí)撤消幾個(gè)己定義的名字
2023/1/301186.名字與變量
1)名字 名字包括文件名、標(biāo)題名、段名、過程名和符號(hào)常量名等,是程序員在編程中按標(biāo)識(shí)符規(guī)定命名的,目的是方便編程和讀程。
2023/1/30119名字(1)段名 在段定義語句中命名取定,定義后的段名可以作為段基值來使用,用來對(duì)段寄存器賦值,例如:
MOVAX,DATA1MOVDS,AX
2023/1/30120名字
(2)過程名 在過程定義語句中定義,指向過程中第一條指令所在的內(nèi)存單元的地址,即過程的入口地址,有NEAR和FAR之分。
(3)符號(hào)常量 由符號(hào)定義語句EQU、=來定義,對(duì)符號(hào)常量給以賦值。
2023/1/301212.變量
(1)變量的定義和屬性 變量由數(shù)據(jù)定義語句
DB/DW/DD/DQ/DT來定義。 變量有三屬性:
2023/1/30122變量變量有三屬性:段屬性……說明該變量在哪個(gè)存儲(chǔ)段中; 偏移地址屬性……說明該變量的段內(nèi)偏移量; 類型屬性……說明該變量所在內(nèi)存數(shù)據(jù)的類型(字節(jié)、字、雙字、8字節(jié)還是10字節(jié))。
2023/1/30123變量(2)分析運(yùn)算符(Analyticoperator)
用于把變量的三個(gè)屬性分別取出來作為操作數(shù)。有SEG、OFFSET.、TYPE、LENGTH和SIZE。
SEG變量名
取出變量的段基值
OFFSET變量名
取出變量的偏移地址
TYPE變量名
取出變量的類型值,字節(jié)數(shù)據(jù)為1、字?jǐn)?shù)據(jù)為2、雙字?jǐn)?shù)據(jù)為4、
8字節(jié)數(shù)據(jù)為8、10字節(jié)數(shù)據(jù)為10。
2023/1/30124變量
LENGTH變量名:表示變量所在數(shù)組的元素個(gè)數(shù)。 注意:只有當(dāng)數(shù)據(jù)用DUP定義時(shí),才適用,否則恒為1。
SIZE變量名:表示變量所在數(shù)組的字節(jié)數(shù)。 注意:同LENGTH, SIZE變量=LENGTH變量*TYPE變量
2023/1/30125變量(3)合成運(yùn)算符(a)PTR運(yùn)算符 類型PTRexp
其中類型是
BYTE、WORD、DWORD(變量) FAR、NEAR(標(biāo)號(hào)) exp為表達(dá)式,是存儲(chǔ)器操作數(shù),2023/1/30126
PTR運(yùn)算符用于臨時(shí)改變變量或標(biāo)號(hào)的類型屬性例如:BUFWDW1234H,5678H MOVAX,BUFW MOVAL,BYTEPTRBUFW也可用來指定內(nèi)存操作數(shù)的類型例如:INCBYTEPTR[BX] INCWORDPTR[BX]
2023/1/30127PTR運(yùn)算符也可用EQU和PTR定義一個(gè)新的變量 例如:BUFWDW1234H,5678H BUFBEQUBYTEPTRBUFW
則MOVAX,BUFW和
MOVAL,BUFB
都是合法的。2023/1/30128
(b)THIS類型 類似于PTR運(yùn)算符,THIS與EQU一起用來定義一個(gè)新變量名。 例如:BUFBEQUTHISBYTE BUFWDW1234H,5678H EQU語句必須緊跟在DW語句(已定義的變量名之前)
THIS運(yùn)算符2023/1/30129
LABEL命令
(c)LABEL命令 格式:變量/標(biāo)號(hào)LABEL類型 用來定義語句中的變量(或標(biāo)號(hào))
例如: BUFBLABELBYTE BUFWDW1234H,5678H LABEL語句必須緊跟在DW語句(已定義的變量名之前) 。2023/1/301303.2.4指令性語句
格式:[標(biāo)號(hào):]操作碼[操作數(shù)][,操作數(shù)][;注釋]
一、標(biāo)號(hào)
標(biāo)號(hào)是一條指令在內(nèi)存中的符號(hào)地址.
標(biāo)號(hào)可以用作內(nèi)存操作數(shù)。
2023/1/301311.標(biāo)號(hào)
標(biāo)號(hào)有三屬性
(l)段屬性:表示標(biāo)號(hào)所在段的段基值;
(2)偏移量屬性:表示標(biāo)號(hào)所在位置的偏移地址;
(3)類型屬性:表示標(biāo)號(hào)所在指令是允許段內(nèi)跳轉(zhuǎn)還是段間跳轉(zhuǎn)。
2023/1/30132標(biāo)號(hào)用PTR重新指定標(biāo)號(hào)類型 設(shè)已定義標(biāo)號(hào)METER
則段內(nèi)轉(zhuǎn)移用JMPMETER; 段間轉(zhuǎn)移用JMPFARPTRMETER2023/1/30133標(biāo)號(hào)用EQU和PTR定義新標(biāo)號(hào):
METER:……. KILOMTEQUFARPTRMETER用EQU和THIS定義新標(biāo)號(hào):
KILOMTEQUTHISFAR METER:…….
2023/1/30134標(biāo)號(hào)用LABEL定義新標(biāo)號(hào):
KILOMTLABELFAR METER:…….2023/1/301352.操作數(shù)
操作數(shù)可以用段名、符號(hào)常量、變量、屬性表達(dá)式、過程名和標(biāo)號(hào)等。例如:
MOVAX,DATA ;DATA是段名
MOVCX,COUNT ;COUNT是符號(hào)常量
MOVBL,BUFFER ;BUFFER是變量
MOVSI,OFFSETARRAY;OFFSETARRAY是屬 ;性表達(dá)式
CALLSBRT1 ;SBRT1是過程名
JMPDONE ;DONE是標(biāo)號(hào)2023/1/301363.3匯編語言程序設(shè)計(jì)基礎(chǔ)
3.3.1概述
3.3.2順序程序
3.3.3分支程序
3.3.4循環(huán)程序
3.3.5子程序
3.3.6匯編語言程序舉例
3.3.7系統(tǒng)功能調(diào)用2023/1/301373.3.1概述程序(PROGRAM)
是完成特定功能的一組指令的有序集合程序設(shè)計(jì)的步驟是: 分析課題 確定算法 畫流程圖 編寫程序 上機(jī)調(diào)試、修改
2023/1/301383.3.2順序程序
*指令順序執(zhí)行,無分支、無轉(zhuǎn)移、無循環(huán)。
*硬件支持是IP自動(dòng)加1,
從內(nèi)存取出一個(gè)指令字節(jié),IP自動(dòng)加1。
2023/1/30139例3-17查表求平方值
DATA SEGMENT TABLESQ DB0,1,4,9,16,25,36,49, DB64,81,100,121,144,169,196,225 XX DBX;X為0~15的正整數(shù)
YY DB? DATA ENDS STACK SEGMENTPARASTACK’STACK’ DB50DUP(?) STACK ENDS
2023/1/30140查表求平方值(續(xù))CODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN: MOVAX,DATA MOVDS,AX MOVBX,OFFSETTABLESQ MOVAH,0 MOVAL,XX ADDBX,AX MOVAL,[BX] MOVYY,AL MOVAH,4CH INT21H
2023/1/30141查表求平方值(續(xù))注意
幾個(gè)問題
1.程序結(jié)束方法
1)設(shè)計(jì)為一個(gè)“過程”(PROCEDURE) 2)以MOVAH,4CH INT21H
即4CH號(hào)功能調(diào)用結(jié)束。2.MOVAH,0;AH置0的必要性。3.MOV,ADD指令中d和s必需是相同類型。2023/1/30142例3.18非壓縮的BCD碼轉(zhuǎn)換為壓縮的BCD碼
MOVAX,DAT1;AX=0109MOVCL,4;CL=4SALAH,CL;AH=10HROLAX,CL;AX=0091ROLAL,CL;AL=19HMOVBYTEPTRDATA,AL DAT1DW0109H
2023/1/301433.3.3分支程序
1.分支程序二要素
具有判斷和轉(zhuǎn)移功能的程序。
(1)判斷
:運(yùn)算結(jié)果的狀態(tài)標(biāo)志CF,PF,ZF,SF,OF;
(2)轉(zhuǎn)移:主要是條件轉(zhuǎn)移指令Jcc,cc為條件。 單標(biāo)志位判斷……JC,JZ,JO,JP,JS,JAE等;
多標(biāo)志位判斷……JA,JG,JGE等。
2023/1/30144分支程序
2.采用比較指令和轉(zhuǎn)移指令實(shí)現(xiàn)分支
CMPd,s;d-s Jcc標(biāo)號(hào)2023/1/30145例3-19 符號(hào)函數(shù)處理有一符號(hào)函數(shù)Y=f(X)1;X>0Y=0;X=0
-1;X<02023/1/30146
符號(hào)函數(shù)處理
MOVAL,XX CMPAL,0 JGEBIGR MOVAL,0FFH MOVYY,AL ;X<0時(shí),-1送入YY單元
HLTBIGR:JEEQUL
2023/1/30147符號(hào)函數(shù)處理
MOVAL,1 MOVYY,AL ;X>0時(shí),1送入YY單元
HLTEQUL:MOVYY,AL ;X<0時(shí),0送入YY單元
HLT注意:JGE是用于帶符號(hào)數(shù)的指令
MOVAL,0FFH;AL→-
1
2023/1/30148例3-20數(shù)據(jù)塊傳送程序
DATA SEGMENT STRG DB1000DUP(?) STG1 EQUSTRG+7 STG2 EQUSTRG+25 STRSE EQU50 DATA ENDS STACK SEGMENTPARASTACK‘STACK’ STARN DB100DUP(?) STACK ENDS
20
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 九年級(jí)歷史下冊(cè)單元評(píng)價(jià)檢測(cè)課件
- 《證劵基礎(chǔ)知識(shí)最終》課件
- 《激光切割工藝》課件
- 荒山綠化項(xiàng)目可行性研究報(bào)告
- 《人力資源管理奧秘》課件
- 股份解禁協(xié)議三篇
- 專業(yè)畢業(yè)實(shí)習(xí)報(bào)告4篇
- 2023年-2024年企業(yè)主要負(fù)責(zé)人安全教育培訓(xùn)試題及答案(易錯(cuò)題)
- 2024員工三級(jí)安全培訓(xùn)考試題帶解析答案可打印
- 2023年-2024年項(xiàng)目部安全管理人員安全培訓(xùn)考試題附答案【培優(yōu)A卷】
- (完整word版)Word信紙(A4橫條直接打印版)模板
- 鋼結(jié)構(gòu)件運(yùn)輸專項(xiàng)方案
- 物業(yè)公司車輛進(jìn)出登記表
- DCS基礎(chǔ)培訓(xùn)課程(和利時(shí))課件
- 員工消防安全教育培訓(xùn)
- HART-375手操器說明書
- 文學(xué)批評(píng)與實(shí)踐-四川大學(xué)中國(guó)大學(xué)mooc課后章節(jié)答案期末考試題庫(kù)2023年
- (52)-12.1服裝的審美形態(tài)11.4
- 力行“五育”并舉融合“文化”育人
- 上海中心大廈介紹
- 管道試壓記錄表
評(píng)論
0/150
提交評(píng)論