试题详情
简答题设计一个程序:其功能是对被测试字中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 中。
  • 关注下方微信公众号,在线模考后查看

热门试题