版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、4.9 字符串處理程序設計 4.9.1 確定字符串的長度 4.9.2 加偶校驗到ASCII碼 4.9.1 確定字符串的長度【例4.9】從頭搜索字符串的結束標志,統(tǒng)計搜索的字符個數(shù)。 流程圖:取串元素置串長度的初值為0串長度加1=CR?存串長度返回置串指針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改進:(1)為了避免特定字符的丟失,陷入死循環(huán),采用循環(huán)次數(shù)控制循環(huán),要求循環(huán)次數(shù)大于字符串長度(2)在程序結束時
3、,檢查字符串長度是否與給定的循環(huán)次數(shù)相等。若相等,則轉至出錯處理改進后的程序如下: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 加偶校驗到ASCII碼【例4.10】若有一個ASCII字符串,它們的起始地址放在單元STRING中,要求從串中取出每一個字符,檢查其中包含的“1”的個數(shù),若字節(jié)中“1”的個數(shù)為偶數(shù),則它的最高有效
5、位設置為“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 碼轉換程序設計輸入輸出設備以ASCII碼表示字符,以十進制表示數(shù)。而機器內部以二進制表示,所以,在CPU和I/O設備之間必須進行碼的轉換。實現(xiàn)碼轉換的方法有:軟件轉換、查表轉換、硬件轉換【例4.11】若有一個二進制數(shù)碼串,要把每一個字節(jié)中的二進制轉換為兩位十六進制數(shù)的ASCII碼,高四位的ASCII碼放在地址高的單元,串
7、中的第一個字節(jié)為串的長度(小于128)4.10.1 16進制到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;長度加倍 MOV L2,CX MOV CX,AXAGAIN: MOV AL,BX ; MOV DL,AL AND AL,0FH CALL CHANGE ;低四位轉換 MOV AL,DL PUSH CX MOV CL,4 SHR AL,CL POP CX MOV SI ,AL CALL CHANGE ;高四位轉換 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】把在內存變量NUMBER中的16位二進制數(shù)的每一位轉換為相應的ASCII碼,并且存入串變量STRING中4.10.2 從二進制到ASCII碼的轉換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 有關I/O的DOS功能調用 為了把程序運行結果顯示在
11、顯示器中。需要調用操作系統(tǒng)中的I/O子程序。在調用時,把子程序的號(或稱系統(tǒng)功能號)送至AH,把子程序的入口參數(shù),送至指定的寄存器,然后由中斷指令INT 21H 來實現(xiàn)調用。【例4.13】利用DOS的功能調用2實現(xiàn)在CRT上的連續(xù)輸出字符09分析:為了使輸出字符之間有間隔,在每一循環(huán)中,輸出一個09字符和一個空格。為了保證是十進制數(shù),增量后要用DAA指令調整。 為了保證始終是一位十進制數(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 請著重看PUSH BX 和POP BX的作用INT 21H MOV CX,0FFFFHAGAIN: DEC CX JNE AGAIN JMP GOONSTART ENDPCO
13、DE ENDSEND BEGIN【例4.14】利用DOS的功能調用9實現(xiàn)在CRT上的連續(xù)輸出字符0059分析:調用功能9時,要求在調用前使DX指向字符串的首地址,字符串必須以字符“$”結束,則功能調用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 宏定義和調用、宏展開1.程序中重復的程序段可以用宏指令來代替,定義的方法如下:宏名 MACRO 形參1,形參2, 宏定義體;指令語句的組合 ENDM調用的方法 宏名 實參1,實參2, 例:將如下指令:把AL中的內容左移四位或者右移四位用宏指令代替MOV CL,4SAL AL,CL宏定義:SHIFT MACRO MOV CL,4 SAL AL,CL ENDM宏調用:SHIFT 2.宏的參數(shù) 參數(shù)的形式靈活多變,可以是常數(shù)、變量、存儲單元、指令操作碼或它們
17、的一部分,也可以是表達式,使用靈活多變的參數(shù),同一個宏定義甚至可以執(zhí)行不同的操作。宏定義(一個參數(shù))SHIFT MACRO X MOV CL,X SAL AL,CL ENDM宏調用:SHIFT 4宏定義(兩個參數(shù))SHIFT MACRO X,Y MOV CL,X SAL Y,CL ENDM宏調用:SHIFT 4,ALSHIFT 6,DI 3.宏操作符 :替換操作符:用于將參數(shù)與其他字符分開。用在宏體中。如果參數(shù)緊接在其他字符之前或之后, 或者參數(shù)出現(xiàn)在帶引號的字符串中,就必須使用該操作符例:宏定義(形參在操作碼中)SHIFT MACRO X,Y,Z MOV CL,X S&Z Y,CL ENDM
18、宏調用:SHIFT 4,AL,ALMOV CL,4SAL AL,CL (1)宏定義刪除語法格式:PURGE 宏名表;在各類名字中,只有宏名可以和指令同名;當同名時,宏定義優(yōu)先級最高。(2)宏定義退出(宏展開退出)語法格式:EXITM;對EXITM后面的語句停止宏展開。4.12.3 宏操作偽指令(3)局部標號偽指令語法格式:LOCAL 標號列表說明:當宏定義體內有標號,同一程序內多次調用,會造成標號的重復定義。用LOCAL說明的標號,第一次宏展開時,產生的標號為?0000,第二次宏展開時產生的標號為?0001,。(?ffff) 注釋:只能在宏體內使用。 只能緊接在宏定義語句之后使用。如宏定義:
19、CHANGE MACRO LOCAL ADD_0 CMP AL,10 JL ADD_0 ADD AL,A-0-10ADD_0: ADD AL,0 ENDM宏調用1:CHANGE宏調用2: CHANGE宏展開后的代碼: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第一個宏展開第二個宏展開 (4)按參數(shù)值重復偽指令 REPT 重復次數(shù)重復體 ENDM例:把110分配給十個連續(xù)的存儲單元X=0REPT 10X=X+1DB XENDM匯編結果:X = X+1DB
20、 XX = X+1DB XX = X+1DB X例:把110分配給十個連續(xù)的存儲單元IRP X DB XENDM匯編結果:DB 1 DB 2 . DB 10 (4)IRP IRP 形參重復體 ENDM例:把110分配給十個連續(xù)的存儲單元IRPC X,0123456789 DB X+1ENDM匯編結果:DB 1 DB 2 . DB 10 (4)IRPC IRPC 形參,串或 重復體 ENDM注意: (1) 重復匯編偽指令常在宏體內使用,但也可以在宏體外使用。重復匯編沒有名字,不能被調用。 (2)重復匯編偽指令有3條,3條偽指令區(qū)別在于如何規(guī)定重復次數(shù)。宏定義允許嵌套,即可以在一個宏定義中利用宏調
21、用,條件是這個宏調用必須先定義,例如: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 宏定義嵌套宏定義中允許包含宏定義,當然在調用內層宏定義前必須先調用外層宏定義。例如:DIFMALOT MACRO OPNA,OPRATOPNA MACRO X,Y,ZPUSH AX MOV AX,XOPRAT AX,Y MOV Z,AX POP AXENDMENDM宏調用: DIFMALOT L
22、OGICAND,ANDLOGICAND MACRO X,Y,Z PUSH AX MOV AX,XAND AX,YMOV Z,AXENDM4.12.5 宏指令與子程序的區(qū)別相同點:簡化源程序的設計和結構不同點: 對目標程序的長度影響不同。 對目標程序執(zhí)行速度的影響不同。 傳遞參數(shù)的方式不同;傳遞參數(shù)過程中如出現(xiàn)錯誤,錯誤的性質不同。(宏:語法;子程序:邏輯)通常:當程序段較短,要求較快執(zhí)行時,用宏定義。當程序段較長,或為減小目標代碼長度,用子程序。4.12.6 條件匯編條件匯編偽指令使匯編程序根據某種條件是否成立決定是否匯編某段語句序列條件匯編偽指令格式:IFxx 表達式(ARGUMENT)分支
23、語句體 1ELSE分支語句體 2ENDIF偽指令中的“xx”為組成條件匯編偽指令的其他字符,不同的“xx”,表達的條件不同。如“IF 表達式”,表達的條件為:如表達式的值不為0,則條件滿足;“IFE 表達式”表達的條件為:如表達式的值為0,則條件滿足。 條件匯編偽指令(IF|IFE)中的表達式: 運算符使用第三章介紹的關系運算符: EQ、NE、GT、LT、GE、LE 表達式用0FFFFH(或任意非0數(shù))表示真,用0表示假。 例:定義一個元素個數(shù)不超過100個的數(shù)組。 PDATAMACRO NUM IF NUM LT 100 DB NUM DUP(?) ELSE DB 100 DUP(?) EN
24、DIFENDM宏調用:PDATA 12宏展開:DB 12 DUP (?)宏調用:PDATA 105宏展開:DB 100 DUP (?)例: 編寫宏MAXNUM,計算3個以內的數(shù)據中的最大值,并將結果送入AX寄存器,要求根據宏調用時的實參個數(shù)展開相應代碼。 分析:1)至少應有一個參數(shù),故第一個參數(shù)設為不可缺少;2)宏指令應能夠作到:根據實參情況產生不同的程序段,進行不同的處理。實參可分三種情況:A.只有一個參數(shù) B.有兩個參數(shù) C.有三個參數(shù) 顯然,應使用條件匯編。 MAXNUM MACRO WX:REQ,WY,WZLOCAL MAXNUM1,MAXNUM2MOV AX,WX ;只有一個實參替換
25、WX IFNB ;還有WY時CMP AX,WYJGE MAXNUM1MOV AX,WYENDIFMAXNUM1:IFNB ;當有WZ時,匯編本段CMP AX,WZJGE MAXNUM2MOV AX,WZENDIFMAXNUM2:ENDMMaxnum bx ;只有1個參數(shù)Mov ax , bx ;只有1個參數(shù)Maxnum 3, 4 ;有2個參數(shù) Mov ax, 3 Cmp ax, 4 Jge ?0000 Mov ax, 4?0000:Maxnum n1, n2, n3 ;有3個參數(shù) mov ax, n1 cmp ax, n2 jge ?0000 mov ax, n2?0000: cmp ax, n3 jge ?0001 mov ax, n3?0001:本章需要掌握的知識重點1.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年油田工程技術服務項目融資計劃書
- 2024秋新滬科版物理八年級上冊教學課件 第五章 質量 第三節(jié) 密度
- 機械原理考試題
- 養(yǎng)老院老人生活娛樂活動組織人員職業(yè)道德制度
- 養(yǎng)老院老人健康管理制度
- 《就業(yè)中國演講》課件
- 《金地格林世界提案》課件
- 提前預支工資合同
- 2024事業(yè)單位保密協(xié)議范本與保密工作考核3篇
- 2024年度離婚協(xié)議書詳述財產分配與子女撫養(yǎng)細節(jié)及責任2篇
- 統(tǒng)計信號分析知到智慧樹章節(jié)測試課后答案2024年秋哈爾濱工程大學
- 2025年中考道德與法治一輪教材復習-九年級下冊-第一單元 我們共同的世界
- 【MOOC】中國電影經典影片鑒賞-北京師范大學 中國大學慕課MOOC答案
- 【MOOC】中藥藥理學-學做自己的調理師-暨南大學 中國大學慕課MOOC答案
- 陜西省西安市長安區(qū)2024-2025學年八年級上學期期中地理試卷
- 企業(yè)破產律師服務協(xié)議
- 預防火災消防安全培訓
- 浙江省2023年1月學業(yè)考試物理物理試題(解析版)
- 智慧傳承-黎族船型屋智慧樹知到期末考試答案章節(jié)答案2024年海南師范大學
- 配位化學-本科生版智慧樹知到答案章節(jié)測試2023年蘭州大學
- 食堂承包合作方案策劃書
評論
0/150
提交評論