您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《微计算机原理》 > 第4章 汇编语言程序设计

第8节 自测题

 

自测题

1 程序在数据段中定义的数组如下:
  NAMES DB 'TOM.',20
     DB 'ROSE.',30
     DB 'KATE.',25
  请指出下列指令是否正确,为什么?
   (1) MOV BX,OFFSET NAMES
     MOV AL,[BX+5]
   (2) MOV AX,NAMES
   (3) MOV AX,WORD PTR NAMES+1
   (4) MOV AX,NAMES[BX][SI]
   (5) MOV AX,OFFSET NAMES[BX][SI]
     INC [AX]
   (6) LEA DI,NAMES[BX][SI]
     MOV AL,[DI]

答案

(1) 两条指令都合法。
  (2) 这条指令不正确,因为NAMES的属性为字节,二目的寄存器是AX,所以类型不匹配。
  (3) 为合法指令。指令中讲已定义的字节变量用伪操作PTR改变为字类型,所以避免了类型不匹配。
  (4) 这条指令不正确,源操作数的数据类型伪字节型,目的操作数伪字类型,所以类型不匹配。
  (5) 这条指令不正确,因为在汇编过程中,OFFSET操作将得到变量的便移值,但对相对基址变址寻址方式形成的值在汇编指令时还是未知的;在第二条指令中,AX不能作为基址寄存器用。
  (6) 为合法指令。



2 假设程序中的数据定义如下:
  PARTNO DW?
  PNAME DB 16 DUP(?)
  COUNT DD ?
  PLENTH EQU $-PARTNO
  问PLENTH的值为多少?它标是什么意义?

答案

PLENTH的值为22,它表示从当前位置到PAERNO处所占的字节。
3 若WORD1及WORD2均为字变量,ADDITON为标号.请说明下列指令的错误之处:
  (1) JMP ADDITION[DI]
  (2) JNZ WORD2
  (3) JMP FAR ADDITION

答案

(1) 其错在于两个地址表达式不能相加;
  (2) 其错在于条件转移指令只能进行8位的相对寻址,而WORD2确是一个字变量;
  (3) 应该为:JMP FAR PTR ADDITION;
4 下面两个语句有何区别:
  X1 EQU 1000H
  X2=1000H

答案

X1不能多次赋值,X2能多次赋值。
5 对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?
  FLDB DB ?
  TABLEA DB 10 DUP(?)
  TABLEB DB 'ABCD'
  (1) MOV AX,TYPE FLDB
  (2) MOV AX,TYPE TABLEA
  (3) MOV CX,LENGTH TABLEA
  (4) MOV DX,SIZE TABLEA
  (5) MOV CX,LENGTH TABLEB

答案

(1) AX=1 (2) AX=1 (3) CX=10 (4) DX=10 (5) CX=1

6 已知堆栈段寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条PUSH指令把8057H和0F79H入栈,然后执行一条POP指令,试画出示意图,说明堆栈及SP内容的变化过程.

答案

见图答4.6

7 试设计一个数据段DSEG,定义下列字符变量或数据变量.请画出(1)~(5)题的内存分配图,并指明它们的初值。
  (1) FIRST为十六进制数的字变量4020H;
  (2) SECOND为二进制数的字节变量01011100B;
  (3) THIRD为二进制数的字节变量64;
  (4) STRING为字符串变量ADDITION;
  (5) ASCDATA为ASCII数字变量‘46782';
  (6) TABL为10个字的数组变量;
  (7) REPDATA位数字0,2,3,0,6重复5次的字节变量;
  (8) ZESULT为10个0的字节变量。

答案

数据段DSEG定义如下:
  DSEG SEGMENT
  FIRST DW 4020H
  SECOND DB 0101100B
  THIRD DB 64D
  STRING DB ‘ADDITION’
  ASCDATA DB ‘46782’
  TABL DW 10 DUP(?)
  REPDATA DB 5 DUP(0,2,3,0,6)
  RESULT DB 10 DUP(0)

  内存分配情况:
   0100: 0000H 20H FIRST
         40H 
      0002H 01011100B SECOND
      0003H 64D THIRD
      0004H 41H STRING
      0005H 44H
      0006H 44H
      0007H 49H
      0008H 54H
      0009H 49H
      000AH 4FH
      OOOBH 4EH
      000CH 34H ASCDATA
      000DH 36H
      000EH 37H
      000FH 38H
      0010H 32H
8 设有3个字变量的变量名及其内容如下:
  VAR1 3C46H
  VAR2 F678H
  VAR3 0059H
  试设计一个数据段定义这三个变量及其地址表变量ADDRTABL(包括段地址和偏移地址)。

答案

DATA SEGMENT
     VAR1 DW 3C46H
     VAR2 DW F678H
     VAR3 DW 0059H
     ADDRTABL DD VAR1
         DD VAR2
         DD VAR3
   DATA ENDS
9 设有一个有符号数数组,共有M个字。试编一程序求其种最大的数;若需求绝对值最大的数,程序如何修改?又若数组元素为无符号数,求最大数的程序应如何修改?

答案

DSEG SEGMENT
     DATA DW M DUP(?)
     MAX DW ?
  DSEG ENDS
  CSEG SEGMENT
     ASSUME CS:CSEG,DS:DSEG
  START:MOV AX,DSEG
     MOV DS,AX
     MOV MAX,DATA
     CLD
     MOV SI,OFFSET DATA
     MOV CX,M
  L1:LODSW
    CMP AX,MAX
    JNG LAB
    MOV MAX,AX
  LAB:LOOP L1
    MOV AH,4CH
     INT 21H
  CSEG ENDP
     END START
若需要绝对值最大的数,则就需要将每个数最大绝对值求出后再比较,要在LODSB语句插入下面程序:
     AND AX,AX
     JNS LAB1
     NEG AX
   LAB1:CMP AX,MAX
且在程序初始化MAX的值时应送入0(最小的绝对值).
  若要对无符号数求最大值,则只需改变判别条件,即将
     CMP AX,MAX 改为:CMP AX,MAX
     JNG LAB      JBE LAB
10 试编写一程序统计一个字中的“1”的个数。

答案

 

   STACK SEGMENT STACK
      DW 256 DUP(?)
   TOP LABEL WORD
   STACK ENDS
   DATA SEGMENT
   TW DB 1234H
   TWIS DW ?
   DATA ENDS
   CODE1 SEGMENT
      ASSUME CS:CODE1,DS:DATA,SS:STACK
   START:MOV AX,DATA
      MOV DS,AX
      MOV AX,STACK
      MOV SS,AX
      MOV SP,OFFSET TOP 
      MOV AX,TW
      CALL FAR PTR BCNT1;调BCNT1子程序
      PUSH BX
      MOV AL,AH
      CALL FAR PTR BCNT1
      POP AX
      ADD AX,BX
      MOV TWIS,AX
      MOV AH,4CH
      INT 21H
  CODE1 ENDS
  CODE2 SEGMENT
     ASSUME CS:CODE2
  BCNT1 PROC FAR
     MOV BX,0
     MOV SI,0
  BLOOP1:RCL AL,1
      JNC BLOOP2
      INC BX
  BLOOP2:INC SI
      CMP SI,8
      RET
  BCNT1 ENDP
  CODE2 ENDS
     END START
 

 


11 在首地址为DATA的字数组中存放了100H个补码数。试编写一个汇编语言程序,求出它们的平均值,放在AX寄存器中;同时求除数组中有多少个数小于此值,将结果放在BL中。

答案
CODE SEGMENT
     ASSUME CS:CODE,DS:CODE
   START:MOV AX,CODE
      MOV DS,AX
      MOV SI,OFFSET DATA
      MOV AX,0
      MOV DX,0
      CLC
  LP:ADD AX,[SI]]
   INC SI
   INC SI
   ADC DX,0
   LOOP LP
   MOV AX,DX
   MOV CX,100H
   MOV SI,OFFSET DATA
   MOV BL,0
  LP1:CMP [SI],AX
    JGE GRT
    INC BL
  GRT:INC SI
    INC SI
    LOOP LP1
 DATA DW 100 DUP(?)
 CODE ENDS
    END START

12 已知32为数存放在DX:AX中。试编写一个汇编语言程序将32为数左移4位,并将高4位存入CH中。

答案

CSEG SEGMENT
  ASSUME CS:CSEG,DS:DSEG
  START:MOV CH,DH
     MOV CL,4
     SHR CH,CL
   L1:SHL AX,1
     RCL DX,1
     LOOP L1
     MOV AH,4CH
     INT 21H
  CSEG ENDS
     END START
13 AX寄存器中存放着4位十六进制数。试编写一个汇编语言程序,将这4位十六进制数分别转换为相应的ASCII码,并依次存放到RESULT数组的4个字节中去,要求用调用子程序的方法实现。

答案

CODE SEGMENT
      ASSUME CS:CODE,DS:CODE
   START:MOV BX,CODE
      MOV DS,BX
      MOV CL,4
      MOV BL,4
      MOV SI,OFFSET RESULT
    LP:CALL HASC
      MOV [SI],DL
      INC SI
     SHR AX,CL
     DEC BL
     JNZ LP
   EXIT:MOV AH,4CH
     INT 21H
   HASC PROC NEAR
    MOV DL,AL
    AND DL,0FH
    CMP DL,9
    JA L2
    ADD DL,30H
   L1:RET
   L2:ADD DL,37H
     JMP L1
   HASC ENDP
   RESULT DB 4 DUP(?)
      CODE ENDS
      END START
14 设有两个等字长字节型字符串。试编写一个汇编语言子程序,比较它们是否完全相同;若相同,则将字幅“Y”送入AL中,否则,将字符“N”送入AL中。

答案

 CODE SEGMENT
      ASSUME CS:CODE,DS:CODE
   START:MOV AX,CODE
      MOV DS,AX
      CMPS STRING1,STRING2   
      JNZ NE
      MOV AL,‘Y’
      JMP EXIT
    NE:MOV AL,‘N’
   EXIT:MOV AH,4CH
      INT 21H
      STRING1 DB ‘...’
      STRING2 DB ‘...’
   CODE ENDS
     END START
15 轻编写一程序,从附加段中一个未排序的字数组UNORDLST中,找出最大数和最小数,分别放在AL和BX寄存器中。

答案

ESEG SEGMENT
      UNORDLST DW 50 DUP(?)
      COUNT EQU ($-UNORDLST)/2
   ESEG ENDS
   CSEG SEGMENT
      ASSUME CS:CSEG,ES:ESEG
   START:MOV AX,ESEG 
      MOV ESD,AX
      MOV CX,COUNT
      DEC CX
      LEA DI,UNORDLST
      MOV BX,ES:[DI]
      MOV AX,BX
   CHKMIN:ADD DI,2
      CMP ES:[DI],BX
      JAE CHKMAX
      JMP SHORT NEXTTEL
   CHKMAX:CMP ES:[DI],AX
      JBE NEXTTEL
      MOV AX,ES:[DI]
   NEXTTEL:LOOP CHKMIN
      MOV AH,4CH
      INT 21H
    CSEG ENDS
     END START
16 编写一个汇编语言子程序,实现将一组(设有N个)7位ASCII码变为偶校验码。

答案

CODE SEGMENT
      ASSUME CS:CODE,DS:CODE
   START:MOV AX,CODE
      MOV DS,AX
      MOV SI,OFFSET NACSII
      MOV CX,7
      MOV DX,N
    LP0:MOV BL,[SI]
    LP1:SHR BL,1
      ADC AL,0
      LOOP LP1
      AND AL,01H
      ROR AL,1
      OR BL,AL
      DEC DX
      JNZ LP0
      MOV AH,4CH
      INT 21H
    CODE ENDS
       END START


17 试问下列伪指令在存储区中分别为各变量分配多少字节?
  VR1 DW10
  VR2 DW 6 DUP(?),66,88
  VR3 DD 10 DUP(?)
  VR4 DB 2DUP(?,8DUP(0))
  VR5 DB ‘Happy New Year!’

答案

VR1,VR2,VR3,VR4,VR5分别分配字节个数为:20,16,40,18,15。
18 对于给定的符号定义,指出下列指令的错误,说明原因。
  A EQU 505
  B DB ?
  C DB 64H
  (1) MOV A,AX;(2) MOV B,AX;(3) MOV AX,B
  (4) CMP C,AX;(5) CMP A,C; (6) CMP AX,C

答案

 (1) 错。因变量A已通过EQU伪指令赋值为505,故不能再用传送指令MOV对其赋值。
   (2) 错。类型不匹配,变量B为字节型,AX为字型。
   (3) 错。类型不匹配。
   (4) 错。类型不匹配,C为字节型,AX为字型。
   (5) 错。源操作数和目的操作数不能同位存储器类型,且类型也不匹配。
   (6) 错。类型不匹配。
19 对于给定的数据定义,各条MOV指令单独执行后有关寄存器的内容是什么?
  K1 DB ?
  K2 DB 8 DUP(?)
  K3 DW 6 DUP(?)
  K4 DW ‘1234’
  (1) MOV AX TYPE K1
  (2) MOV AX,TYPE K3
  (3) MOV CL,LENGTH K2
  (4) MOV CX,LENGTH K3
  (5) MOV CX,LENGTH K4
  (6) MOV DX SIZE K3

答案

(1) (AX)=0001H TYPE是存储单元类型,字节型为1,字型为2,双字为4;
   (2) (AX)=0002H LENGTH是存储区的单元数目,单元可以是字节、字或者双字;
   (3) (CL)=08H SIZE存储区的字节数。
   (4) (CX)=0006H
   (5) (CX)=0004H
   (6) (DX)=000CH
20 对于给定的数据定义,变量R1和R2的值分别是多少?
  (1) A1 DB 1,2,3 ‘ABC’
    A2 DB 0
    R1 EQU A2-A1
  (2) K1 DW ?
    K2 DB 6 DUP(?)
    K3 DD ?
    R2 EQU $-K1

答案

 (1) R1=6 $表示地址计数器的值
   (2) R2=22
21 写出完成下述要求的变量定义语句:
  (1) 为某缓冲区BUG留出200各字节的内存空间;
  (2) 将字符串‘BYTE’,‘WORD’,‘DWORD’存放于某数据区;
  (3) 在某数据区要求存入下列5个数据:
    2040H,0300H,10H,0200H,1048H

答案

(1) BUG DB 200DUP(?)
(2) STR1 DB ‘BYTE’
    STR2 DB ‘WORD’
    STR3 DB ‘DWORD’
(3) DATA DW 2040H,0300H,10H,0200H,1048H
22 分别说明下列指令对的区别:
  (1) MOV AX,VAR1和MOV AX OFFSET VAR1
  (2) MOV AX,VAR1与LEA AX,VAR1

答案

(1) MOV AX,VAR1是将变量VAR1的内容送AX;
     MOV AX,OFFSET VAR1是将变量VAR1的偏移量送AX。
   (2) LEA AX,VAR1也是将变量VAR1的偏移量送AX,与(1)中不同的是采用专门取偏移量指令实现。
23 说明为什么有时候必须使用PTR属性操作符。

答案

PTR优先于隐含的类型属性,指定操作数的类型属性。因为在许多情况下,所使用的操作符类型与原指定的类型不同,又不希望改变原有的设定,只暂时改变操作符类型,则必须使用PTR属性操作符作为临时设定,这个临时设定类型只在本条指令有效。
24 假设VDT1和VDT2为字变量,TAL1和TAL2为标号,说明下列指令是否正确,若正确,说明其寻址方式;若有错误指出错误所在。
  (1) JMP VDT1 (2) JMP NEAR TAL1 (3) JNZ VDT2 
  (4) JE TAL2 (5) JMP FAR PTR TAL1 (6) JMP TAL1[SI]

答案

(1) 错。条转地址应为标号,而非变量。
   (2) 错。指令中缺少PTR.
   (3) 错。条转地址应为标号,而非变量。
   (4) 正确。相对寻址方式。
   (5) 正确。直接需寻址方式。
   (6) 正确。相对寻址方式。