您的位置: 网站首页 > 程序开发 > 汇编语言与微机原理教程 > 第9章 80x86的寻址方式与指令系统 > 【9.4 本 章 小 结】

9.4 本 章 小 结

 

9.4  本 章 小 结

本章介绍了计算机指令的格式、微机的寻址方式,重点介绍了80x86指令系统的多种指令。

9.5  练  习  题

1.填空题

(1)假设(AL)=26H,(BL)=55H,依次执行ADD AL,BL和DAA指令后,(AL)=          。

(2)在MOV WORD PTR[0072],55AAH的指令的机器代码中,最后一个字符内容是          。

(3)MOV SI,[BX]指令形成源操作数的物理地址时,默认的段寄存器是          。

(4)假设AL寄存器中的内容是7FH,执行指令ADD AL,2后,符号标志SF和进位标志CF的状态分别是          。

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

(6)假设(SP)=0100H,(SS)=2000H,执行PUSH BX指令后,栈顶的物理地址是          。

2.选择题

(1)        都属于计算机的低级语言。

A.机器语言和高级语言                           B.机器语言和汇编语言

C.汇编语言和高级语言                           D.高级语言和数据库语言

(2)REPZ指令作为下面哪一条串操作指令的前缀时才能完全发挥它的功能        。

A.MOVSB                  B.STOSB            C.LODSW                 D.CMPSW

(3)执行下面的程序段后,AL寄存器中的内容应该是        。

     MOV  AL,03H

     MOV  BL,09H

     SUB  AL,BL

     AAS

A.0FAH               B.04H                       C.06H                       D.86H

(4)假设VAR为变量,指令MOV  BX,OFFSET  VAR的寻址方式是        。

A.直接寻址                B.间接寻址        C.立即寻址               D.存储器寻址

(5)若X和Y均为无符号整数,且X≤Y,则依次执行MOV AX,X和CMP AX,Y指令后,标志位CF和ZF的状态是        。

A.CF=0且ZF=0                                      B.CF=1且ZF=1

C.CF=0或ZF=0                                      D.CF=1或ZF=1

(6)假设AL寄存器的内容是ASCII码表示的一个英文字母,若为大写字母,将其转换为小写字母,否则不变。下面        指令可以实现此功能。

A.ADD AL,20H                                      B.OR AL,20H

C.ADD AL,'a'-'A'                                     D.XOR AL,2

(7)下列指令中有语法错误的是        。

A.SHL AX,CL                                         B.MOV AX,[DX]

C.OUT DX,AL                                        D.MOV EAX,[EDX]

3.上机操作题

(1)试编制程序,其功能是:内存中共有30个字节型数据,找出其中的两个ASCII字符串并进行校验。欲寻找的ASCII字符串由13个字符组成:#(23H)、7个ASCII字符、*(2AH)、2个ASCII字符、回车符(0DH)、换行符(0AH)。

校验方法为:对字符#及字符*之间的7个ASCII字符进行异或操作,若异或操作结果的ASCII字符表示(异或操作结果高4位的ASCII字符表示在前,低4位的ASCII字符表示在后)与原字符串中字符*之后的两个ASCII字符相同,则将原字符串原样保存;反之,则将原字符串中的所有字符(共13个)均用字符!(21H)代替。

例如:

内存中有33H,35H,23H(‘#’,第一个字符串开始),46H,41H,30H,2EH,34H,3DH,31H,2AH(‘*’),32H,31H,0DH,0AH,46H,23H(‘#’,第二个字符串开始),46H,41H,30H,2EH,34H,3DH,

30H,2AH(‘*’),32H,31H,0DH,0AH,55H, 结果为23H,46H,41H,30H,2EH,34H,3DH,31H,2AH(‘*’),32H,31H(校验正确,该字符串原样保持), 0DH,0AH,21H,21H,21H,21H,21H,21H,21H,

21H,21H,21H,21H,21H,21H(校验错,整个字符串用字符!代替)。

            EXTRN       LOAD:FAR,SAVE:FAR

N           EQU     26

STAC        SEGMENTSTACK

            DB          128 DUP(?)

STAC        ENDS

DATA        SEGMENT

SOURCE      DB       N+4 DUP(?)       

RESULT      DB       N DUP(0)

HH          DB       2 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+4              ; 字节数

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

;****BEGIN****

            MOV      SI,0

            MOV      DI,0

            MOV      BX,2                ; 两个ASCII字符串

REPEAT: MOV      AH,0

SEARCH: MOV      AL,SOURCE[SI]

INC      SI

CMP      AL,'#'

          SEARCH

MOV      RESULT[DI],AL

INC      DI

SEARCH1:MOV      AL,SOURCE[SI]

            INC      SI

            CMP      AL,          

            JE       ASCII

            MOV      RESULT[DI],AL

            INC      DI

            XOR      AH,AL

            JMP                        

ASCII:  MOV      RESULT[DI],AL

INC      DI

PUSH     DI

MOV      DI,0

MOV      DH,2

MOV      DL,AH               ; 异或结果暂存在DL中

MOV      CL,4                ; 先将异或结果高4位转换成ASCII字符

SHR      AH,CL               ; 本行开始的4行语句将一个十六进制数转换为ASCII码

CHANGE: CMP      AH,10

JL       ADD_0

ADD      AH,’A’-’0’-10

ADD_0:  ADD      AH,’0’

MOV      HH[DI],AH

INC      DI

DEC      DH

JZ       EXT

MOV      AH,DL               ; 再将异或结果低4位转换成ASCII字符

AND      AH,0FH

JMP      CHANGE

EXT:    POP      DI

MOV      AL,SOURCE[SI]

MOV      RESULT[DI],AL

INC      SI

INC      DI

MOV      AH,SOURCE[SI]

MOV      RESULT[DI],AH

INC      SI

INC      DI

MOV      DL,HH

MOV      DH,HH+1

CMP      AX,DX

          ERR

MOV      AL,0DH              ; 校验正确

MOV      RESULT[DI],AL

INC      DI

MOV      AL,0AH

MOV      RESULT[DI],AL

INC      DI

JMP      LP

ERR:    SUB      DI,11       ; 校验错误

MOV      AL,'!'

MOV      CX,                 

COVER:  MOV      RESULT[DI],AL

INC      DI

LOOP     COVER

LP:                               

JZ       EXIT

JMP      REPEAT

EXIT:   NOP

;****END****

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

            LEA      SI,NAME1    ; 结果文件名

            MOV      CX,N        ; 字节数

            CALL     SAVE        ; 保存结果到文件

            RET

START   ENDP

CODE    ENDS

            END    START

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

                     Y=X*70                        X<=5

                     Y=X*100                      5<X<=20

                     Y=X*150                      X>20

例如:

用水量(X)为04H, 10H, 18H…,水费(Y)为0118H,0640H,0E10H…。

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

            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

(3)试编制程序,其功能是:一个故障报警系统连续集20个字节数据存于SOURCE开始的内存区域,如果数据字节中有二进制位0(0代表有故障),则记录该数据字节中0的个数,并按数据字节在前,0的个数在后的顺序存放到RESULT开始的内存区域。

例如:

内存中有FEH,90H,FFH,DDH…,结果为FEH,01H,90H,06H,FFH,00H,DDH,02H…。

            EXTRN    LOAD:FAR,SAVE:FAR

N           EQU      20

ESC_CODE EQU      27

STAC        SEGMENT  STACK

            DB       128 DUP(?)

STAC        ENDS

DATA        SEGMENT

SOURCE      DB       N DUP(?)       

RESULT      DB       N*2 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 RESULT

            CLD

            MOV      DL,N

LP1:                                     ; 字节数计数器DL

            MOV      [DI],AL

            MOV      CX,                         

MOV     DH,0

LP2:                       AL,1

JC                               

INC         DH

LP3:                       LP2

INC         DI

MOV     [DI],                    

                              

                             

            JNZ                                

;****END****

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

            LEA      SI,NAME1        ; 结果文件名

            MOV      CX,N*2          ; 字节数

            CALL     SAVE            ; 保存结果到文件

            RET

START       ENDP

CODE        ENDS

            END    START