微機原理與接口技術(shù)第三章匯編課件_第1頁
微機原理與接口技術(shù)第三章匯編課件_第2頁
微機原理與接口技術(shù)第三章匯編課件_第3頁
微機原理與接口技術(shù)第三章匯編課件_第4頁
微機原理與接口技術(shù)第三章匯編課件_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、微機原理與接口技術(shù)教案第 3 章 匯編語言程序設(shè)計微機原理與接口技術(shù)第 3 章 匯編語言程序設(shè)計第 3 章 匯編語言程序設(shè)計3.1 8086/8088指令系統(tǒng)3.2 匯編語言程序3.3 匯編語言程序設(shè)計第 3 章 匯編語言程序設(shè)計3.1 8086/8088指令系3.1.1 8086/8088指令格式 8086/8088執(zhí)行指令的語句格式: 標號: 操作符 操作數(shù) ;注釋操作符是操作碼的助記符號表示,是指令的關(guān)鍵字,必不可少 。標號是自定義的、非系統(tǒng)關(guān)鍵字的符號串。操作數(shù)是參與指令具體操作的操作對象,根據(jù)操作數(shù)的個數(shù),有0(零)操作數(shù)指令、單操作數(shù)指令和雙操作數(shù)(用逗號分割)指令。3.1.1 8

2、086/8088指令格式 8086/8083.1.2 操作數(shù)尋址方式 8086/8088操作數(shù)作為參與指令具體的操作對象,可以是操作數(shù)據(jù),也可以是轉(zhuǎn)移地址。 尋址方式是指操作對象存放的地方,可以是直接給出(立即數(shù)),也可以存放在寄存器,或內(nèi)存儲器,或輸入/輸出接口中。 8086/8088尋址方式分為操作數(shù)據(jù)尋址方式和轉(zhuǎn)移地址尋址方式兩大類。 操作數(shù)據(jù)尋址方式(7種):立即尋址、寄存器尋址、直接內(nèi)存或I/O尋址、間接內(nèi)存或I/O尋址方式等。轉(zhuǎn)移地址尋址方式(4種) :段內(nèi)直接尋址、段內(nèi)間接尋址、段間直接尋址、 段間間接尋址方式。3.1.2 操作數(shù)尋址方式 8086/8088操作數(shù)作為參立即方式:

3、操作數(shù)據(jù)在指令中直接給出(立即數(shù))。寄存器方式:操作數(shù)存放在指令給出的字節(jié)/字寄存器中。例如:MOV AX, 0FC25H ;AX0FC25HMOV AL, 42H;AL42HMOV AH,11010011B ;AH 11010011B(0D3H)MOV CX,-25;AX -25MOV AL,1000 ;錯誤,超字節(jié)范圍 MOV DS, 2000H ;錯誤,立即數(shù)不能直接給段RMOV AX, IP;錯誤,不得使用IPMOV AX, CS;正確,CS可讀MOV CS, AX;錯誤,CS不可寫立即尋址和寄存器尋址立即方式:操作數(shù)據(jù)在指令中直接給出(立即數(shù))。立即尋址和寄存存儲器尋址方式內(nèi)存邏輯地

4、址的段基址值存放在段址寄存器: CS/SS/DS/ES內(nèi)存邏輯地址的偏移地址(EA)尋址方式: 直接方式:指令中直接給出EA 間接方式:EA =(寄存器) EA =(寄存器)+位移量 EA =(寄存器1)+ (寄存器2) EA =(寄存器1)+ (寄存器2)+ 位移量內(nèi)存尋址使用的偏移址寄存器:BX, BP, SI, DI段址R和偏移址R配對使用的隱含規(guī)定:代碼(指令)指針CS:IP堆棧操作指針SS:SP, 或 SS:BP源數(shù)據(jù)串指針DS:SI目的數(shù)據(jù)串指針ES:DI存儲器尋址方式內(nèi)存邏輯地址的段基址值存放在段址寄存器: C存儲器數(shù)據(jù)尋址方式例MOV AX, 1000H ;(DS : 1000

5、H)的字數(shù)AXMOV 2000H, BX;BX (DS : 2000H)MOV AX, BX ;(DS : BX)的字數(shù)AXMOV AX, SS:SI ;(SS : SI)的字數(shù)AXMOV AX, BX-100 ;(DS :(BX-100)的字數(shù)AXMOV BX+ SI ,AX ; BX+SI 是內(nèi)存間接尋址MOV AX, BX+DI+8 ; BX+DI+8 是內(nèi)存間接尋址MOV AX, CX ;錯誤,CX寄存器不能用于內(nèi)存尋址MOV BX,SI ;錯誤,2個操作數(shù)不能都是內(nèi)存尋址MOV AX,SI+DI ;錯誤,SI和DI 不能配對做內(nèi)存間接尋址存儲器數(shù)據(jù)尋址方式例MOV AX, 1000H

6、 3.1.3 8086/8088指令系統(tǒng) 8086/8088 指令系統(tǒng)有133條指令,分為六大類:1. 傳送指令類: 主要有MOV 傳送 ,PUSH 壓入,POP 彈出,XCHG 交換,LEA 取偏移 等。2. 算術(shù)運算指令類: 加、減、乘、除(整數(shù))算術(shù)運算和BCD碼調(diào)整五組指令。3. 邏輯運算和移位指令類: 邏輯運算指令組,移位指令組。4. 控制轉(zhuǎn)移指令類: 有/無條件轉(zhuǎn)移指令組(將在分支程序設(shè)計中介紹),LOOP指令組(將在循環(huán)程序設(shè)計中介紹),CALL/RET指令組(將在子程序設(shè)計中介紹)。5. 串操作指令類(略)6. 處理機控制指令類 3.1.3 8086/8088指令系統(tǒng) 8086

7、/8081. 數(shù)據(jù)傳送指令類 數(shù)據(jù)傳送類指令一共有14條(表3.1)。這里主要介紹:MOV 傳送 PUSH 壓入堆棧POP 彈出堆棧 XCHG 交換LEA 取偏移 IN 輸入端口“讀”O(jiān)UT 輸出端口“寫”數(shù)據(jù)傳送類指令均不影響標志位。數(shù)據(jù)類型字節(jié)(byte)/字(word)。絕大多數(shù)是雙操作數(shù),兩個操作數(shù)(字節(jié)/字)類型必須一致。尋址方式基本與MOV 指令的要求相同。1. 數(shù)據(jù)傳送指令類 數(shù)據(jù)傳送類指令一共有14條(表3.1數(shù)據(jù)傳送指令傳送指令 MOV格式:MOV dst,src操作:dst(src)雙操作數(shù)尋址方式:dst (目的操作數(shù))src (源操作數(shù))reg(寄存器) reg| me

8、m| data(立即數(shù))| segregmem(內(nèi)存) reg| data| segregsegreg(段寄存器) reg| mem兩個操作數(shù)類型(字節(jié)/字)要一致。目的操作數(shù)不能是立即數(shù),兩個操作數(shù)不能都是內(nèi)存尋址方式。數(shù)據(jù)傳送指令傳送指令 MOV堆棧操作指令PUSH 和POP 是一對堆棧操作指令:堆棧是一個“先進后出”的內(nèi)存數(shù)據(jù)存取區(qū)域。堆棧邏輯地址SS: SP 。數(shù)據(jù)進入堆棧的操作為壓入(PUSH),從堆棧取出數(shù)據(jù)的操作為彈出(POP)。堆棧操作是單操作數(shù)指令, 只能是字類型數(shù)據(jù)。壓入指令PUSH 格式:PUSH src操作: (SP)-2SP (src)(SP)操作數(shù)尋址:src =

9、|mem |reg |segreg SS:0000 SS: SP 棧頂 棧底堆棧操作指令PUSH 和POP 是一對堆棧操作指令: 彈出指令POP格式:POP dst操作: (SP)dst (SP)+2SP操作數(shù)尋址:dst = mem|reg|segreg例如 :PUSHAX;AX(SS : SP)PUSHBX;(DS : BX)(SS : SP)POPCX;(SS : SP)CXPUSHCL ;錯誤,堆棧操作必須是字類型數(shù)據(jù)POP200;錯誤,立即數(shù)不能是堆棧操作數(shù)據(jù)堆棧操作指令彈出指令POP堆棧操作指令交換指令XCHG格式: XCHG opr1,opr2操作: (opr1)(opr2)操作

10、數(shù)尋址: opr1=regopr2= reg |mem注意:不可以直接把兩個內(nèi)存數(shù)據(jù)交換。例如: MOV AX, 2000H;(DS : 2000H)AXXCHG AX, BX;AX和(DS : BX)交換MOV 2000H, AX;AX(DS : 2000H)數(shù)據(jù)交換指令交換指令XCHG數(shù)據(jù)交換指令查表換碼指令XLAT格式: XLAT; 無操作數(shù)操作: ALDS:(BX+AL); 隱含操作數(shù)尋址注意: BX為表頭的EA, AL是距離表頭的位移量 。表最大容量為256個字節(jié)。例如:MEMDB ABCDEFGHIJKLMNOPQRSTUVWXYZMOV BX, OFFSET MEM MOV AL

11、, 2XLAT; AL= 43H(C的ASCII碼值)查表換碼指令查表換碼指令XLAT查表換碼指令裝偏移指令LEA格式: LEA dst,src操作: src的偏移址dst操作數(shù)尋址: dst= reg src = mem 例如:MEM DB ABCDEFGHIJKLMNOPQRSTUVWXYZLEA BX, MEM ;BX取MEM數(shù)據(jù)表頭的EA(等同于:MOV BX,OFFSET MEM )MOV AL, BX+2 ;AL= 43H(C的ASCII碼值)裝偏移地址指令裝偏移指令LEA裝偏移地址指令輸入/輸出(I/O)指令I(lǐng)/O接口指令的語句格式: IN AL ,端口地址 OUT 端口地址,

12、AL I/O接口指令的端口地址16位,地址范圍為0000H FFFFH。若端口地址為 00H FFH(0255),可以直接給出;超出該范圍的端口地址必須存放在DX寄存器,間接給出。例如:IN AL , 80H ;與 MOV AL,80H 的區(qū)別OUT 20H , AL;與 MOV 20H,AL 的區(qū)別MOV DX, 100H;DX=100HOUT DX, AL;與 MOV DX,AX 的區(qū)別IN AL, 80H;錯誤,端口尋址不能用方括號輸入/輸出(I/O)指令I(lǐng)/O接口指令的語句格式:算術(shù)運算類指令一共有20條,分成加、減、乘、(整)除指令和BCD碼調(diào)整指令五組。這里主要介紹加、減、乘、除1

13、4條指令(表3.2):ADD 加法ADC 進位加INC 加1 SUB 減法SBB借位減DEC 減1 CMP 比較NEG 求補MUL 無符號乘法 IMUL有符號乘法DIV 無符號除法IDIV 有符號除法CBW 字節(jié)符號擴展CWD字符號擴展算術(shù)運算類指令基本都均影響標志位(ZF、SF、CF、OF)。絕大多數(shù)是雙操作數(shù),操作數(shù)可為字節(jié)/字類型。尋址方式與MOV 指令基本相同。2. 算術(shù)運算指令類算術(shù)運算類指令一共有20條,分成加、減、乘、(整)除指令和加法指令A(yù)DD格式: ADD dst,src ;(dst)+(src) dst進位加指令A(yù)DC格式: ADC dst,src; (dst)+(src)

14、+ CF dst加1指令I(lǐng)NC格式: INC dst;(dst)+ 1 dst操作數(shù)尋址方式: dstsrc regreg|mem|data memreg|data加法運算指令加法指令A(yù)DD加法運算指令減法指令SUB格式: SUB dst,src;(dst)-(src) dst 借位減指令SBB格式: SBB dst,src;(dst)-(src)- CF dst減1指令DEC格式: DEC dst;(dst)- 1dst操作數(shù)尋址方式: dstsrc regreg|mem|data memreg|data減法運算指令減法指令SUB減法運算指令比較指令CMP格式: CMP dst,src操作:

15、(dst)-(src), 僅根據(jù)計算結(jié)果設(shè)置相關(guān)標志位。求補指令 NEG格式: NEGdst操作: 0 -(dst) dst; 求互補碼例如,計算12345678H + 80A7FD28H MOV DX, 1234H MOV AX, 5678H;DX|AX= 12345678H ADD AX, 0FD28H ADC DX, 80A7H ;DX|AX= 92DC53A0H減法運算指令比較指令CMP減法運算指令無符號乘法指令MUL有符號乘法指令I(lǐng)MUL格式: MUL srcIMUL src操作數(shù)尋址:src = reg|mem操作:有/無符號數(shù)的乘法字節(jié)乘法:(AL)(src)AX字乘法: (AX

16、)(src)DX|AX(32位)標志位:ZF, SF無定義。乘積的高階部分如果非0,OF,CF均被置1。例如:無符號數(shù)字節(jié)乘法 0FFH1= 00FFH 有符號數(shù)字節(jié)乘法 0FFH1= 0FFFFH乘法運算指令無符號乘法指令MUL有符號乘法指令I(lǐng)MUL乘法運算指令無符號除法指令DIV有符號除法指令I(lǐng)DIV格式: DIVsrcIDIVsrc操作數(shù)尋址:src = reg|mem操作:有/無符號數(shù)的除法字節(jié)除法:(AX)/(src)AL(商),AH(余數(shù))字除法: (DX|AX)/(src)AX(商),DX(余數(shù))注意:1.除法可能有0作除數(shù)錯誤;商超出字節(jié)/字范圍的溢出錯誤。2.有符號數(shù)除法的余

17、數(shù)與被除數(shù)的符號相同。除法運算指令無符號除法指令DIV有符號除法指令I(lǐng)DIV除法運算指令符號擴展指令CBW和CWD 格式:CBW; 把有符號數(shù)AL擴展為AXCWD; 把有符號數(shù)AX擴展為DX | AX操作數(shù): 隱含尋址(AL/ AX/ DX )標志位:不改變。例如:MOVAL,07FHCBW;AX=007FHMOVAX,8003HCWD;AX= 8003H, DX= 0FFFFH符號擴展指令符號擴展指令CBW和CWD 符號擴展指令例如:MULAH;無符號數(shù) (AL)(AH)AX IMULAL;有符號數(shù) (AL)(AL)AXMULBX;無符號數(shù) (AX)(BX)DX|AX MUL word pt

18、r BX ; (AX)(BX)DX|AX例如:計算30200除以1500。MOVAX,30200; AX =30200 CWD ; AX擴展為 DX| AXMOVBX,1500DIVBX;AX=20(商),DX=200(余數(shù))例如,如果 AX=0010H(+16),BL=0FDH(-3) IDIV BL;AX=01FBH,商=-5,余數(shù)=1乘/除法指令應(yīng)用例例如:乘/除法指令應(yīng)用例3. 邏輯運算和移位指令邏輯運算和移位類指令是以2#數(shù)位為單位的“位操作”指令,邏輯運算指令5條,移位指令8條(表3.3)。NOT 邏輯非AND 邏輯與OR 邏輯或XOR 邏輯異或TEST 位測試SHL 邏輯左移RO

19、L 循環(huán)左移 SHR 邏輯右移ROR 循環(huán)右移SAL 算術(shù)左移RCL 帶進位循環(huán)左移SAR 算術(shù)右移RCR 帶進位循環(huán)右移操作數(shù)可為字節(jié)/字類型,按位進行邏輯運算。多數(shù)情況不改變標志位。3. 邏輯運算和移位指令邏輯運算和移位類指令是以2#數(shù)位為邏輯運算指令邏輯非指令NOT格式:NOTdst ; 求(dst)的互反碼邏輯與指令 AND邏輯或指令 OR邏輯異或指令XOR格式:ANDdst,src 操作:(dst)(src)dst ORdst,src (dst)(src)dstXORdst,src (dst)(src)dst測試指令TEST格式: TEST dst,src操作:(dst)(src);

20、 不保存結(jié)果,僅設(shè)置標志位邏輯運算指令邏輯非指令NOT移位指令邏輯左移 SHL邏輯右移 SHR算術(shù)左移 SAL算術(shù)右移 SAR循環(huán)左移 ROL循環(huán)右移 ROR帶進位循環(huán)左移 RCL帶進位循環(huán)右移 RCR格式: dst,cnt操作數(shù)尋址:dst是移位的對象,dst=reg|memcnt是移位的位數(shù),cnt=1|CL標志位:ZF 和SF,指明移位結(jié)果的設(shè)置。 CF :左移取自dst最高位,右移取自dst 的D0位。移位指令邏輯左移 SHL邏輯右移 S邏輯運算和移位指令應(yīng)用例AND AL, 50H;AL=(AL)50HOR AX, 8080H;AX=(AX)(DS : 8080H)XOR AX, A

21、X;AX= 0,CF= 0AND AL, 0FH;AL高4位清0,低4位保留OR AL, 0FH;AL高4位保留,低4位置1XOR AL, 0FH;AL高4位保留,低4位取反; AX乘以10SAL AX,1MOVBX,AXSALAX,1SALAX,1ADDAX,BX;雙字算術(shù)右移SARDX,1RCRAX,1 DX CF AX CFSAR DX,1 RCR AX,1邏輯運算和移位指令應(yīng)用例AND AL, 50H;A6. 處理器控制指令標志位設(shè)置指令:CLCCF=0STCCF=1CMCCF取反CLDDF=0 STDDF=1CLIIF=0 STI IF=1CPU控制指令:NOP無操作(空操作)HLT

22、停機(暫停,等待外部中斷,中斷后恢復(fù)運行)WAIT等待(等待測試信號TEST, 恢復(fù)運行)6. 處理器控制指令標志位設(shè)置指令:匯編語言程序的語句 匯編語言源程序由三類指令語句組成:(符號)執(zhí)行指令語句提供給匯編程序“翻譯”成機器能直接執(zhí)行的指令。匯編指示性語句(偽指令)提供給匯編程序指示匯編操作的指令。宏指令語句提供給匯編程序的擴展的“功能宏大”的指令。匯編語言程序的語句 匯編語言源程序由三類指令語句組成:3.2.1 8086/8088匯編語句 8086/8088匯編語句格式: 名字: 操作符 操作數(shù) ;注釋操作符是操作碼的助記符號表示,是執(zhí)行指令、偽指令和宏指令的操作功能符(關(guān)鍵字)。名字是

23、自定義的、非系統(tǒng)關(guān)鍵字的符號串。根據(jù)操作數(shù)的個數(shù),有0(零)操作數(shù)指令、單操作數(shù)指令和雙操作數(shù)(用逗號分割)指令。注釋項是開始于“;” ,提供閱讀的文字信息。注意:各項之間用空格鍵符,或TAB鍵符分界。操作碼項必有,其它項可選擇有/無。匯編語言程序不區(qū)別大小寫英文。3.2.1 8086/8088匯編語句 8086/80名字項名字項是自定義的一個符號串,可以是標號名(必須結(jié)束于“:” ) 、符號常數(shù)名、變量名、段名、過程名。名字項的合法字符:英文字母AZ/az ,數(shù)字09 ,特殊字符 _ ?等。注意:數(shù)字不能是第1個字符,句點只能做第1個字符。在執(zhí)行指令語句的操作數(shù)項中:符號常數(shù)作為立即數(shù)使用。

24、標號名、過程名作為轉(zhuǎn)移地址使用。 變量名作為存儲單元的偏移址,可以直接尋址使用。段名作為段基址(立即數(shù))使用。名字項名字項是自定義的一個符號串,可以是標號名(必須結(jié)束于3.2.2 匯編表達式操作數(shù)項是0個或1個或多個(用逗號分隔)的指令操作的對象,用規(guī)定的匯編表達式描述。匯編表達式是由(整數(shù))常數(shù)、寄存器、標號、變量等,和一些運算符,或操作符組成的表達式。匯編表達式能被匯編程序解釋,并計算出數(shù)值/地址結(jié)果,所以分為數(shù)值表達式和地址表達式兩種。數(shù)值表達式:由常數(shù)、數(shù)值運算符組成的表達式,計算結(jié)果為字節(jié)/字數(shù)據(jù)。地址表達式:包含地址(標號、變量和過程名都是地址)、常數(shù),以及地址運算/操作符的表達式

25、,計算結(jié)果為內(nèi)存地址值。3.2.2 匯編表達式操作數(shù)項是0個或1個或多個(用逗號常數(shù)和數(shù)值運算符數(shù)字常數(shù)(立即數(shù)) : 2/10/16進制數(shù)、ASCII字符 (用引號括起來)符號常數(shù)給常數(shù)起的名字數(shù)值運算符(運算對象和結(jié)果是整數(shù)常數(shù)): 算術(shù)運算符: +、*、/、MOD邏輯運算符:NOT、AND、OR、XOR 關(guān)系運算符: EQ、NE、GT、GE、LT、LE (真值為全1,假值為全0) 常數(shù)和數(shù)值運算符數(shù)字常數(shù)(立即數(shù)) : 地址運算/操作符地址的屬性: 段基址 偏移址 類型(BYTE、WORD、DWORD、NEAR,F(xiàn)AR)地址運算/操作符:地址運算符: + 、; 取偏移址的相對位移量分析操

26、作符: 取地址類型值 TYPE ; 類型值有1/2/4/-1/-2 取段基址值 SEG 取偏移址值 OFFSET 合成操作符:PTR;確定尋址的類型:;換段指示前綴SHORT;確定為“短”轉(zhuǎn)移地址地址運算/操作符地址的屬性: 段基址 偏移址 地址表達式應(yīng)用例類型指示符 PTR應(yīng)用格式: PTR 例如,INC WORD PTR BX;內(nèi)存數(shù)據(jù)為字類型INC BYTE PTR BX;內(nèi)存數(shù)據(jù)為字節(jié)類型CALL FAR PTR sub1;段間調(diào)用子程序 sub1CALL NEAR PTR sub2;段內(nèi)調(diào)用子程序 sub2換段指示符應(yīng)用格式: : 例如,MOV AX, SS:SI+2 SUB AX,

27、 ES:BXMOV ES:BX, AXMEM DB 10H, 20H, 30H, 40HMOVAX, SEG MEM;AX取MEM段址MOV DS, AXMOV BX, OFFSET MEM;BX取 MEM偏移址MOV AL, BX+2;AL=30HMOVAX, WORD PTR MEM;AX=2010H MOV AL, TYPE MEM;AL=1 地址表達式應(yīng)用例類型指示符 PTR應(yīng)用格式: 換段指示符3.2.3 匯編指示語句(偽指令)常用的匯編指示語句(偽指令)分成五組:符號定義、內(nèi)存數(shù)據(jù)定義、段定義、過程定義、模塊定義常用的偽指令語句:EQU 和 = (符號定義/賦值)DB / DW /

28、 DD (存儲單元類型和存儲數(shù)據(jù)定義)SEGMENT 和 ENDS (段定義)ORG (段內(nèi)偏移址指針$設(shè)置)PROC 和 ENDP (過程子程序定義)NAME 和 END (模塊定義和源程序結(jié)束) 3.2.3 匯編指示語句(偽指令)常用的匯編指示語句(偽指符號定義偽指令等值偽指令EQU格式: EQU 等號偽指令(=)格式:= 與EQU不同: = 只能是合法的匯編表達式; = 的符號名可以重復(fù)定義。例如:count EQU 19;count =19b=20b=b+10 ;b重新定義,b = 30d=(count+4)*2;d = 46fnum EQU 123456H;正確,“123456H”為

29、符號對象gnum=123456H;錯誤,123456H超過16位2# 的數(shù)值范圍符號定義偽指令等值偽指令EQU數(shù)據(jù)定義偽指令內(nèi)存數(shù)據(jù)定義偽指令DB、DW 和 DD 格式: DB / DW / DD 功能:定義內(nèi)存變量和類型,分配和初始化內(nèi)存單元數(shù)據(jù)。偽指令類型字節(jié)數(shù)數(shù)值范圍DBBYTE10255(即 28-1 )DWWORD2065535 ( 即 216-1 )DDDWORD40232-1數(shù)據(jù)定義偽指令內(nèi)存數(shù)據(jù)定義偽指令DB、DW 和 DD 偽指令內(nèi)存數(shù)據(jù)定義的數(shù)據(jù)表 為順序存放在內(nèi)存單元的數(shù)據(jù),多個數(shù)據(jù)之間用“ ,”分隔。 數(shù)值表達式:DBDWDD地址表達式:DWDD ASCII碼字符串:

30、DB ?(分配空單元,不放數(shù)據(jù)) DUP(數(shù)據(jù)重復(fù)定義, 可嵌套使用) DUP ()內(nèi)存數(shù)據(jù)定義的數(shù)據(jù)表 為順序存放在內(nèi)存單元的數(shù)據(jù)內(nèi)存數(shù)據(jù)定義例 DA1DBDATA SEGMENTDA2EQU $-DA1;DA2=12DA3DB6DH, 62, 15H, 28DA4DB10 dup (0, 5 dup (1, 2), 0)DA5DB12345DA6DW 7, 9, 298, 1967DA7=DA6 DA4;DA7=125DA8= $DA4;DA8=133內(nèi)存數(shù)據(jù)定義例 DA1DBDATA SEGMENT段定義偽指令段定義偽指令SEGMENT格式: SEGMENT 段結(jié)束偽指令ENDS格式:

31、ENDS SEGMENT語句與對應(yīng)的ENDS語句的段名必須一致。段基址說明偽指令 ASSUME 格式: ASSUME :, . 段寄存器可以是CS/DS/ES/SS,段名是已定義的。偏移址指針設(shè)置偽指令 ORG格式: ORG 數(shù)值是065535偏移址,偏移址指針用“ $ ”表示。段定義偽指令段定義偽指令SEGMENT程序模塊定義偽指令程序模塊開始偽指令NAME格式: NAME (源程序模塊開始NAME偽指令可以省略不用。)程序模塊結(jié)束偽指令END格式: END 程序模塊定義偽指令 程序的代碼段結(jié)構(gòu): SEGMENT ;段開始 ASSUME ENDS;此段結(jié)束 程序的數(shù)據(jù)段結(jié)構(gòu): SEGMENT

32、 ;段開始 ENDS;此段結(jié)束匯編程序的段結(jié)構(gòu) 程序的代碼段結(jié)構(gòu):匯編程序的段結(jié)構(gòu)匯編語言程序結(jié)構(gòu)例data SEGMENT xdb ? y dw ? zdd ?data ENDSstack SEGMENT dw 100 dup (?) topequ $stack ENDScode SEGMENTASSUME CS:code, DS:data, SS:stackSTART: MOV AX, data MOV DS, AX ;設(shè)置DS MOV AX, 4C00H ;返回DOSINT 21Hcode ENDS END START匯編語言程序結(jié)構(gòu)例data SEGMENTcode S匯編語言程序設(shè)計

33、結(jié)構(gòu)化匯編語言程序設(shè)計:結(jié)構(gòu)化程序設(shè)計是為了使編制的程序結(jié)構(gòu)清晰、易于理解、易于調(diào)試和修改,充分顯示出程序模塊化的優(yōu)點。匯編程序的基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)(分支結(jié)構(gòu))和循環(huán)結(jié)構(gòu)是匯編程序的三種基本結(jié)構(gòu)。它們是單入口、單出口的程序結(jié)構(gòu)。這三種結(jié)構(gòu)的任意組合和嵌套就構(gòu)成了結(jié)構(gòu)化程序設(shè)計。 子程序設(shè)計:子程序設(shè)計是程序設(shè)計的重要技術(shù)之一。匯編語言程序設(shè)計結(jié)構(gòu)化匯編語言程序設(shè)計:結(jié)構(gòu)化程序設(shè)計是為3.3.1 順序結(jié)構(gòu)程序設(shè)計 【例3.1】 計算S =(8000 -(X*Y+ Z)/X,其中X,Y,Z,S均是有符號數(shù)字變量。 ; 定義內(nèi)存字變量x, y, z, s:DATASEGMENT X DW6

34、00 Y DW25 Z DW-2000 S DW?, ? ;存放商和余數(shù)DATAENDS; 計算S表達式程序段:MOV AX, XIMUL Y;DX | AX =X*YMOV BX, AXMOV CX, DX;CX | BX= X*YMOV AX, ZCWD;Z擴展成雙字DX | AXADD BX, AXADC CX, DX;CX | BX= X*Y+ZMOV AX, 8000CWD;8000擴展成雙字DX | AXSUB AX, BXSBB DX, CX;DX | AX= 8000 -(X*Y+Z)IDIV X;(8000 -(X*Y+Z)/X MOV S, AX;商(AX)存放到S單元MO

35、V S+2, DX;余數(shù)(DX)存放到S+2單元3.3.1 順序結(jié)構(gòu)程序設(shè)計 【例3.1】 計算S =(83.3.2 分支結(jié)構(gòu)程序設(shè)計 用條件轉(zhuǎn)移(Jxxx)指令實現(xiàn)程序的雙分支(二分支)。雙分支結(jié)構(gòu)相當于:if then 分支程序結(jié)構(gòu) :先行有產(chǎn)生條件的語句;利用條件轉(zhuǎn)移指令,測試并判斷條件;根據(jù)條件成立與否,決定程序走向(轉(zhuǎn)/不轉(zhuǎn))。多分支結(jié)構(gòu)相當于: if then else 或 case do , ,多分支程序是把多分支結(jié)構(gòu),分解成多個雙分支結(jié)構(gòu)。3.3.2 分支結(jié)構(gòu)程序設(shè)計 用條件轉(zhuǎn)移(Jxxx)指令無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令JMP 操作:計算轉(zhuǎn)移目標的地址,轉(zhuǎn)移到目標處去執(zhí)行。段

36、內(nèi)直接轉(zhuǎn)移(直接給出段內(nèi)目標地址的標號)格式: JMP 例如:JMP sub1 ;直接轉(zhuǎn)移到sub1 JMP SHORT sub2;段內(nèi)直接短轉(zhuǎn)移到sub2 JMP NEAR PTR sub3;段內(nèi)直接近轉(zhuǎn)移到sub3段內(nèi)間接轉(zhuǎn)移(從寄存器/內(nèi)存單元取目標地址的偏移址)格式: JMP src操作數(shù)尋址: src = reg|mem;字類型例如:JMP BX ;IP 從BX 中取偏移址EA JMP WORD PTR BX;IP 從內(nèi)存2字節(jié)中取EA無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令JMP 條件轉(zhuǎn)移指令Jxxx格式: Jxxx 操作數(shù):為段內(nèi)短轉(zhuǎn)移,即標號偏移地址的位移量在 -128 +127 區(qū)間。操

37、作: IP = IP + (補碼)注意:條件轉(zhuǎn)移指令通常用在能設(shè)置了標志位的指令之后,根據(jù)狀態(tài)標志條件的成立與否判斷是否轉(zhuǎn)移。條件轉(zhuǎn)移指令條件成立?yesno轉(zhuǎn)目標語句下一條語句條件轉(zhuǎn)移指令Jxxx條件轉(zhuǎn)移指令條件成立?yesno轉(zhuǎn)目標語(單標志)條件轉(zhuǎn)移指令表指令助記符測試標志條件說 明JZ( JE)ZF=1為零轉(zhuǎn)(等于轉(zhuǎn))JNZ( JNE)ZF=0非零轉(zhuǎn)(不等轉(zhuǎn))JCCF=1有進/借位轉(zhuǎn)JNCCF=0無進/借位轉(zhuǎn)JSSF=1符號位為1轉(zhuǎn)JNSSF=0符號位為0轉(zhuǎn)JOOF=1有溢出錯轉(zhuǎn)JNOOF=0無溢出錯轉(zhuǎn)JPPF=1“1”偶數(shù)個轉(zhuǎn)JNPPF=0“1”奇數(shù)個轉(zhuǎn)JCXZ(CX)= 0CX為零

38、轉(zhuǎn)(單標志)條件轉(zhuǎn)移指令表指令助記符測試標志條件說 明JZ(復(fù)合標志)條件轉(zhuǎn)移指令表指令助記符測試標志條件A和B比較情況JG(SFOF)ZF=0AB有符號數(shù)JGESF OF=0A=BJLSFOF=1ABJLE(SFOF)ZF=1AB無符號數(shù)JAECF=0A=BJBCF=1ABJBECFZF=1A=Y,轉(zhuǎn)YGMOV AL, Y;XY,AL=YYG:MOVZ, AL;較大者存放到Z單元二分支程序設(shè)計例【例3.3】把有符號字節(jié)數(shù)X和Y 的較大者送多分支程序設(shè)計例【例3.4】 求X字節(jié)變量數(shù)據(jù)的符號函數(shù)(3分支)。 ;求字節(jié)變量符號函數(shù)程序段: MOVAL, XCMPAL, 0; X與0比較JZZER

39、O;為0,轉(zhuǎn)ZEROJSNEGA;為負,轉(zhuǎn)NEGAMOVAL, 1;為正,AL= 1 JMPOK;轉(zhuǎn)公共出口OKZERO: MOVAL, 0;AL= 0JMPOK;轉(zhuǎn)公共出口OKNEGA: MOVAL, 0FFH;AL= -1OK: MOVY, AL;符號函數(shù)值存放到Y(jié)單元多分支程序設(shè)計例【例3.4】 求X字節(jié)變量數(shù)據(jù)的符號函數(shù)(33.3.3 循環(huán)結(jié)構(gòu)程序設(shè)計 循環(huán)結(jié)構(gòu)程序是一段重復(fù)執(zhí)行的程序段(循環(huán)體) ,必須在有限次的重復(fù)執(zhí)行后結(jié)束。循環(huán)程序的基本結(jié)構(gòu): 循環(huán)初始化 循環(huán)體修改循環(huán)控制變量 no 判斷循環(huán)結(jié)束?yes3.3.3 循環(huán)結(jié)構(gòu)程序設(shè)計 循環(huán)結(jié)構(gòu)程序是一段重復(fù)執(zhí)行循環(huán)控制指令 循環(huán)

40、指令LOOP格式: LOOP 操作數(shù):為段內(nèi)短轉(zhuǎn)移,標號偏移址的位移量在 -128 +127 區(qū)間,即 IP = IP + 。操作: 1. (cx)1cx;2. 測試CX是否為0? 如果CX不為0,轉(zhuǎn)到標號處; 如果CX為0,執(zhí)行下一條指令。標志位:不改變。循環(huán)控制指令 循環(huán)指令LOOP循環(huán)程序設(shè)計例1【例3.6】 把存儲器中N個字節(jié)數(shù)據(jù)“搬家”。 ;“搬家”程序段:MOVAX, DATAMOVDS, AX;設(shè)置DS數(shù)據(jù)段基址LEASI, BLKSLEADI, BLKD MOVCX, N;CX=NLOP1: MOVAL, SI;取一個數(shù)MOVDI, AL;“搬”一個數(shù)INCSIINCDI;SI

41、和DI分別做+1修改LOOPLOP1;CX10 ,循環(huán) “搬”數(shù)循環(huán)程序設(shè)計例1【例3.6】 把存儲器中N個字節(jié)數(shù)據(jù)“搬家”循環(huán)程序設(shè)計例2【例3.8】 計算 SUM=a1b1+ a2b2 + a10b10 。;內(nèi)存數(shù)據(jù)定義adb 89, 5, 56, 80 ; 10個數(shù)據(jù)bdb 18, 29, 12, 38 ; 10個數(shù)據(jù)sumdw ?;計算SUM程序段movdx, 0movsi, 0 movcx,10lop1:moval, asimulbsiadddx, axincsilooplop1movsum, dx循環(huán)程序設(shè)計例2【例3.8】 計算 SUM=a1b1+ a2循環(huán)程序設(shè)計例3【例3.1

42、1】 ARR數(shù)據(jù)區(qū)有N個有符號字節(jié)數(shù)(ARR數(shù)組)。求ARR數(shù)組的最大值、最小值、數(shù)組元素之和,以及數(shù)據(jù)平均值。 arrdb 89,-90,56,88 nequ $-arr; n=數(shù)據(jù)個數(shù) maxdb -128; 預(yù)先放最小值-128 mindb 127; 預(yù)先放最大值127 sumdw 0; 預(yù)先放求和初值0 pingdb ?; 平均值;程序段leabx, arrmovcx, npp1:moval, bxcbwaddsum, axcmpmax, aljgep1movmax, alp1:cmpmin,aljlep2movmin,alp2:incbx looppp1movax, summovcl, nidivcl;al=平均值movping, al循環(huán)程序設(shè)計例3【例3.11】 ARR數(shù)據(jù)區(qū)有N個有符號字節(jié)3.3.4 子結(jié)序設(shè)計 子程序是具有一定功能的一組指令集合,可以被多次調(diào)用。 8086/8088子程序結(jié)構(gòu)定義的偽指令 :子程序定義偽指令 PROC子程序結(jié)束偽指令 ENDP子程序調(diào)用指令:CALL 子程序返回指令:RET3.3.4 子結(jié)序設(shè)計 子程序是具有一定功能的一組指令集子程序(過程)定義偽指令過程定義偽指令 PROC格式: PROC NEAR/FAR 子程序的類型分為NEAR 段內(nèi)過程,F(xiàn)AR 段間過程。過程結(jié)束偽指令ENDP格式: ENDP PROC

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論