版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、4.9 字符串处理程序设计 4.9.1 确定字符串的长度 4.9.2 加偶校验到ASCII码 4.9.1 确定字符串的长度【例4.9】从头搜索字符串的结束标志,统计搜索的字符个数。 流程图:取串元素置串长度的初值为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)为了避免特定字符的丢失,陷入死循环,采用循环次数控制循环,要求循环次数大于字符串长度(2)在程序结束时
3、,检查字符串长度是否与给定的循环次数相等。若相等,则转至出错处理改进后的程序如下: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”的个数,若字节中“1”的个数为偶数,则它的最高有效
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码表示字符,以十进制表示数。而机器内部以二进制表示,所以,在CPU和I/O设备之间必须进行码的转换。实现码转换的方法有:软件转换、查表转换、硬件转换【例4.11】若有一个二进制数码串,要把每一个字节中的二进制转换为两位十六进制数的ASCII码,高四位的ASCII码放在地址高的单元,串
7、中的第一个字节为串的长度(小于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位二进制数的每一位转换为相应的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、显示器中。需要调用操作系统中的I/O子程序。在调用时,把子程序的号(或称系统功能号)送至AH,把子程序的入口参数,送至指定的寄存器,然后由中断指令INT 21H 来实现调用。【例4.13】利用DOS的功能调用2实现在CRT上的连续输出字符09分析:为了使输出字符之间有间隔,在每一循环中,输出一个09字符和一个空格。为了保证是十进制数,增量后要用DAA指令调整。 为了保证始终是一位十进制数,用AND 0FH指令屏蔽掉高4位。4.11.1 在CRT上连续输出字符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实现在CRT上的连续输出字符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 宏指令与子程序的区别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.宏的参数 参数的形式灵活多变,可以是常数、变量、存储单元、指令操作码或它们
17、的一部分,也可以是表达式,使用灵活多变的参数,同一个宏定义甚至可以执行不同的操作。宏定义(一个参数)SHIFT MACRO X MOV CL,X SAL AL,CL ENDM宏调用:SHIFT 4宏定义(两个参数)SHIFT MACRO X,Y MOV CL,X SAL Y,CL ENDM宏调用:SHIFT 4,ALSHIFT 6,DI 3.宏操作符 :替换操作符:用于将参数与其他字符分开。用在宏体中。如果参数紧接在其他字符之前或之后, 或者参数出现在带引号的字符串中,就必须使用该操作符例:宏定义(形参在操作码中)SHIFT MACRO X,Y,Z MOV CL,X S&Z Y,CL ENDM
18、宏调用:SHIFT 4,AL,ALMOV CL,4SAL AL,CL (1)宏定义删除语法格式:PURGE 宏名表;在各类名字中,只有宏名可以和指令同名;当同名时,宏定义优先级最高。(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)按参数值重复伪指令 REPT 重复次数重复体 ENDM例:把110分配给十个连续的存储单元X=0REPT 10X=X+1DB XENDM汇编结果:X = X+1DB
20、 XX = X+1DB XX = X+1DB X例:把110分配给十个连续的存储单元IRP X DB XENDM汇编结果:DB 1 DB 2 . DB 10 (4)IRP IRP 形参重复体 ENDM例:把110分配给十个连续的存储单元IRPC X,0123456789 DB X+1ENDM汇编结果:DB 1 DB 2 . DB 10 (4)IRPC IRPC 形参,串或 重复体 ENDM注意: (1) 重复汇编伪指令常在宏体内使用,但也可以在宏体外使用。重复汇编没有名字,不能被调用。 (2)重复汇编伪指令有3条,3条伪指令区别在于如何规定重复次数。宏定义允许嵌套,即可以在一个宏定义中利用宏调
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 宏指令与子程序的区别相同点:简化源程序的设计和结构不同点: 对目标程序的长度影响不同。 对目标程序执行速度的影响不同。 传递参数的方式不同;传递参数过程中如出现错误,错误的性质不同。(宏:语法;子程序:逻辑)通常:当程序段较短,要求较快执行时,用宏定义。当程序段较长,或为减小目标代码长度,用子程序。4.12.6 条件汇编条件汇编伪指令使汇编程序根据某种条件是否成立决定是否汇编某段语句序列条件汇编伪指令格式:IFxx 表达式(ARGUMENT)分支
23、语句体 1ELSE分支语句体 2ENDIF伪指令中的“xx”为组成条件汇编伪指令的其他字符,不同的“xx”,表达的条件不同。如“IF 表达式”,表达的条件为:如表达式的值不为0,则条件满足;“IFE 表达式”表达的条件为:如表达式的值为0,则条件满足。 条件汇编伪指令(IF|IFE)中的表达式: 运算符使用第三章介绍的关系运算符: EQ、NE、GT、LT、GE、LE 表达式用0FFFFH(或任意非0数)表示真,用0表示假。 例:定义一个元素个数不超过100个的数组。 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个以内的数据中的最大值,并将结果送入AX寄存器,要求根据宏调用时的实参个数展开相应代码。 分析:1)至少应有一个参数,故第一个参数设为不可缺少;2)宏指令应能够作到:根据实参情况产生不同的程序段,进行不同的处理。实参可分三种情况:A.只有一个参数 B.有两个参数 C.有三个参数 显然,应使用条件汇编。 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个参数Mov ax , bx ;只有1个参数Maxnum 3, 4 ;有2个参数 Mov ax, 3 Cmp ax, 4 Jge ?0000 Mov ax, 4?0000:Maxnum n1, n2, n3 ;有3个参数 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 指纹电子锁课程设计
- 小班蘑菇创意画课程设计
- 小学生花篮课程设计
- 商业秘密保护的法律与实战技巧
- 小暑集体课程设计
- 幼儿救生圈课程设计
- 图书借阅课程设计
- 思政微课课程设计特色
- 动作课程设计
- 托教怎么进行课程设计
- 统计信号分析知到智慧树章节测试课后答案2024年秋哈尔滨工程大学
- 2025年中考道德与法治一轮教材复习-九年级下册-第一单元 我们共同的世界
- 【MOOC】中国电影经典影片鉴赏-北京师范大学 中国大学慕课MOOC答案
- 【MOOC】中药药理学-学做自己的调理师-暨南大学 中国大学慕课MOOC答案
- 陕西省西安市长安区2024-2025学年八年级上学期期中地理试卷
- 企业破产律师服务协议
- 预防火灾消防安全培训
- 浙江省2023年1月学业考试物理物理试题(解析版)
- 智慧传承-黎族船型屋智慧树知到期末考试答案章节答案2024年海南师范大学
- 配位化学-本科生版智慧树知到答案章节测试2023年兰州大学
- 形式发票-范本
评论
0/150
提交评论