六、过程定义伪操作 格式过程名PROC类型 过程名ENDP ▲过程定义由伪操作PROC开始、ENDP结束 其中:PROC和ENDP必须成对出现, 且语句前必须有过程名,过程名必须相同 ▲PROC和ENDP语句之间为子程的指令序列。 ▲程序中可以定义多个过程。 ▲程序经汇编、连接及装入内存后, 过程名为一具体的内存地址,指示子程入口
1 六、过程定义伪操作 格式 过程名 PROC 类型 、、、 过程名 ENDP ▲ 过程定义由伪操作PROC开始、ENDP结束。 其中: PROC 和ENDP 必须成对出现, 且语句前必须有过程名,过程名必须相同。 ▲ PROC和ENDP语句之间为子程的指令序列。 ▲ 程序中可以定义多个过程。 ▲ 程序经汇编、连接及装入内存后, 过程名为一具体的内存地址,指示子程入口
▲过程名常用作CALL调用指令的操作数, 子程的最后安排RE返回指令,使执行完子程后能返回调用处。 ▲过程有两种类型:NEAR和FAR 无类型项时,默认为NEAR类型 当过程与调用指令不在同一段时,应将过程定义为FAR类型。 过程类型决定子程中RET的返回类型
2 ▲过程名常用作CALL调用指令的操作数, 子程的最后安排RET返回指令,使执行完子程后能返回调用处。 ▲过程有两种类型:NEAR和FAR 无类型项时,默认为NEAR类型。 当过程与调用指令不在同一段时,应将过程定义为 FAR 类型。 过程类型决定子程中RET的返回类型
例1 display proc C3H RET ;NEAR属性的过程对应段内返回 display ENDP 例2 display PRoC Far CBH RET ;FAR属性的过程对应段间返回 display ENDP
3 例1 display PROC 、、 、、 C3H 、、 RET ;NEAR 属性的过程对应段内返回 display ENDP 例2 display PROC FAR 、、 、、 CBH 、、 RET ;FAR属性的过程对应段间返回 display ENDP
;利用汇编语言程序结构例三(子程结构) 用二进制显示中断向量表中数据D0H的个数 key EQU0D0H;用符号表示常量(关键字) code SEgMent ;代码段开始 ;用二进制显示BX内容子程 ASSUME CS: code begin: MOV AX. 0000H display proc MOV DS. AX MOV CX.16 MOV SI 0000H rotate: ROL BX. 1 MOV CX.0400H MOV DL BL MOV BX. 0 AND DL OIH MOⅤAL,key ADD DL 30H next: CMP I SI, AL MOV AH. 2H JNZ point INT 21H INC BX LOOP rotate point: INC SI RET 子程返回 LOOP next display ENDP CALL display;调用显示子程 code ENDs ;代码段结束 MOAH,4CH;返回DOS INT 21H end begin;指示程序结束和 ;程序入口
5 ;利用汇编语言程序结构例二(子程结构) ;用二进制显示中断向量表中数据D0H的个数 key EQU 0D0H ;用符号表示常量(关键字) code SEGMENT ;代码段开始 ASSUME CS:code begin: MOV AX , 0000H MOV DS , AX MOV SI , 0000H MOV CX , 0400H MOV BX , 0 MOV AL , key next: CMP [ SI ] , AL JNZ point INC BX point: INC SI LOOP next CALL display ; 调用显示子程 MOV AH, 4CH ; 返回DOS INT 21H ;用二进制显示BX内容子程 display PROC MOV CX , 16 rotate: ROL BX , 1 MOV DL , BL AND DL , 01H ADD DL , 30H MOV AH , 2H INT 21H LOOP rotate RET ;子程返回 display ENDP code ENDS ;代码段结束 END begin ;指示程序结束和 ;程序入口
七、等值定义伪操作 格式符号名EQU需等值的表达式 ▲作用是用符号名等值指定的表达式 其中 表达式可以是任何有效的操作数 汇编时用语句中的表达式代替程序中符号所在的地方。 ▲应用: 1.定义符号常量,方便修改程序。 2.某表达式多次出现时,用等值伪操作可以方便编程
6 七、等值定义伪操作 格式 符号名 EQU 需等值的表达式 ▲作用是用符号名等值指定的表达式 其中 : 表达式可以是任何有效的操作数 汇编时用语句中的表达式代替程序中符号所在的地方。 ▲应用: 1. 定义符号常量,方便修改程序。 2. 某表达式多次出现时,用等值伪操作可以方便编程
;利用汇编语言程序结构例三(子程结构) 用二进制显示中断向量表中数据D0H的个数 key EQU ODOH 用符号表示常量关键字):用二进制显示BX内容子程 code SEgMent ;代码段开始 display proc ASSUME CS: code MOV CX. 16 begin: MOV AX, 0000H rotate ROL BX. 1 MOV DS. AX MOV DL. BL MOV SI 0000H AND DL OIH MOV CX.0400H ADD DL 30H MOV BX. 0 MOV AH 2H MOV AL, key NT 21H next: CMP SI, AL LOOP rotate JNZ point RET ;子程返回 INC BX display endp point: INC SI code ENDS 代码段结束 LOOP next eNd begin;指示程序结束和 CALL display;调用显示子程 程序入口 MOV AH,4CH;返回DOS INT 21H
7 ;利用汇编语言程序结构例二(子程结构) ;用二进制显示中断向量表中数据D0H的个数 key EQU 0D0H ;用符号表示常量(关键字) code SEGMENT ;代码段开始 ASSUME CS:code begin: MOV AX , 0000H MOV DS , AX MOV SI , 0000H MOV CX , 0400H MOV BX , 0 MOV AL , key next: CMP [ SI ] , AL JNZ point INC BX point: INC SI LOOP next CALL display ; 调用显示子程 MOV AH, 4CH ; 返回DOS INT 21H ;用二进制显示BX内容子程 display PROC MOV CX , 16 rotate: ROL BX , 1 MOV DL , BL AND DL , 01H ADD DL , 30H MOV AH , 2H INT 21H LOOP rotate RET ;子程返回 display ENDP code ENDS ;代码段结束 END begin ;指示程序结束和 ;程序入口
实现用二进制显示中断向量表中数据D0H的个数。 分析:中断向量表指内存0:0~0:3FFH 大小400H(即1K)字节空间; 查找关键字D0H; 将关键字的个数,存放在BX中, 采用二进制显示BX内容,16个字符; 采用子程调用结构
8 实现 用二进制显示中断向量表中数据 D0H的个数。 分析: 中断向量表指内存0:0 ~ 0:3FFH 大小 400H (即1K ) 字节空间; 查找关键字D0H; 将关键字的个数,存放在BX中, 采用二进制显示BX内容,16个字符; 采用子程调用结构
主程序流程图 子程序流程图 开始 开始 DS: SI ←查找区域首地址0:0 CX+查找长度400H 显示字符个数16 BX←计数值初值 BX循环左移1位, 取内存单元内容, 将要显示的位移至最低位,保存在DL中 与关键字比较,相等? 清DL的高7位,只保留要显示位的值 BX←计数值加1 DL←DL+3 修改指针,指向下一单元 完成数值0~1的ASC码转换 CX←CX-1,查找结束? 调用DOS系统02功能,显示DL中的字 CX←CX-1,显示结束? 调用子程,显示BX的内容 返回DOS RET返回
9 主程序流程图 取内存单元内容, 与关键字比较,相等? N 开始 Y Y N BX ← 计数值加 1 修改指针,指向下一单元 CX ← CX-1 , 查找结束? DS: SI ← 查找区域首地址 0 : 0 CX ← 查找长度 400H BX ← 计数值初值 0 调用子程,显示 BX 的内容 返回 DOS 子程序流程图 开始 Y N 清 DL 的高 7 位,只保留要显示位的值 调用 DOS 系统 02 功能,显示 DL 中的字符 CX ← CX-1 , 显示结束? CX ← 显示字符个数 16 RET 返回 BX 循环左移 1 位, 将要显示的位移至最低位,保存在 DL 中 DL ← DL+30H , 完成数值 0~1 的 ASCII 码转换
利用汇编语言程序结构例二(子程结构) 用二进制显示中断向量表中数据D0H的个数 key EQU DOH;用符号表示常量(关键字)|:用二进制显示BX内容子程 code SEgment 代码段开始 display proc ASSUME CS: code begin: MOV AX, 0000H MOV CX.16 MOV DS. AX rotate ROL BX. 1 MOV SI 0000H MOV DL BL MOV CX. 0400H AND DL OIH MOV BX. 0 ADD DL 30H MOV AH 2H MOV AL, key next: CMP I SI, AL INT 21H JNZ point LOOP rotate INC BX RET ;子程返回 point: INC SI display ENDP LOOP next cod ENDS 代码段结束 CALL display;调用显示子程 ENd begin;指示程序结束和 MOV AH,4CH;返回DOS ;程序入口 INT 21H
10 ;利用汇编语言程序结构例二(子程结构) ;用二进制显示中断向量表中数据D0H的个数 key EQU D0H ;用符号表示常量(关键字) code SEGMENT ;代码段开始 ASSUME CS:code begin: MOV AX , 0000H MOV DS , AX MOV SI , 0000H MOV CX , 0400H MOV BX , 0 MOV AL , key next: CMP [ SI ] , AL JNZ point INC BX point: INC SI LOOP next CALL display ; 调用显示子程 MOV AH, 4CH ; 返回DOS INT 21H ;用二进制显示BX内容子程 display PROC MOV CX , 16 rotate: ROL BX , 1 MOV DL , BL AND DL , 01H ADD DL , 30H MOV AH , 2H INT 21H LOOP rotate RET ;子程返回 display ENDP code ENDS ;代码段结束 END begin ;指示程序结束和 ;程序入口