《微型計(jì)算機(jī)系統(tǒng)原理與應(yīng)用》課件匯編程序3_第1頁(yè)
《微型計(jì)算機(jī)系統(tǒng)原理與應(yīng)用》課件匯編程序3_第2頁(yè)
《微型計(jì)算機(jī)系統(tǒng)原理與應(yīng)用》課件匯編程序3_第3頁(yè)
《微型計(jì)算機(jī)系統(tǒng)原理與應(yīng)用》課件匯編程序3_第4頁(yè)
《微型計(jì)算機(jī)系統(tǒng)原理與應(yīng)用》課件匯編程序3_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、4.9 字符串處理程序設(shè)計(jì) 4.9.1 確定字符串的長(zhǎng)度 4.9.2 加偶校驗(yàn)到ASCII碼 4.9.1 確定字符串的長(zhǎng)度【例4.9】從頭搜索字符串的結(jié)束標(biāo)志,統(tǒng)計(jì)搜索的字符個(gè)數(shù)。 流程圖:取串元素置串長(zhǎng)度的初值為0串長(zhǎng)度加1=CR?存串長(zhǎng)度返回置串指針YN程序代碼: DATA SEGMENTSTRING DB abcduvwxyz,0DHLL DB ?CR EQU 0DHDATA ENDSSTACK SEGMENT PARA STACK STACK DB 100 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:ST

2、ACKSTART PROC FARBEGIN: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX;DATAAX MOV ES, AX LEA DI, STRING ;SET ADDRESS POINTER MOVDL, 0 MOV AL,CR AGAIN: SCASB ; JE DONE INC DL; JMP AGAINDONE: LEA BX,LL;MOV BX,DL RETSTART ENDPCODE ENDSENDBEGIN改進(jìn):(1)為了避免特定字符的丟失,陷入死循環(huán),采用循環(huán)次數(shù)控制循環(huán),要求循環(huán)次數(shù)大于字符串長(zhǎng)度(2)在程序結(jié)束時(shí)

3、,檢查字符串長(zhǎng)度是否與給定的循環(huán)次數(shù)相等。若相等,則轉(zhuǎn)至出錯(cuò)處理改進(jìn)后的程序如下:DATA SEGMENTSTRING DB abcduvwxyz,0DHCOUNT EQU $-STRINGLL DB ?CR EQU 0DHDATA ENDSSTACK SEGMENT PARA STACK STACK DB 100DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARBEGIN: PUSH DS MOV AX, 0 PUSH AX MOVAX,DATA MOVDS,AX;DATAAX

4、MOV ES, AX LEA DI,STRING ;SET ADDRESS POINTER MOVDL, 0 MOV AL,0DH MOV CX,COUNT+10 AGAIN: SCASB ; JE DONE INC DL; DEC CX JNE AGAIN JMP ERRORDONE: LEA BX,LL; MOV BX,DL RETSTART ENDPCODEENDS;ENDBEGIN4.9.2 加偶校驗(yàn)到ASCII碼【例4.10】若有一個(gè)ASCII字符串,它們的起始地址放在單元STRING中,要求從串中取出每一個(gè)字符,檢查其中包含的“1”的個(gè)數(shù),若字節(jié)中“1”的個(gè)數(shù)為偶數(shù),則它的最高有效

5、位設(shè)置為“0”,否則最高有效位置為“1”后送回。DATA SEGMENT STRING DB 1234567890 COUNT EQU $-STRINGDATA ENDSSTACK SEGMENT PARA STACK STACK DB 100DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARBEGIN: PUSH DS MOV AX, 0 PUSH AX MOV AX,DATA MOVDS,AX;DATAAX MOV ES, AX LEA SI,STRING ;SET ADDRE

6、SS POINTER MOV CX,COUNT AGAIN: LODSB ; AND AL,AL JPE NEXT OR AL,80H MOV SI-1,ALNEXT: DEC CX JNZ AGAIN; RETSTART ENDPCODE ENDS;ENDBEGIN4.10 碼轉(zhuǎn)換程序設(shè)計(jì)輸入輸出設(shè)備以ASCII碼表示字符,以十進(jìn)制表示數(shù)。而機(jī)器內(nèi)部以二進(jìn)制表示,所以,在CPU和I/O設(shè)備之間必須進(jìn)行碼的轉(zhuǎn)換。實(shí)現(xiàn)碼轉(zhuǎn)換的方法有:軟件轉(zhuǎn)換、查表轉(zhuǎn)換、硬件轉(zhuǎn)換【例4.11】若有一個(gè)二進(jìn)制數(shù)碼串,要把每一個(gè)字節(jié)中的二進(jìn)制轉(zhuǎn)換為兩位十六進(jìn)制數(shù)的ASCII碼,高四位的ASCII碼放在地址高的單元,串

7、中的第一個(gè)字節(jié)為串的長(zhǎng)度(小于128)4.10.1 16進(jìn)制到ASCII碼DATA SEGMENTL1 DW 2STRING DB 34H,98HL2 DW ?BUFFER DB 2*2DUP(?)DATA ENDSSTACK SEGMENT PARA STACK STACK DB 100DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARBEGIN: PUSH DS MOV AX, 0 PUSH AX MOVAX,DATA MOVDS,AX;DATAAX MOV ES,AX MOV

8、 CX,L1 LEA BX,STRING LEA SI,BUFFER MOV AX,CX SAL CX,1;長(zhǎng)度加倍 MOV L2,CX MOV CX,AXAGAIN: MOV AL,BX ; MOV DL,AL AND AL,0FH CALL CHANGE ;低四位轉(zhuǎn)換 MOV AL,DL PUSH CX MOV CL,4 SHR AL,CL POP CX MOV SI ,AL CALL CHANGE ;高四位轉(zhuǎn)換 MOV AL,DL INC BX LOOP AGAIN RETSTART ENDPCHANGE PROC CMP AL,10 JL ADD_0 ADD AL,a-0-10 ADD

9、_0: ADD AL,0 MOV SI,AL INC SI RETCHANGE ENDP CODEENDS;ENDBEGIN【例4.12】把在內(nèi)存變量NUMBER中的16位二進(jìn)制數(shù)的每一位轉(zhuǎn)換為相應(yīng)的ASCII碼,并且存入串變量STRING中4.10.2 從二進(jìn)制到ASCII碼的轉(zhuǎn)換DATA SEGMENTBNUM DW 0F78FHSTRING DB 16 DUP(?)DATA ENDSSTACK SEGMENT PARA STACK STACK DB 100DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STAC

10、KSTART PROC FARBEGIN: PUSH DS MOV AX, 0 PUSH AX MOVAX,DATA MOVDS,AX MOV ES,AX LEA DI,STRING MOV CX,LENGTH STRINGPUSH DI PUSH CX MOV AL,30H REP STOSB POP CX POP DIMOVAL,31HMOV BX,BNUMAGAIN: RCL BX,1 JNC NEXT MOV DI,AL NEXT:INC DI LOOP AGAINRETSTART ENDPCODEENDS;ENDBEGIN4.11 有關(guān)I/O的DOS功能調(diào)用 為了把程序運(yùn)行結(jié)果顯示在

11、顯示器中。需要調(diào)用操作系統(tǒng)中的I/O子程序。在調(diào)用時(shí),把子程序的號(hào)(或稱系統(tǒng)功能號(hào))送至AH,把子程序的入口參數(shù),送至指定的寄存器,然后由中斷指令I(lǐng)NT 21H 來(lái)實(shí)現(xiàn)調(diào)用。【例4.13】利用DOS的功能調(diào)用2實(shí)現(xiàn)在CRT上的連續(xù)輸出字符09分析:為了使輸出字符之間有間隔,在每一循環(huán)中,輸出一個(gè)09字符和一個(gè)空格。為了保證是十進(jìn)制數(shù),增量后要用DAA指令調(diào)整。 為了保證始終是一位十進(jìn)制數(shù),用AND 0FH指令屏蔽掉高4位。4.11.1 在CRT上連續(xù)輸出字符09程序代碼:STACK SEGMENT PARA STACK STACK DB 100 DUP(?)STACK ENDSCODE SEG

12、MENT ASSUME CS: CODE,SS:STACKSTART PROC FARBEGIN: PUSH DS MOV AX,0 PUSH AX MOV BL,0 PUSH BXGOON: MOV DL,20H MOV AH,02H INT 21H POP BX MOV AL,BL INC AL DAA AND AL,0FH MOV BL,AL PUSH BX OR AL,30H MOV DL,AL MOV AH,2 請(qǐng)著重看PUSH BX 和POP BX的作用INT 21H MOV CX,0FFFFHAGAIN: DEC CX JNE AGAIN JMP GOONSTART ENDPCO

13、DE ENDSEND BEGIN【例4.14】利用DOS的功能調(diào)用9實(shí)現(xiàn)在CRT上的連續(xù)輸出字符0059分析:調(diào)用功能9時(shí),要求在調(diào)用前使DX指向字符串的首地址,字符串必須以字符“$”結(jié)束,則功能調(diào)用9能把字符“$”之前的全部字符向CRT輸出。程序代碼:STACK SEGMENT PARA STACK STACK DB 100 DUP(?)STACK ENDSDATA SEGMENT BUFFER DB 3 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS: CODE,DS:DATA,SS:STACKSTART PROC FARBEGIN: PUSH DS MOV A

14、X,0 PUSH AXMOV AX,DATA MOV DS,AX MOV CX,0FFFFH MOV BL,0 LEA SI,BUFFER PUSH BXGOON: MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H POP BX MOV AL,BL INC AL DAA CMP AL,61H JC NEXT MOV AL,0 MOV AH,4CH INT 21HNEXT: MOV BL,AL PUSH BX MOV DL,AL PUSH CX MOV CL,4 SHR AL,CL OR AL,30H MOV SI ,AL I

15、NC SI MOV AL,DL AND AL,0FH OR AL,30H MOV SI,AL INC SI MOV AL,$ MOV SI,AL MOV DX,OFFSET BUFFER MOV AH,09H INT 21HDELAY: MOV DX,3FFHTIME: MOV CX,0FFFFHTIME1: DEC CX NOP JNE TIME1 DEC DX JNE TIME POP DX DEC DX JE DONE MOV SI, OFFSET BUFFER JMP GOONDONE: RETSTART ENDPCODE ENDS END BEGIN4.12 宏匯編與條件匯編 4.1

16、6.1 宏指令的用途4.16.2 宏操作偽指令 4.16.3 宏定義嵌套4.16.4 宏指令與子程序的區(qū)別4.16.5 條件匯編 4.12.1 宏定義和調(diào)用、宏展開(kāi)1.程序中重復(fù)的程序段可以用宏指令來(lái)代替,定義的方法如下:宏名 MACRO 形參1,形參2, 宏定義體;指令語(yǔ)句的組合 ENDM調(diào)用的方法 宏名 實(shí)參1,實(shí)參2, 例:將如下指令:把AL中的內(nèi)容左移四位或者右移四位用宏指令代替MOV CL,4SAL AL,CL宏定義:SHIFT MACRO MOV CL,4 SAL AL,CL ENDM宏調(diào)用:SHIFT 2.宏的參數(shù) 參數(shù)的形式靈活多變,可以是常數(shù)、變量、存儲(chǔ)單元、指令操作碼或它們

17、的一部分,也可以是表達(dá)式,使用靈活多變的參數(shù),同一個(gè)宏定義甚至可以執(zhí)行不同的操作。宏定義(一個(gè)參數(shù))SHIFT MACRO X MOV CL,X SAL AL,CL ENDM宏調(diào)用:SHIFT 4宏定義(兩個(gè)參數(shù))SHIFT MACRO X,Y MOV CL,X SAL Y,CL ENDM宏調(diào)用:SHIFT 4,ALSHIFT 6,DI 3.宏操作符 :替換操作符:用于將參數(shù)與其他字符分開(kāi)。用在宏體中。如果參數(shù)緊接在其他字符之前或之后, 或者參數(shù)出現(xiàn)在帶引號(hào)的字符串中,就必須使用該操作符例:宏定義(形參在操作碼中)SHIFT MACRO X,Y,Z MOV CL,X S&Z Y,CL ENDM

18、宏調(diào)用:SHIFT 4,AL,ALMOV CL,4SAL AL,CL (1)宏定義刪除語(yǔ)法格式:PURGE 宏名表;在各類(lèi)名字中,只有宏名可以和指令同名;當(dāng)同名時(shí),宏定義優(yōu)先級(jí)最高。(2)宏定義退出(宏展開(kāi)退出)語(yǔ)法格式:EXITM;對(duì)EXITM后面的語(yǔ)句停止宏展開(kāi)。4.12.3 宏操作偽指令(3)局部標(biāo)號(hào)偽指令語(yǔ)法格式:LOCAL 標(biāo)號(hào)列表說(shuō)明:當(dāng)宏定義體內(nèi)有標(biāo)號(hào),同一程序內(nèi)多次調(diào)用,會(huì)造成標(biāo)號(hào)的重復(fù)定義。用LOCAL說(shuō)明的標(biāo)號(hào),第一次宏展開(kāi)時(shí),產(chǎn)生的標(biāo)號(hào)為?0000,第二次宏展開(kāi)時(shí)產(chǎn)生的標(biāo)號(hào)為?0001,。(?ffff) 注釋:只能在宏體內(nèi)使用。 只能緊接在宏定義語(yǔ)句之后使用。如宏定義:

19、CHANGE MACRO LOCAL ADD_0 CMP AL,10 JL ADD_0 ADD AL,A-0-10ADD_0: ADD AL,0 ENDM宏調(diào)用1:CHANGE宏調(diào)用2: CHANGE宏展開(kāi)后的代碼:CMP AL,10JL ?0000 ADD AL,A-0-10 ?0000: ADD AL,0CMP AL,10JL ?0001 ADD AL,A-0-10 ?0001: ADD AL,0第一個(gè)宏展開(kāi)第二個(gè)宏展開(kāi) (4)按參數(shù)值重復(fù)偽指令 REPT 重復(fù)次數(shù)重復(fù)體 ENDM例:把110分配給十個(gè)連續(xù)的存儲(chǔ)單元X=0REPT 10X=X+1DB XENDM匯編結(jié)果:X = X+1DB

20、 XX = X+1DB XX = X+1DB X例:把110分配給十個(gè)連續(xù)的存儲(chǔ)單元IRP X DB XENDM匯編結(jié)果:DB 1 DB 2 . DB 10 (4)IRP IRP 形參重復(fù)體 ENDM例:把110分配給十個(gè)連續(xù)的存儲(chǔ)單元IRPC X,0123456789 DB X+1ENDM匯編結(jié)果:DB 1 DB 2 . DB 10 (4)IRPC IRPC 形參,串或 重復(fù)體 ENDM注意: (1) 重復(fù)匯編偽指令常在宏體內(nèi)使用,但也可以在宏體外使用。重復(fù)匯編沒(méi)有名字,不能被調(diào)用。 (2)重復(fù)匯編偽指令有3條,3條偽指令區(qū)別在于如何規(guī)定重復(fù)次數(shù)。宏定義允許嵌套,即可以在一個(gè)宏定義中利用宏調(diào)

21、用,條件是這個(gè)宏調(diào)用必須先定義,例如:DIF MACRO N1,N2 MOV AX,N1 SUB AX ,N2ENDMDIFSQR MACRO N1,N2,RESULTPUSH DXPUSH AXDIF N1,N2IMUL AX MOV RESULT,AX POP AXPOP DXENDM4.12.4 宏定義嵌套宏定義中允許包含宏定義,當(dāng)然在調(diào)用內(nèi)層宏定義前必須先調(diào)用外層宏定義。例如:DIFMALOT MACRO OPNA,OPRATOPNA MACRO X,Y,ZPUSH AX MOV AX,XOPRAT AX,Y MOV Z,AX POP AXENDMENDM宏調(diào)用: DIFMALOT L

22、OGICAND,ANDLOGICAND MACRO X,Y,Z PUSH AX MOV AX,XAND AX,YMOV Z,AXENDM4.12.5 宏指令與子程序的區(qū)別相同點(diǎn):簡(jiǎn)化源程序的設(shè)計(jì)和結(jié)構(gòu)不同點(diǎn): 對(duì)目標(biāo)程序的長(zhǎng)度影響不同。 對(duì)目標(biāo)程序執(zhí)行速度的影響不同。 傳遞參數(shù)的方式不同;傳遞參數(shù)過(guò)程中如出現(xiàn)錯(cuò)誤,錯(cuò)誤的性質(zhì)不同。(宏:語(yǔ)法;子程序:邏輯)通常:當(dāng)程序段較短,要求較快執(zhí)行時(shí),用宏定義。當(dāng)程序段較長(zhǎng),或?yàn)闇p小目標(biāo)代碼長(zhǎng)度,用子程序。4.12.6 條件匯編條件匯編偽指令使匯編程序根據(jù)某種條件是否成立決定是否匯編某段語(yǔ)句序列條件匯編偽指令格式:IFxx 表達(dá)式(ARGUMENT)分支

23、語(yǔ)句體 1ELSE分支語(yǔ)句體 2ENDIF偽指令中的“xx”為組成條件匯編偽指令的其他字符,不同的“xx”,表達(dá)的條件不同。如“IF 表達(dá)式”,表達(dá)的條件為:如表達(dá)式的值不為0,則條件滿足;“IFE 表達(dá)式”表達(dá)的條件為:如表達(dá)式的值為0,則條件滿足。 條件匯編偽指令(IF|IFE)中的表達(dá)式: 運(yùn)算符使用第三章介紹的關(guān)系運(yùn)算符: EQ、NE、GT、LT、GE、LE 表達(dá)式用0FFFFH(或任意非0數(shù))表示真,用0表示假。 例:定義一個(gè)元素個(gè)數(shù)不超過(guò)100個(gè)的數(shù)組。 PDATAMACRO NUM IF NUM LT 100 DB NUM DUP(?) ELSE DB 100 DUP(?) EN

24、DIFENDM宏調(diào)用:PDATA 12宏展開(kāi):DB 12 DUP (?)宏調(diào)用:PDATA 105宏展開(kāi):DB 100 DUP (?)例: 編寫(xiě)宏MAXNUM,計(jì)算3個(gè)以內(nèi)的數(shù)據(jù)中的最大值,并將結(jié)果送入AX寄存器,要求根據(jù)宏調(diào)用時(shí)的實(shí)參個(gè)數(shù)展開(kāi)相應(yīng)代碼。 分析:1)至少應(yīng)有一個(gè)參數(shù),故第一個(gè)參數(shù)設(shè)為不可缺少;2)宏指令應(yīng)能夠作到:根據(jù)實(shí)參情況產(chǎn)生不同的程序段,進(jìn)行不同的處理。實(shí)參可分三種情況:A.只有一個(gè)參數(shù) B.有兩個(gè)參數(shù) C.有三個(gè)參數(shù) 顯然,應(yīng)使用條件匯編。 MAXNUM MACRO WX:REQ,WY,WZLOCAL MAXNUM1,MAXNUM2MOV AX,WX ;只有一個(gè)實(shí)參替換

25、WX IFNB ;還有WY時(shí)CMP AX,WYJGE MAXNUM1MOV AX,WYENDIFMAXNUM1:IFNB ;當(dāng)有WZ時(shí),匯編本段CMP AX,WZJGE MAXNUM2MOV AX,WZENDIFMAXNUM2:ENDMMaxnum bx ;只有1個(gè)參數(shù)Mov ax , bx ;只有1個(gè)參數(shù)Maxnum 3, 4 ;有2個(gè)參數(shù) Mov ax, 3 Cmp ax, 4 Jge ?0000 Mov ax, 4?0000:Maxnum n1, n2, n3 ;有3個(gè)參數(shù) mov ax, n1 cmp ax, n2 jge ?0000 mov ax, n2?0000: cmp ax, n3 jge ?0001 mov ax, n3?0001:本章需要掌握的知識(shí)重點(diǎn)1.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論