当前位置:
文档之家› 第八章汇编语言高级编程技巧PPT课件
第八章汇编语言高级编程技巧PPT课件
CODE SUBM
SUBM CODE
PRICE:WORD,QTY:WORD,TOTAL:DWORD
SUBM
SEGMENT
PROC FAR
ASSUME CS:CODE
...
MOV AX,PRICE
MUL QTY
MOV word ptr TOTAL,AX
MOV word ptr TOTAL+2,DX
...
主模块
模块A
模块B
模块D
模块C
模块E
图8-1 模块的层次结构
模块C
8.1.1 模块通信
1.外部引用与全局符号说明
例.实现PRICE×QTY=TOTAL的功能。要求由 两个模块实现,其中主模块给出数据,子模 块实现两数相乘。
主模块PRICEM.ASM
DATA SEGMENT
PRICE DW 60
汇编语言程序设计
第八章 汇编语言高级编程技巧
8.1 模块化程序设计
8.2 汇编语言程序与高级语言程序的连接 8.3 使用DOS EXEC功能执行程序 8.4 TSR程序设计
8.1 模块化程序设计
软件工程开发包括以下步骤:
① 系统分析; ② 系统设计; ③ 细化各模块的功能、确定模块间的关系及通信方 法; ④ 完成各模块的程序编码及模块调试; ⑤ 连接多个模块组成大系统; ⑥ 调试大系统; ⑦ 系统维护。
EXTRN PUBLIC
… data PRICE QTY TOTAL data
SUBM:FAR TOTAL
segment
DW 60
DW 80
DD ?
ends
…
MOV AX,PRICE
MOV DX,QTY
CALL FAR PTR SUBM
…
end
main
可以把程序8.1b改为:
EXTRN PUBLIC
程序8.2a(主程序):
EXTRN SUBM:FAR STACKSG SEGMENT STACK 'STK'
DW 32 DUP('S') STACKSG ENDS DATA SEGMENT COMMON PRICE DW 60 QTY DW 80 TOTAL DD ? DATA ENDS
CODE MAIN
TOTAL:DWORD SUBM
… MUL DX MOV word ptr TOTAL,AX MOV word ptr TOTAL+2,DX
… END
8.1.2 模块连接
一个程序可以由若干个模块组成,一个 模块又可以包含多个段,这些模块经过分别 调试后,最终要组装到一起,形成一个大系 统。
一、多模块程序设计上机步骤
EXTRN SUBM:FAR PUBLIC PRICE,QTY,TOTAL stacksg segment stack 'stk'
dw 32 dup('s') stacksg ends data segment PRICE DW 60 QTY DW 80 TOTAL DD ? data ends
code segment
RET
ENDP
返回
ENDS
END
2. 使用公用数据段实现过程通信
COMMON功能:告诉连接程序把多个同名数据段 在连接时重叠形成一个段,产生段覆盖。
说明:具有COMMON组合类型的最长段决定了公共段
的长度,重叠部分的内容取决于连接时最后一个公 共段的内容。
例8.2 实现例8.1的功能,但使用公用数据段实 现过程通信,见程序8.2。
格式:EXTRN 名字:类型[,...] 注意:EXTRN伪指令应该出现在引用该名字之前,一般
放在程序的开头。
(2)全局符号说明伪指令PUBLIC
格式:PUBLIC 名字[,...] 例8.1 实现PRICE×QTY=TOTAL的功能。其中数据定义
和乘法实现分别在两个模块中。程序见程序8.1。
程序8.1a 主模块PRICEM.ASM
MAIN CODE
SEGMENT PROC FAR ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX CALL FAR PTR SUBM MOV AX,4C00H INT 21H ENDP ENDS END MAIN
程序8.2b(子程序)
PUBLIC DATA PRICE QTY TOTAL REM DATA
SUBM SEGMENT COMMON DW 80 DW 60 DD ? DB‘123’ ENDS
;局部变量
CODE SUBM
SEGMENT PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS PUSH AX PUSH DX MOV AX,DATA MOV DS,AX
SUBM CODE
子模块PRICES.ASM
CODE SUBM
SUBM CODE
SEGMENT PROC FAR ASSUME CS:CODE MOV AX,PRICE MUL QTY MOV WORD PTR TOTAL,AX MOV WORD PTR TOTAL+2,DX RET ENDP ENDS END
(1)外部引用伪指令EXTRN
main proc far
assume cs:code,ds:data
mov ax,data
mov ds,ax
CALL FAR PTR SUBM
MOV AX,4C00H
INT 21H
main endp
code ends
end main
返回
程序8.1b 子模块PRICES.ASM
EXTRN PUBLIC
MOV AX,PRICE
MUL QTY
MOV WORD PTR TOTAL,AX
MOV WORD PTR TOTAL+2,DX
POP DX
POP AX
POP DS
RET
ENDP
ENDS
END
返回
3.使用寄存器或堆栈实现过程通信
在模块化程序设计中,也可以使用寄存器 或堆栈传递参数或参数地址,从而实现过程通 信。例如,通过AX、DX寄存器把PRICE和QTY的 值传递给子程序实现过程通信。
QTY
DS
CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR
MOV AX,DATA MOV DS,AX CALL FAR PTR SUBM MOV AX,4C00H INT 21H MAIN ENDP CODE ENDS END MAIN
以程序8.1的PRICEM.ASM和PRICES.ASM两个独立模块为 例,讨论多模块程序设计上机步骤。