微机原理与接口技术第七章2

更新时间:2023-08-30 05:02:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

汇编语言程序举例三 查找关键字

六、过程定义伪操作 格式 过程名 PROC 类型 、、、 过程名 ENDP

▲ 过程定义由伪操作 过程定义由伪操作PROC开始、ENDP结束。 开始、 结束。 开始 结束 其中: 必须成对出现, 其中: PROC 和ENDP 必须成对出现 且语句前必须有过程名,过程名必须相同。 且语句前必须有过程名,过程名必须相同。 ▲ PROC和ENDP语句之间为子程的指令序列。 语句之间为子程的指令序列。 和 语句之间为子程的指令序列 ▲ 程序中可以定义多个过程。 程序中可以定义多个过程。 ▲ 程序经汇编、连接及装入内存后, 程序经汇编、连接及装入内存后 过程名为一具体的内存地址,指示子程入口。 过程名为一具体的内存地址,指示子程入口。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

;汇编语言程序结构例二(子程结构) 汇编语言程序结构例二(子程结构) 汇编语言程序结构例二 ;用二进制显示中断向量表中数据 用二进制显示中断向量表中数据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 PROCrotate: MOV CX , 16 ROL BX , 1 MOV DL , BL AND DL , 01H ADD DL , 30H MOV AH , 2H INT 21H LOOP rotate RET ;子程返回 子程返回 ENDS END begin ;代码段结束 代码段结束 ;指示程序结束和 指示程序结束和 ;程序入口 程序入口5

display ENDPcode

七、等值定义伪操作格式 符号名 EQU 需等值的表达式

▲作用是用符号名等值指定的表达式 作用是用符号名等值指定的表

达式 其中 表达式可以是任何有效的操作数 汇编时用语句中的表达式代替程序中符号所在的地方。 汇编时用语句中的表达式代替程序中符号所在的地方。 ▲应用: 应用: 应用 1. 定义符号常量,方便修改程序。 定义符号常量,方便修改程序。 2. 某表达式多次出现时,用等值伪操作可以方便编程。 某表达式多次出现时,用等值伪操作可以方便编程。

;汇编语言程序结构例二(子程结构) 汇编语言程序结构例二(子程结构) 汇编语言程序结构例二 ;用二进制显示中断向量表中数据 用二进制显示中断向量表中数据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

;用二进制显示 内容子程 用二进制显示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 ;代码段结束 代码段结束 ;指示程序结束和 指示程序结束和 ;程序入口 程序入口

MOV AL , keynext: CMP [ SI ] , AL JNZ point INC BX INC SI LOOP next CALL display ; 调用显示子程 MOV AH, 4CH ; 返回 返回DOS INT 21H

point:

例三

的个数。 用二进制显示中断向量表中数据 D0H的个数。 的个数

分析: 中断向量表指内存0: 分析: 中断向量表指内存 :0 ~ 0:3FFH : 字节空间; 大小 400H (即1K ) 字节空间 即 查找关键字D0H; 查找关键字 将关键字的个数,存放在 中 将关键字的个数,存放在BX中, 采用二进制显示BX内容 内容, 个字符 个字符; 采用二进制显示 内容,16个字符; 采用子程调用结构。 采用子程调用结构。

主程序流程图开始 DS: SI ← 查找区域首地址 0 : 0 CX ← 查找长度 400H BX ← 计数值初值 0 取内存单元内容, 取内存单元内容 与关键字比较,相等? 与关键字比较,相等? Y BX ← 计数值加 1 修改指针, 修改指针,指向下一单元 N CX ← CX-1 , 查找结束? - 查找结束? Y 调用子程, 调用子程,显示 BX 的内容 返回 DOS N

子程序流程图开始 CX ← 显示字符个数 16 BX 循环左移 1 位, 将要显示的位移至最低位, 将要显示的位移至最低位,保存在 DL 中 清 DL 的高 7 位,只保留要显示位的值 DL ← DL+30H , 完成数值 0~1 的 ASCII 码转换 调用DOS 系统 02 功能,显示 DL 中的字符 功能, 调用 N CX ← CX-1 , 显示结束? - 显示结束? Y RET 返回9

;汇编语言程序结构例二(子程结构) 汇编语言程序结构例二(子程结构) 汇编语言程序结构例二 ;

用二进制显示中断向量表中数据 用二进制显示中断向量表中数据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 ;代码段结束 代码段结束 ;指示程序结束和 指示程序结束和 ;程序入口 程序入口

汇编源程序scans.asm 汇编源程序D:\MASM\MASM scans; Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Microsoft Corp 1981, 1988. All rights reserved. scans.ASM (1 ) : error A2009: Symbol not defined: D0H scans.ASM (9 ) : error A2009: Symbol not defined: KEY 49924 + 419241 Bytes symbol space free 0 Warning Errors 2 Severe Errors D:\masm>

汇编程序提示出错的行号,据此可修改程序中的语法错误。 汇编程序提示出错的行号,据此可修改程序中的语法错误。

;汇编语言程序结构例二(子程结构) 汇编语言程序结构例二(子程结构) 汇编语言程序结构例二 ;用二进制显示中断向量表中数据 用二进制显示中断向量表中数据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 ;代码段结束 代码段结束 ;指示程序结束和 指示程序结束和 ;程序入口 程序入口

思考:如何用 改写此程序? 思考:如何用SCANSB改写此程序? 改写此程序12

汇编、连接后,执行程序: 汇编、连接后,执行程序: D:\masm>scans 0000000000000100 D:\masm>debug -S 0:0 L400 D0 0000:0023 0000:0043 0000:0073 0000:009C -Q D:\masm> ;在DOS下运行程序 下运行程序 ;利用 利用DEBUG检测结果 利用 检测结果

请上机自己调试该程序。 请上机自己调试该程序。13

在中断向量表中查找从键盘输入的字符,

在中断向量表中查找从键盘输入的字符, 查找从键盘输入的字符 并将其个数用二进制形式显示出来。 并将其个数用二进制形式显示出来。( scanskey.asm)

code SEGMENT ;代码段开始 代码段开始 ASSUME CS:code begin: MOV AX, 0000H ;设置查找首地址 设置查找首地址 ;用二进制显示 内容子程 用二进制显示BX内容子程 用二进制显示 MOV DS, AX display PROC MOV SI,0000H MOV CX, 16 ;显示位数 显示位数 MOV CX,0400H ;设置查找长度 设置查找长度 rotate: ROL BX, 1 MOV BX,0 ;计算值初值 计算值初值 MOV DL, BL MOV AH,01H ;从键盘输入 , 从键盘输入 AND DL, 01H INT 21H ;输入关键字在 ;输入关键字在AL中 输入关键字在AL中 ADD DL, 30H next: CMP [ SI ] , AL JNZ point MOV AH, 2H INC BX INT 21H point: INC SI LOOP rotate CALL display ;调用显示子程 调用显示子程 RET ;子程返回 子程返回 MOV AH,4CH ;调用 调用4CH功能 调用 功能 display ENDP INT 21H ;返回 返回DOS 返回 code ENDS ;代码段结束 代码段结束 END begin14

在中断向量表中查找从键盘输入的字符, 在中断向量表中查找从键盘输入的字符, 查找从键盘输入的字符 并将其个数用二进制形式显示出来。 并将其个数用二进制形式显示出来。( scanskey.asm) 用LODSB改写程序 改写程序;用二进制显示 内容子程 用二进制显示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 begin15

code SEGMENT ;代码段开始 代码段开始 ASSUME CS:codebegin: MOV AX, 0000H ;设置查找首地址 设置查找首地址 MOV DS, AX MOV SI,0000H MOV CX,0400H ;设置查找长度 设置查找长度 MOV BX,0 ;计算值初值 计算值初值

MOV AH,01H , INT 21H MOV DL,AL ,next: LODSB CMP AL, DL JNZ point INC BX point: LOOP next CALL display MOV AH,4CH INT 21H

;从键盘输入 从键盘输入 ;输入关键字 输入关键字 ;保存在 中 保存在DL中 保存在;从串取 从串取 ;与关键字比较 与关键字比较 ;计算值加 计算值加1 计算值加 ;查找结束? 查找结束? 查找结束 ;调用显示子程 调用显示子程 ;调用 调用4CH功能 调用 功能 ;返回 返回DOS 返回

数值回送操作符 自学 课前5分钟 回送操作符: 自学) 八、数值回送操作符 (自学)课前 分钟 TYPE,LENGTH,SIEE,OFFSET,SEG 5种。 , , , , 种 把一些特征或存贮器地址的一部分作为数值回送。 把一些特征或存贮器地址的一部分作为数值回送。 ·TYPE 格式: 格式:TYPE variable 变量则回送该变量的以字节数表示的 类型( 为 , 类型(DB为1,DW为2,DD为4,DQ为8,DT为10) 为 , 为 , 为 , 为 ) 或 label 标号回送标号类型数值(NEAR为-1

,FAR为-2) 标号回送标号类型数值( 为 为 ) 例:ARRAY DW 1,2,3 , , ADD SI,TYPE ARRAY , 汇编程序其形式: 汇编程序其形式: ADD SI,2 ,16

·LENGTH 格式:LENGTH variable 格式:对于变量中使用DUP汇编回送分配给变量单元数,其他情况回送1。 汇编回送分配给变量单元数,其他情况回送 。 对于变量中使用 汇编回送分配给变量单元数 例:FESS DW 100 DUP(0) ( ) 对于 MOV CX,LENGTH FEES , 汇编程序将其形式: 汇编程序将其形式: MOV CX,100 , 其他情况 例:ARRAY DW 1,2,3 , , 对于指令 MOV CX,LENGTH ARRAY , 汇编程序将使其形式为: 汇编程序将使其形式为:MOV CX,1 , 例:TABLE DB ‘ABCD’ 对于指令 MOV CX,LENGTH TABLE , 汇编程序使其形式为: 汇编程序使其形式为:MOV CX,1 ,17

· SIEE 格式:SIEE variable回送分配给该变量的字节数LENGTH*TYPE 回送分配给该变量的字节数

例:FEES DW 100 DUP(0)MOV CX,SIZE ARRAY , 将形成: 将形成:MOV CX,200 ,

例:TABLE DB‘ABCD’MOV CX,SIEE TABLE , 将形成 MOV CX,1 ,

例:ARRAY DW 1,2,3MOV CX,SIEE ARRAY , 形式 MOV CX,2 , LENGTH*TYPE=218

其中: 变量的返回值是类型的字节数: 其中 TYPE变量的返回值是类型的字节数 变量的返回值是类型的字节数 DB为1,DW为2,DD为4,DQ为8,DT为10; 为 , 为 , 为 , 为 , 为 ; TYPE标号的返回值是:NEAR为-1,FAR为-2。 标 的返回值是: 为 , 为 。LENGTH变量返回 变量返回DUP分配的单元数,对于其他情况 分配的单元数, 变量返回 分配的单元数 则返回1。 则返回 。

SIZE返回值是: LENGTH和TYPE值的乘积,即 返回值是: 值的乘积, 返回值是 和 值的乘积 变量的字节数。 变量的字节数。

本文来源:https://www.bwwdw.com/article/kevi.html

Top