阅读新闻

2007年4月备考三级PC南开100题

[日期:2007-07-22] 来源:  作者: [字体: ]

第十一题:

一、请编制程序,其功能是:以SOURCE开始的内存区域存放着多个字节的数据,其中有压缩BCD码和其他数据。现按下列编码规则进行编码:在第每个压缩BCD码前面加两个字节前缀代码BEHCCH,并在其后加两个字后缀代码DDHEDH;如果不是压缩BCD码,则该数据前后均加两个代码0DH0EH。编码后的数据存放到RESULT指示的内存区域。

例如:

    内存中有  12H,D9H,86H,54H

结果为   BEH,CCH,12H,DDH,EDH,0EH,D9H,0DH,0EH,BEH,

             CCH,86H,DDH,EDH,BEH,CCH,86H,DDH,EDH

部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。

  填空BEGINEND之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGINEND之间原有的代码并自行编程来完成要求的功能。

       对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。

   

    试题程序:

 

         EXTRN    LOAD:FAR,SAVE:FAR

N        EQU      10

STAC    SEGMENT  STACK

         DB       128 DUP(?)

STAC    ENDS

DATA    SEGMENT

SOURCE   DB       N DUP(?)       

RESULT   DB       5*N DUP(0)       

NAME0    DB       'INPUT1.DAT',0

NAME1    DB       'OUTPUT1.DAT',0

DATA    ENDS

CODE    SEGMENT

         ASSUME  CS:CODE,DS:DATA,SS:STAC

START   PROC     FAR

        PUSH     DS

        XOR      AX,AX

        PUSH     AX

        MOV      AX,DATA

        MOV      DS,AX

        MOV      ES,AX                ;置附加段寄存器

        LEA      DX,SOURCE            ;数据区起始地址

        LEA      SI,NAME0             ;原始数据文件名

        MOV      CX,N                 ;字节数

        CALL     LOAD                 ;从'INPUT1.DAT'中读取数据

;****BEGIN****

        LEA      SI,SOURCE

        MOV      DI,OFFSET PDATA      ;PDATA为正数数组存放缓冲区首址

        MOV      CX,N

CLP1:   MOV      AL,[SI]

        MOV      BL,AL

        MOV      AH,AL

        ________________________

        AND      AL,0F0H

        _________________________

        MOV      CL,4

        _________________________

POP      CX

        CMP      ________________

        JA       CLP2

        CMP      AH,9

        JA       CLP2

        MOV      ________________

INC      DI

MOV      BYTE PTR[DI],0CCH

INC      DI

MOV      BYTE PTR[DI],BL

INC      DI

MOV      BYTE PTR[DI],0DDH

INC      DI

MOV      BYTE PTR[DI],0EDH

JMP      CLP3

CLP2:   MOV      BYTE PTR[DI],0DH

        INC      DI

MOV      BYTE PTR[DI],0EH

INC      DI

MOV      BYTE PTR[DI],BL

INC      DI

MOV      BYTE PTR[DI],0DH

INC      DI

MOV      BYTE PTR[DI],0EH

CLP3:   INC      SI

        INC      DI

_________________________

;****END****

        LEA      DX,RESULT      ;结果数据区首址

        LEA      SI,NAME1       ;结果文件名

        MOV      CX,N+2         ;字节数

        CALL     SAVE           ;保存结果到文件

        RET

START   ENDP

CODE    ENDS

        END    START

第十二题:

一、请编制程序,其功能是:内存中连续存放的20个八位无符号数是一个自动抄表仪抄录的20个用户某月的用水量(立方米),为了控制用水量,水费计算公式如下(X表示用水量;Y表示水费,单位为分):

1           Y=X*70        X<=5

2           Y=X*100       5X<=5

3           Y=X*150       X20

例如:

    用水量(X):    04H,    10H,    18H

水费  Y):0118H,0640H,0E10H

试计算出这20个用户应缴纳的水费,结果用字(WORD)表示。

    部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。

  填空BEGINEND之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGINEND之间原有的代码并自行编程来完成要求的功能。

       对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。

   

    试题程序:

 

         EXTRN    LOAD:FAR,SAVE:FAR

N        EQU      20

STAC    SEGMENT  STACK

         DB       128 DUP(?)

STAC    ENDS

DATA    SEGMENT

SOURCE   DB       N DUP(?)       

RESULT   DW       N DUP(0)       

NAME0    DB       'INPUT1.DAT',0

NAME1    DB       'OUTPUT1.DAT',0

DATA    ENDS

CODE    SEGMENT

         ASSUME  CS:CODE,DS:DATA,SS:STAC

START   PROC     FAR

        PUSH     DS

        XOR      AX,AX

        PUSH     AX

        MOV      AX,DATA

        MOV      DS,AX

        LEA      DX,SOURCE            ;数据区起始地址

        LEA      SI,NAME0             ;原始数据文件名

        MOV      CX,N                 ;字节数

        CALL     LOAD                 ;从'INPUT1.DAT'中读取数据

;****BEGIN****

        LEA      SI,SOURCE

        LEA      DI,RESULT

        CLD

        MOV      CX,N

        MOV      BL,70

        MOV      BH,100

        MOV      DL,150

NEXT:   ___________________________

        CMP      AL,5

        J_______ GT5

        ___________________________

        JMP      STORE

GT5:    CMP      AL,20

        J_______ GT20

        ____________________________

        JMP      STORE

GT20:   ____________________________

STORE:  MOV      [DI],AX

        ____________________________

        ____________________________

        LOOP     NEXT

;****END****

        LEA      DX,RESULT      ;结果数据区首址

        LEA      SI,NAME1       ;结果文件名

        MOV      CX,N*2         ;字节数

        CALL     SAVE           ;保存结果到文件

        RET

START   ENDP

CODE    ENDS

        END    START

 

 

第十三题:

一、请编制程序,其功能是:内存中连续存放的20个八位无符号数是一个自动抄表仪抄录的20个用户某月的用水量(立方米),为了控制用水量,水费计算公式如下(X表示用水量;Y表示水费,单位为分):

a     Y=X*70                               X<=5

b     Y=10*70+X-10*120       X10

例如:

    用水量(X):    04H,    0FH,    18H

水费  Y):0118H,0514H,094CH

试计算出这20个用户应缴纳的水费,结果用字(WORD)表示。

    部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。

  填空BEGINEND之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGINEND之间原有的代码并自行编程来完成要求的功能。

       对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。

   

    试题程序:

 

         EXTRN    LOAD:FAR,SAVE:FAR

N        EQU      20

RATE1    EQU      70

RATE2    EQU      120

DELTA    EQU      10

STAC    SEGMENT  STACK

         DB       128 DUP(?)

STAC    ENDS

DATA    SEGMENT

SOURCE   DB       N DUP(?)       

RESULT   DW       N DUP(0)       

NAME0    DB       'INPUT1.DAT',0

NAME1    DB       'OUTPUT1.DAT',0

DATA    ENDS

CODE    SEGMENT

         ASSUME  CS:CODE,DS:DATA,SS:STAC

START   PROC     FAR

        PUSH     DS

        XOR      AX,AX

        PUSH     AX

        MOV      AX,DATA

        MOV      DS,AX

        LEA      DX,SOURCE            ;数据区起始地址

        LEA      SI,NAME0             ;原始数据文件名

        MOV      CX,N                 ;字节数

        CALL     LOAD                 ;从'INPUT1.DAT'中读取数据

;****BEGIN****

        LEA      SI,SOURCE

        LEA      DI,RESULT

        CLD

        MOV      CX,N

        MOV      BL,RATE1

        MOV      BH,RATE2

NEXT:   ___________________________

        CMP      AL,DELTA

        J_______ GREAT

        MUL      BL

        JMP      STORE

GREAT:  ___________________________

MUL      BH

___________________________

STORE:  ___________________________

        ___________________________

        INC      SI

        LOOP     NEXT

;****END****

        LEA      DX,RESULT      ;结果数据区首址

        LEA      SI,NAME1       ;结果文件名

        MOV      CX,N*2         ;字节数

        CALL     SAVE           ;保存结果到文件

        RET

START   ENDP

CODE    ENDS

        END    START

 

 

第十四题:

一、请编制程序,其功能是:对一个由可打印ASCII字符(ASCII20H~7FH)组成的字符串可采用下列方法进行压缩:从串首开始向后扫描,如某字符单独出现该字符不变,如某字符连续出现n次,则该字符用ESC1BH),n<原字符>三个字节来代替(假定n不超过255)。

例如:

    原串:     41H,43H,43H,43H,43H,43H,43H,61H,00H(“ACCCCCCa”)

    压缩后:   41H,1BH,06H,43H,61H,00H

    设内存中从SOURCE开始有一字符串,其以00H结束,长度不超过100。试编程对其进行压缩,结果存入RESULT开始的内存单元。   

部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。

  填空BEGINEND之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGINEND之间原有的代码并自行编程来完成要求的功能。

    对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。

   

    试题程序:

 

         EXTRN    LOAD:FAR,SAVE:FAR

N        EQU      100

ESC_CODE EQU      27

STAC    SEGMENT  STACK

         DB       128 DUP(?)

STAC    ENDS

DATA    SEGMENT

SOURCE   DB       N DUP(?)       

RESULT   DB       N DUP(0)       

NAME0    DB       'INPUT1.DAT',0

NAME1    DB       'OUTPUT1.DAT',0

DATA    ENDS

CODE    SEGMENT

         ASSUME  CS:CODE,DS:DATA,SS:STAC

START   PROC     FAR

        PUSH     DS

        XOR      AX,AX

        PUSH     AX

        MOV      AX,DATA

        MOV      DS,AX

        MOV      ES,AX                ;置附加段寄存器

        LEA      DX,SOURCE            ;数据区起始地址

        LEA      SI,NAME0             ;原始数据文件名

        MOV      CX,N                 ;字节数

        CALL     LOAD                 ;从'INPUT1.DAT'中读取数据

;****BEGIN****

        LEA      SI,SOURCE

        LEA      DI,RESULT

        CLD

        INC      DI

L0:     ___________________________

        CMP      AL,0

        JE       QUIT

        MOV      CX,OFFFFH             ;SET THE COUNTER TO 0FFFFH

        ___________________________    ;字符串重复搜索,CX=0FFFFH-n

        NEG      CX                    ;10000H-CX→CX

        ___________________________    ;获得重复次数n

        CMP      CX,1

        J_______ COMPRESS

        MOV      [SI],AL

        INC      SI

        JMP      __________________

COMPRESS: 

MOV     [SI],BYTE PTR ESC_CODE

        MOV     [SI+1],CL

        MOV     [SI+2],AL

        ___________________________

        JMP      L0

QUIT:   MOV      [SI],AL        ;STORE THE ‘00H’

;****END****

        LEA      DX,RESULT      ;结果数据区首址

        LEA      SI,NAME1       ;结果文件名

        MOV      CX,N           ;字节数

        CALL     SAVE           ;保存结果到文件

        RET

START   ENDP

CODE    ENDS

        END    START

 

 

第十五题:

一、请编制程序,其功能是:对一个由可打印ASCII字符(ASCII20H~7FH)组成的字符串可采用下列方法进行压缩:从串首开始向后扫描,如某字符单独出现该字符不变,如某字符连续出现n次,则该字符用ESC1BH),n<原字符>三个字节来代替(假定n不超过255)。

例如:

设内存中从SOURCE开始有一用上述方法压缩的字符串,其以00H结束,长度不超过100。试编程对其进行解压缩,结果存入RESULT开始的内存单元。 

    原串:     41H,1BH,06H,43H,61H,00H

    解压后:   41H,43H,43H,43H,43H,43H,43H,61H,00H(“ACCCCCCa”)

    部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE