简答题
设计一个程序:其功能是对被测试字中1的个数进行计数。本例作为子程序设计的一个例子,是程序与子程序不在一个代码段,和调用程序与子程序在一个代码段这两种情况都具备的应用实例,也是一个子程序嵌套结构的实例。
正确答案
;源模块 1
PUBIC TWORD ,MASKS ;可供外部使用的公共变量及数据
EXTRN WCNTIS :FAR,OPSYS:FAR ;用到的外部子程序及外部过程
STACK SEGMENT STACK ;堆栈段
DW 32 DUP(?) ;堆栈区
STKE LABEL WORD
STACK ENDS
MAIND SEGMENT ;数据段
MASKS DB 80H ,40H,20H,10H,08H,04H,02H,01H;测试用的屏蔽字
TWORD DW 27A9H ;被测试数
MAIND ENDS
MAINC SEGMENT PUBIC ;主程序码段
MCS:MAINC ,DS:MAIND ,SS:STACK,ES:MAIND 。
MAIN : MOV AX ,STACK ;堆栈段寄存器初始化
MOV SS,AX
MOV SP,OFFSET STKE ;堆栈格外初始化
MOV AX ,MAIND ;数据段初始化
MOV DS,AX
MOV ES,AX ;附加段初始他
CALL FAR PTR WCNTIS ;调用计算 1 个数的外部子程序
CALL FAR PTR OPSYS ;调用返回报作系统的外部过程
MAINC ENDS
END MAIN
;原模块 2
;子程序目的: WCNT 是计等一个字中 1 的个数
;出 口:AX 中放该字的 1 的个数
;所门用于程序: 调用 2 次计等一个字节中 1 个数的手程序 WCNTIS.调用前将
阿 AX 中数分为高低两字节
PUBIC WCNTIS ;可供外部使用的干程序
EXTRN TWORD :WORD,MASKS :BYTE ;用到的外都变量及数据
M SEGMENT PARA STACK ‘STACK’
DB 20 DUP(?)
CNTSEG SEGMENT PUBLIN ;子程序码段
ASSUME CS:CNTSEG,SS:STACK;这里 CS 被赋予新值
WCNTIS PROC FAR ;子程序 WCNTIS 开始
MOV AX ,TWORD ;取入被测试数
CALL NEAR PTR BCNTIS ;计算 AL 中 1 的个数,结果在 CX 中
PUSH CX ;1 的个数人栈
M0V AL ,AH
CALL NEAR PTR BCNTS ;计算 AH 中 1 的个数
POP AX ;取出低字节 1 个数
ADD AX ,CX ;加上高字节 1 个数
RET ;返回
WCNIS ENDP ;子程序 WCNIS 结束
BCNTIS PROC NEAR ;子程序 BCNTIS 开始
;子程序目的:计算字节中 1 的个数
;人口:字节数在 AL 中
;出口: 1 的个数在 CX 中
MOV CX ,0 ;初始化
MOV SI,0 ;第一个选位字节的变址
BL00P:TEST AL,MASKS[SI] ;测试 1 位
JZ BNEXT ;为零,转移
INC CL ;为 1,计数加 1
BNEXT: INC SI ;指向下一位
CMP SI,8 ;测试完?
JNE BL00P ;否,继续
RET ;是,返回
BCNIS ENDP
CNG ENDS
END
;源模块 3
PUBIC OPSYS ;可供外部使用的公共过程
CODE SEGMENT PUBIC
ASSUME CS:CODE
OPSYS PROC FAR
MOV AH ,4CH ;返回 DOS
INT 21H
RET
OPSY END
CODE ENDS
END
被测试字 TWORD 被取入 AX 中,主程序 MAIN 调用于程序 WCNTIS 以计数 AX中 1 的个数 WCNTIS 又调用于程序 BCNTIS 两次, BCNIS 为计数字节中 1 个数的子程序,最后结果在 CX 中。