接口技术第4章(4.6)模块化程序设计技术PPT课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3. 多个模块的组合形式
NONE 表示本段为独立段,不与其他模块段发生连接逻辑。
PUBLIC 表示将本段与其他模块中说明为PUBLIC的同名段邻接
在一起,共用一个段地址。组成一个大的物理段(“段组”)。
STACK 表示将该段与其他同名的堆栈段连接在一起,组合后
的物理段的长度等于参与组合的各堆栈段的长度之和。
;送累加和 BX
;模块B
文件名SUB. ASM
EXTRN
DEC—NUM:WORD,KEY—IN:FAR
PUBLIC
PROMPT,BINHEX
SSEG
SEGMENT PARA STACK ‘ STACK ’
DB 200 DUP ( ?)
SSEG
ENDS
DSEG2
ENDS
CSEG2
SEGMENT PARA
DEC CX MOV AL,[SI] COMP: CMP AL,[SI+1]
JG BIGGER MOV AL,[SI+1] MOV DL,DH BIGGER: INC SI
INC DH
LOOP COMP ASSUME DS:DATA2 MOV BX,DATA2 MOV DS,BX MOV MAX,AL MOV PLACE,DL
COUNT EQU $ —ARRAY
;数据个数
DATA1 ENDS
CODE SEGMENT WORD PUBLIC ‘CODE ’
ASSUME CS:CODE,DS:DATA1
MAIN: MOV AX,DATA1
MOV DS,AX
;装入段基址
MOV CX,COUNT
LEA SI,ARRAY
CALL FOUND ;找出最大元素及位置
SSEG ENDS
DSEG1 SEGMENT
DEC—NUM DW ?
DSEG1 ENDS
CSEG1 SEGMENT
ASSUME CS:CSEG1,DS:DSEG1
START: MOV AX,DSEG1
MOV DS,AX
;装入段基址
PUSH DS
JMP FAR PTR PROMPT
KEY—IN: CALL DECBIN
;键盘输入十进制数
MOV DEC—NUM,BX ;二进制数DEC—NUM
CALL FAR PTR BINHEX ;以十六进制形式显示
MOV AH,4CH
INT 21H
;返回DOS
;从键盘输入十进制数,将其转换为二进制数并送BX
DECBIN GETCHAR:
EXIT: DECBIN CSEG1
PROC MOV MOV INT SUB JL CMP JG MOV XCHG MOV MUL XCHG ADD JMP RET ENDP ENDS END
RET
例1; D_SEG W X Y Z RESULT D_SEG S_SEG S_SEG C_SEG START:
ASSUME CS:CSEG2,DS:DSEG2
PROMPT: MOV AX,DSEG2
MOV DS,AX
;装入段基址
LEA
DX,MSG
MOV AH,09H
INT
21H
POP DS
JMP
FAR PTR KEY—IN
;将DEC—NUM中的二进制数转换为十六进制数的ASCIIHale Waihona Puke Baidu码并输出
BINHEX
PROC FAR
例1:键盘输入十进制数,以十六进制形式在屏幕上
显示。
;模块A 文件名MAIN. ASM
EXTRN PROMPT:FAR,BINHEX:FAR ;引用外部符号
PUBLIC DEC—NUM,KEY—IN
;定义外部符号
SSEG SEGMENT PARA STACK ‘ STACK ’
DB 100 DUP( ?)
MOV AH,4CH
INT 21H
CODE ENDS
END MAIN
;模块B,文件名SUB.ASM
PUBLIC FOUND
DATA2 SEGMENT
MAX
DB ?
PLACE DB ?
DATA2 ENDS
CODE SEGMENT WORD PUBLIC ‘CODE ’
ASSUME CS:CODE
FOUND PROC NEAR MOV DH,1 MOV DL,0
COMMON 各模块中由COMMON方式说明的同名段重叠覆
盖,重叠部分的内容取决于参与覆盖的最后一个段的内容,复合 段的长度等于参与覆盖的最长的段的长度。
MEMORY 表示该段将位于被链接在一起的其他段之上(高地
址处),如果链接时出现多个段有MEMORY组合类型,将对第 一个MEMORY的段赋予这一属性,其他段作COMMON段处理。
NEAR BX,0 AH,1 21H AL,30H EXIT AL,09H EXIT AH,0 AX,BX CX,0AH CX AX,BX BX,AX GETCHAR
START
;累加和BX(已转换的二进制)初始化
;键入值是否在0~9之间? ;否,转至EXIT
;是,将AX中的BCD数与BX内容交换 ;累加和AX乘以当前权值
;否,再加上07H
PRINTIT:
MOV
DL,AL
;输出单个字符
MOV
AH,02H
INT
21H
DEC
CH
JNZ
ROTATE
;继续下次转换
RET
BINHEX
ENDP
CSEG2
ENDS
END
例2:求无序表中的最大元素及其位置
;模块A, 文件名MAIN.ASM
EXTRN FOUND:NEAR
DATA1 SEGMENT… ARRAY DB d1,d2,d3, … dn
4.6模块化程序设计技术
1. 全局符号的定义与引用 单个模块中使用的符号(变量、标号或子程序名)为 局部符号。一个模块中定义的符号如不另加说明,均 为局部符号,局部符号只能在定义它的模块中使用。
多个模块可共同使用的符号为全局符号。只要将局部 符号在定义和使用它的模块中分别用 PUBLIC 和 EXTRN语句说明,即可作为全局符号(又称外部符号) 使用,全局符号构成了模块间通信的主要渠道。 2. 模块间的转移 模块间的转移有两种:近(段内)转移和远(段间) 转移。它们都是通过转移语句来实现的。具体实现转 移的语句是:JMP、CALL 和 INT。
MOV
BX,DEC—NUM
MOV
CH,04H
;共有4位十六进制数
ROTATE:
MOV
CL,04H
ROL
BX,CL
;取最4bit二进制数待转换
MOV
AL,BL
AND
AL,0FH
ADD
AL,30H
;十六进制数 ASCII码
CMP
AL,3AH
;十六进制数在0~9之间吗?
JL
PRINTIT
;是,输出
ADD
AL,07H
相关文档
最新文档