1
六,过程定义伪操作格式 过程名 PROC 类型
、、、
过程名 ENDP
▲ 过程定义由伪操作 PROC开始,ENDP结束 。
其中,PROC 和 ENDP 必须成对出现,
且语句前必须有过程名,过程名必须相同 。
▲ PROC和 ENDP语句之间为子程的指令序列 。
▲ 程序中可以定义多个过程 。
▲ 程序经汇编,连接及装入内存后,
过程名为一具体的内存地址,指示子程入口 。
2
▲ 过程名常用作 CALL调用指令的操作数,
子程的最后安排 RET返回指令,使执行完子程后能返回调用处 。
▲ 过程有两种类型,NEAR和 FAR
无类型项时,默认为 NEAR类型 。
当过程与调用指令不在同一段时,应将过程定义为 FAR 类型 。
过程类型决定子程中 RET的返回类型
3
例 1 display PROC
、、
、,C3H
、、
RET ;NEAR 属性的过程对应段内返回
display ENDP
例 2 display PROC FAR
、、
、,CBH
、、
RET ;FAR属性的过程对应段间返回
display ENDP
4
汇编语言程序 举例 三
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 ;指示程序结束和;程序入口
6
七,等值定义伪操作格式 符号名 EQU 需等值的表达式
▲ 作用是用符号名等值指定的表达式其中,
表达式可以是任何有效的操作数汇编时用语句中的表达式代替程序中符号所在的地方 。
▲ 应用:
1,定义符号常量,方便修改程序 。
2,某表达式多次出现时,用等值伪操作可以方便编程 。
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 ;指示程序结束和;程序入口
8
实现 用二进制显示中断向量表中数据 D0H的个数 。
分析,中断向量表指内存 0,0 ~ 0,3FFH
大小 400H (即 1K ) 字节空间 ;
查找关键字 D0H;
将关键字的个数,存放在 BX中,
采用二进制显示 BX内容,16个字符;
采用子程调用结构。
9
主程序流程图取内存单元内容,
与关键字比较,相等?
N
开始
Y
Y
N
BX ← 计数值加 1
修改指针,指向下一单元
CX ← CX - 1,查找结束?
DS,SI ← 查找区域首地址 0,0
CX ← 查找长度 4 0 0 H
BX ← 计数值初值 0
调用子程,显示 B X 的内容返回 D O S
子程序流程图开始
Y
N
清 D L 的高 7 位,只保留要显示位的值调用 D O S 系统 02 功能,显示 DL 中的字符
CX ← CX - 1,显示结束?
CX ← 显示字符个数 16
RE T 返回
BX 循环左移 1 位,
将要显示的位移至最低位,保存在 DL 中
DL ← DL +3 0H,
完成数值 0 ~ 1 的 A S C II 码转换
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 ;指示程序结束和;程序入口
11
汇编源程序 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>
汇编程序提示出错的行号,据此可修改程序中的语法错误。
12;利用汇编语言程序结构例二 ( 子程结构 );用二进制显示中断向量表中数据 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改写此程序?
13
汇编、连接后,执行程序:
D:\masm>scans ;在 DOS下运行程序
0000000000000100
D:\masm>debug ;利用 DEBUG检测结果
-S 0:0 L400 D0
0000:0023
0000:0043
0000:0073
0000:009C
-Q
D:\masm>
请上机自己调试该程序。
14
例,用 CMP指令 在中断向量表中 查找从键盘输入的字符,
并将其个数用二进制形式显示出来 。 ( scanskey.asm)
code SEGMENT ;代码段开始
ASSUME CS:code
begin,MOV AX,0000H ;设置查找首地址
MOV DS,AX
MOV SI,0000H
MOV CX,0400H ;设置查找长度
MOV BX,0 ;计算值初值
MOV AH,01H ;从键盘输入
INT 21H ;输入关键字在 AL中
next,CMP [ SI ],AL
JNZ point
INC BX
point,INC SI
CALL display ;调用显示子程
MOV AH,4CH ;调用 4CH功能
INT 21H ;返回 DOS;用二进制显示 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
15
例:用 LODSB 在中断向量表中 查找从键盘输入的字符,
并将其个数用二进制形式显示出来 。 ( scanskey.asm)
code SEGMENT ;代码段开始
ASSUME CS:code
begin,MOV AX,0000H ;设置查找首地址
MOV DS,AX
MOV SI,0000H
MOV CX,0400H ;设置查找长度
MOV BX,0 ;计算值初值
MOV AH,01H ;从键盘输入
INT 21H ;输入关键字
MOV DL,AL ;保存在 DL中
next,LODSB ;从串取
CMP AL,DL ;与关键字比较
JNZ point
INC BX ;计算值加 1
point,LOOP next ;查找结束?
CALL display ;调用显示子程
MOV AH,4CH ;调用 4CH功能
INT 21H ;返回 DOS;用二进制显示 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
用 LODSB改写程序
16
八,数值 回送操作符,(自学)课前 5分钟
TYPE,LENGTH,SIEE,OFFSET,SEG 5种。
把一些特征或存贮器地址的一部分作为数值回送。
· TYPE
格式,TYPE variable 变量或 label 标号
回送该变量的以字节数表示的类型
( DB为 1,DW为 2,DD为 4,DQ为 8,DT为 10)
回送标号类型数值( NEAR为-1,FAR为- 2)
例,ARRAY DW 1,2,3
ADD SI,TYPE ARRAY
汇编程序其形式,ADD SI,2
17
· 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
18
· SIZE
格式,SIZE 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,3
MOV CX,SIEE ARRAY
形式,MOV CX,2
LENGTH*TYPE=2
19
小 小结:
TYPE变量的返回值是类型的字节数,
DB为 1,DW为 2,DD为 4,DQ为 8,DT为 10;
TYPE标号的返回值是:
NEAR为 -1,FAR为 -2。
LENGTH变量返回,DUP分配的单元数,对于其他情况则返回 1。
SIZE返回 值是,LENGTH和 TYPE值的乘积,即变量的字节数。