您的位置: 网站首页 > 程序开发 > 汇编语言与微机原理教程 > 第10章 宏汇编语言 > 【10.5 本 章 小 结】

10.5 本 章 小 结

 

10.5  本 章 小 结

本章主要介绍了宏汇编语言的格式、表达式,常规运算,并简要介绍了BIOS和DOS功能调用,常用的DOS系统功能调用。

10.6  练  习  题

1.填空题

(1)假设DST DW 1234H,5678H,执行LES DI,DWORD PTR DST 指令后,(DI)=        。

(2)阅读下面的源程序:

DSEG    SEGMENT

DB      -1

ARRAY   DB  4,6,13,18,0

X       EQU  2

LEN     EQU  $-ARRAY

DSEG    ENDS

SSEG    SEGMENT   STACK

DB      256 DUP(0)

SSEG    ENDS

CSEG    SEGMENT

ASSUME  CS:CSEG,DS:DSEG,SS:SSEG

START   PROC  FAR

PUSH    DS

XOR     AX,AX

PUSH    AX

MOV     AX,DSEG

MOV     DS,AX

MOV     AL,X

MOV     BX,OFFSET ARRAY

MOV     SI,LEN-2 ;设置指向ARRAY+3字节单元的指针        

ADD     BX,SI ;形成基地址

MOV     SI,0

LP:     CMP  AL,[BX+SI]

JGE     INS

MOV     DI,[BX+SI]

MOV     [BX+SI+1],DI ;移动数据

DEC     SI

JMP     LP

INS:   MOV   [BX+SI+1],AL

RET

START  ENDP

CSEG   ENDS

END    START                               

上面的程序执行结束后,ARRAY字节单元中的数据是      。

(3)根据下列指令序列,CX寄存器中的值是      。

SHR1  DW  'AB'

SHR2  DB 16 DUP(?)

CNT   EQU  $-STR1

MOV   CX,CNT

(4)某程序的数据段定义如下,请填写完整。

    DATA     SEGMENT

    TAB      DB  'MICROSOFT'

DB  'MS-DOS 6.22'

DW   1234 

DB  'IBMPS/2'

    TABLEN EQU           ;数据长度

    DATA ENDS

(5)执行下面的程序段后,AL中的内容是      。

BUF DW 2152H,3416H,5731H,4684H

MOV BX,OFFSET BUF

MOV AL,3

XLAT

2.选择题

(1)      是一种将指令及其处理的对象以便于记忆的助记符表示的计算机语言。

A.机器语言               B.汇编语言        C.高级语言        D.人工智能语言

(2)若定义DAT DB '1234',执行指令MOV AX,WORD PTR DAT后,AX寄存器中的内容是      。

A.1234H                   B.3412H             C.3132H             D.3231H

(3)若汇编语言程序的宏定义中使用了标号,则该标号必须使用下列      伪指令予以说明。

A.LOCAL                 B.PUBLIC          C.EXTRN           D.LABEL

(4)下面的程序段

DAT     DB      1,2,3,4

        MOV     AL,0

        MOV     CX,4

        MOV     SI,3

LP:     ADD    AL,DAT[SI]

        DEC    SI

        LOOP   LP

        HLT

执行结束后,AL和CX寄存器中的内容分别是      。

A.4和3                    B.7和2              C.9和1                     D.10和0

(5)执行下面的程序段后,102H单元中的数据是      。

ORG 100H

DAT DB   12H,13H,14H

MOV BX, OFFSET DAT

INC BYTE PTR [BX]

INC BX

DEC BYTE PTR [BX]

HLT

A.15H                      B.12H                C.13H                       D.14H

3.上机操作题

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

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

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

(1)试编制程序,其功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。假设数组元素均为正数。

例如:将02H插入数组01H,03H,04H,05H…,结果为01H,02H,03H,04H,05H…。

            EXTRN    LOAD:FAR,SAVE:FAR

N           EQU      10                 

DSEG        SEGMENT

MIN         DB       -1

SOURCE      DB       N DUP(?)           

X           EQU      2                   ;插入的个数

RESULT      DB       N DUP(0)

NAME0       DB       'INPUT1.DAT',0

NAME1       DB       'OUTPUT1.DAT',0

DSEG        ENDS

SSEG        SEGMENT  STACK

            DB       256 DUP(?)

SSEG        ENDS

CSEG        SEGMENT

            ASSUME  CS:CSEG,SS:SSEG,DS:DSEG

START       PROC     FAR

            PUSH     DS

            XOR      AX,AX

            PUSH     AX

            MOV      AX,DSEG

            MOV      DS,AX

            MOV      ES,AX

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

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

            MOV      CX,N                ;字节数

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

;****BEGIN****

            LEA      BX,SOURCE

            MOV      SI,N-2

            ADD      BX,SI

MOV     SI,0

MOV     AL,X

LP:         CMP              ,[BX+SI]

            JGE      INS

            MOV      DL,[BX+SI]

            MOV      [BX+SI+1],       

            DEC                              

            JMP      LP

INS:            MOV                      ,AL

            CLD

LEA         SOURCE

LEA         RESULT

MOV     CX,N

         MOVSB

;****END****

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

            LEA      SI,NAME1            ; 结果文件名

            MOV      CX,N                ; 字节数

            CALL     SAVE                ; 保存结果到文件

            RET

START       ENDP

CSEG        ENDS

            END    START

(2)试编制程序,其功能是:对内存中存放的6组带符号16位二进制数(每组由3个数组成,均不为零)进行处理。处理方法为:当每组中负数多于正数时,将组内负数变成正数(但绝对值不变,下同),组内正数不变;反之,将组内正数变成负数,组内负数不变;变换好的数按原序存放在内存中。

例如:

内存中有0003H,0001H,0002H,0003H,0004H,FFFFH,FFFEH,FFFDH,0001H,FFFEH,

FFFDH,FFFFH…(共6组18个数),结果为FFFDH,FFFFH,FFEH,FFFDH,FFFCH,FFFFH,

0002H,0003H,0001H,0002H,0003,0001H…(共18个数)。

 

            EXTRN   LOAD:FAR,SAVE:FAR

N           EQU     18

STAC        SEGMENTSTACK

            DB      128 DUP(?)

STAC        ENDS

DATA        SEGMENT

SOURCE      DW      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*2              ; 字节数

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

;****BEGIN****

            MOV      SI,0

            MOV      DI,0

            MOV      BX,6

REPT1:      MOV      DX,0

                             

CAMP:       MOV      AX,SOURCE[SI]

                              

CMP     AX,0

JL          CONT

JMP         NEXT

CONT:       INC      DX

NEXT:       LOOP     CAMP

SUB         SI,6

MOV     CX,3

CMP     DX,2

JAE         NEG1

             NEXT1

NEG1:       MOV      AX,SOURCE[SI]

                             

CMP     AX,0

JL          NEG2

JMP         NOTNEG

NEG2:                         

NOTNEG: MOV      RESULT[DI],AX

                             

LOOP        NEG1

JMP         NEXT2

NEXT1:      MOV      AX,SOURCE[SI]

                             

CMP     AX,0

JG          NEG3

JMP         NOTNEG1

NEG3:       NEG      AX

NOTNEG1:MOV      RESULT[DI],AX

                              

LOOP        NEXT1

NEXT2:      DEC      BX

            JZ       EXIT

                                 

EXIT:       NOP

;****END****

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

            LEA      SI,NAME1            ; 结果文件名

            MOV      CX,N*2              ; 字节数

            CALL     SAVE                ; 保存结果到文件

            RET

START       ENDP

CODE        ENDS

            END    START

(3)试编制程序,其功能是:将内存中的20个有符号字节数据依次除以5,并按照四舍五入原则(即余数绝对值的2倍小于除数,则舍去)将商存入指定的内存区域。

例如:

内存中有10H,01H,27H,00H,FFH,F8H…,结果为03H,00H,08H,00H,00H,FEH…。

            EXTRN    LOAD:FAR,SAVE:FAR

N           EQU      20

X           EQU      5

DSEG        SEGMENT

SOURCE      DB       N DUP(?)     

RESULT      DB       N DUP(0)     

NAME0       DB       'INPUT1.DAT',0

NAME1       DB       'OUTPUT1.DAT',0

DSEG        ENDS

SSEG        SEGMENT  STACK

            DB       256 DUP(?)

SSEG        ENDS

 

CSEG        SEGMENT

            ASSUME  CS:CSEG,SS:SSEG,DS:DSEG

START       PROC     FAR

            PUSH     DS

            XOR      AX,AX

            PUSH     AX

            MOV      AX,DSEG

            MOV      DS,AX

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

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

            MOV      CX,N                ; 字节数

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

;****BEGIN****

            LEA      SI,SOURCE

            LEA      DI,RESULT

CONT:       LODSB

CBW

MOV     DL,X

IDIV        DL

                             

JNS         PLUS

                              

ADD     AH,AH

CMP     AH,DL

JB                            

SUB         AL,1

JMP         NEXT

PLUS:       ADD                            

            CMP      AH,DL

            JB       NEXT

                                       

NEXT:       CMP      SI,N

JB          CONT

;****END****

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

            LEA      SI,NAME1            ; 结果文件名

            MOV      CX,N                ; 结果字节数

            CALL     SAVE                ; 保存结果到文件

            RET

START       ENDP

CSEG        ENDS

            END    START