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

当前位置:电子发烧友网 > 图书频道 > 电子 > 《微计算机原理》 > 第3章 8086指令系统

第6节 自测题

 

  1、试指出下列指令中的源操作数与目的操作数寻址方式:

  (1) MOV SI,100

  (2) MOV BP,AX

  (3) MOV [SI],1000

  (4) MOV BP,[SI]

  (5) LDS DI,[2130H]

  (6) AND DI,[BX+SI+20H]

  (7) JMP 1234H (8)HLT

  (9) ADD SI,[BX]

  (10) MOV [BX+100],DI

  答案

  (1)源操作数为立即数寻址方式,目的操作数为寄存器寻址方式。

  (2)源操作数和目的操作数均为寄存器寻址方式。

  (3)源操作数为立即数寻址方式,目的操作数为寄存器间接寻址方式。

  (4)源操作数为寄存器间接寻址方式,目的操作数为寄存器寻址方式。

  (5)源操作数为直接寻址方式,目的操作数为寄存器寻址方式。

  (6)源操作数为相对的基址加变址寻址方式,目的操作数为寄存器寻址方式。

  (7)这是程序转移段内直接寻址方式。

  (8)无寻址方式。

  (9)源操作数为寄存器间接寻址方式,目的操作数为寄存器寻址方式。

  (10)源操作数为寄存器寻址方式,目的操作数为寄存器相对寻址方式。

  2、指出下列传送指令中,哪些是非法指令:

  (1) MOV DS,0100H

  (2) MOV BP,AL

  (3) MOV BX,AL

  (4) XCHG AH,AL

  (5) OUT 21H,AL

  (6) OUT 310,AL

  (7) MOV [BP+DI],AX

  (8) MOV [BX+CX],2130H

  (9) AND AX,BL

  (10) ADD AL,[BX+DX+10]

  答案

  (1)非法,不能直接向DS中送立即数,要实现该语句的功能应改为:

  MOV AX, 0100H

  MOV DS,AX

  (2)非法,源操作数和目的操作数的类型不同。应改为:

  MOV BP,AX

  (3)非法,源操作数和目的操作数的类型不同。应改为:

  MOV BX,AX

  (4)合法。  (5)合法。

  (6)非法。  (7)合法。

  (8)非法。

  (9)非法。源操作数和目的操作数的类型不同。应改为:

  AND AX,BX

  (10)非法。

  在上面的指令中,(1),(2),(3),(6),(8),(9),(10)都是非法指令。

  3、假设

  (AX)=2000H

  (BX)=1200H

  (SI)=0002H

  (DI)=0003H

  (DS)=3000H

  (SS)=3000H

  (SP)=0000H

  (31200H)=50H

  (31201H)=02H

  (31202H)=0FH

  (31203H)=90H

  请写出在下列个条指令独立执行完后,有关寄存器及存储单元的内容,若影响标志位,请给出标志位SF,ZF,OF,CF的状态。

  (1) ADD AX,1200H

  (2) SUB AX,BX

  (3) MOV [BX],AX

  (4) PUSH AX

  (5) DEC BYTE PTR[1200H]

  (6) NEG WORD PTR[1200H]

  (7) SAR BYTE PTR1200[SI],1

  (8) RCL BYTE PTR[BX+SI+1],1

  (9) MUL WORD PTR[BX][SI]

  (10) DIV WORD PTR1200[DI]

  答案

  (1)(AX)=3200H,(SF,ZF,OF,CF)=(0,0,0,0)

  (2)(AX)=0E00H,(SF,ZF,OF,CF)=(0,0,0,0)

  (3)(31200H)=2000H,不影响条件码

  (4)(3FFFEH)=2000H,(SP)=0FFFFH,不影响条件码

  (5)(31200H)=4FH,(SF,ZF,OF,CF)=(0,0,0,/)

  (6)(31200H)=0FDB0H,(SF,ZF,OF,CF)=(1,0,0,1)

  (7)(31200H)=0FBH,(SF,ZF,OF,CF)=(1,0,0,1)

  (8)(31203H)=21H,(SF,ZF,OF,CF)=(/,/,1,1)

  (9)(DX)=121EH,(AX)=0E00H,(OF,CF)(1,1)

  (10)(AL)=38H,(AH)=80H,条件码无定义

  4、判断下列指令是否正确:

  (1) POP CS

  (2) PUSH WORD PTR 20[BX+SI-2]

  (3) LEA BX,4[BX]

  (4) JMP BYTE PTR[BX]

  (5) SAR AX,5

  (6) MOV BYTE PTR[BX],1000

  (7) CMP [DI],[SI]

  (8) ADD BX,OFFSET A

  (9) IN AL,DX

  (10) MUL 25

  答案

  (1)错 (2)对 (3)对 (4)错 (5)错

  (6)错 (7)错 (8)对 (9)对 (10)错

  5、试分析在下列程序段执行完后,A单元的内容是什么?

  DATA SEGMENT

  A DW 0

  B DW 0

  C DW 0

  DATA ENDS

  CODE SEGMENT

  ......

  MOV BX,OFFSET C

  MOV AX,[BX]

  MOV B,AX

  MOV AX,2[BX]

  ADD AX,B

  MOV A,AX

  ......

  CODE ENDS

  答案

  (A)=250

  6、假设X和X+2单元的内容为双精度数为P,Y和Y+2单元的内容为双精度数Q(X,Y为低位字),下列程序段使当2P>Q时,(AX)=2。请把程序填写完整。

  MOV DX,X+2

  MOV AX,X

  ADD AX,X

  ADC DX,X+2

  CMP DX,Y+2

  ( ) L2

  ( ) L1

  CMP AX,Y

  ( ) L2

  L1: MOV AX,1

  JMP EXIT

  L2: MOV AX,2

  EXIT:INT 20H

  答案

  (1)JL (2)JG (3)JBE

  7、编写一段程序,实现下述要求:

  (1)使AX寄存器的低4位清零,其余位不变。

  (2)使CL寄存器的内容变为四个组合的BCD数,其中百位数放在DX中,十位数放在AH中,个位放在AL中。

  (3)使AL寄存器的低4位保持不变,高位取反。

  答案

  (1)AND AX,0FFF0H

  (2)因CL的内容小于255,千位数为0,要将CL中的二进制数变为组合BCD数,采用除法转换法,先将(CL)除以100,得商为百位数;再将余数除以10,所得为十位数,余数为个位数。程序如下:

  MOV AL,CL      ;将CL内容保存在AL中

  AND AX,0FFH     ;清AH

  MOV BL,100     ;将除数100送BL

  DIV BL        ;(AX)/(BL),商在AL中,余数在AH中

  MOV DL,AL      ;商(百位数)送DL

  MOV DH,0      ;千位数为0送DH

  MOV BL,10      ;将除数10送BL

  MOV AL,0

  XCHG AH,AL     ;将余数送AL,0送AH

  DIV BL        ;(AX)/(BL),商在AL中,余数在AH中

  XCHG AH,AL     ;商(十位数)送AL,余数(个位数)送AL

  (3) MOV AH,AL      ;将AL存在AH中

  AND AL,0FH      ;将AL高4位清0,低4位保持不变

  NOT AH         ;将原AL中的内容取反

  AND AH,0F0H     ;将原AL中的低4位清0

  OR AL,AH       ;将AL与AH或起来

  8、设有两个8字节的BCD码数据BCD1和BCD2,BCD1数以1000H为首址在内存中顺序存放;BCD2数以2000H为首址在内存中顺序存放。要求相加后将结果顺序存放在以2000H为首址的内存中。

  答案

  MOV CX,4        ;字数送CX

  MOV BX,0        ;地址指针BX清0

  CLC            ;清CF

  L1:MOV AX,[BX+1000H]  ;取BCD1的一个字

  ADC AX,[BX+2000H]    ;与BCD2的一个相应的字

  ;及进位标志相加

  AAA

  INC BX          ;修改地址指针

  INC BX

  LOOP L1         ; 循环完成则退出

  9、若32为二进制数存放于DX和AX中,试利用移位与循环指令实现以下操作:

  (1)DX和AX中存放的无符号数,将其分别乘2和除2。

  (2)若DX和AX中为有符号数,将其分别乘2和除2。

  答案

  (1)无符号数乘2 SHL AX,1

  RCL DX,1

  无符号数除2 SHR DX,1

  RCR AX,1

  (2)有符号数乘2 SHL AX,1

  RCL DX,1

  无符号数除2 SAR DX,1

  RCR AX,1

  10、设从内存0500H单元开始存放8个字节,要求对每个字节内容进行同一种字符处理,处理完后又顺序送或以0500H为首址的8个单元中。提示:设字节处理可调用子程序SUROT1。

  答案

  CLD

  MOV SI,0500H

  MOV CX,8

  L1:LODSB

  PUSH CX

  CALL SUROT1

  POP CX

  DEC CX

  MOV [SI-2],AL

  JNZ L1

  11、试编写从内存0404H单元开始的256个字节单元清零程序。

  答案

  CLD

  XOR AX,AX

  MOV DI,0404H

  MOV CX,256

  REP STOSB

  12、设以2000H为首址的内存中,存放着10个带符号的字节数据。试编写找出最大的数,并村入2000H单元中的程序。

  答案

  MOV SI,2000H

  MOV CX,10

  MOV DL,80H

  L1:LODSB

  CMP AL,DL

  JLE L2

  MOV DL,AL

  L2:LOOP L1

  MOV [2000H],DL

  MOV AH,4CH

  INT 21H

  13、将两位组合BCD数转换成ASCII码,并将存放于指定单元中。

  答案

  设两位组合BCD码已存放在AL中,且已定义变量:BUF DB 10 DUP(?)可以有如下程序段:

  MOV SI,0

  MOV BL,AL

  AND AL,0FH

  ADD AL,30H

  MOV BUF[SI],AL

  MOV CL,4

  AHR BL,CL

  ADD BL,30H

  INC SI

  MOV BUF[SI],BL

  14、设有两数X和Y,且X=85,Y=6,用分离BCD数完成X/Y。

  答案

  BCD1 DB 05H,08H

  BCD2 DB 06H

  BCD3 DB 3 DUP(?)

  MOV AH,0

  MOV AL,BCD1+1

  MOV BL,BCD2

  DIV BL

  MOV BCD3+1,AL

  MOV AL,BCD1

  AAD

  DIV BL

  MOV BCD3,AL

  MOV BCD3+2,AH

  15、试编写程序,要求能从键盘接收一个个位数,然后响铃N次(响铃的ASCII码为07H)。

  答案

  BEGIN: MOV AH,1

  INT 21H

  AND AL,0FH

  CBW

  MOV CX,AX

  BELL:MOV DL,07

  MOV AH,02H

  INT 21H

  LOOP BELL

  EXIT:RET

  16、在直接寻址方式中,一般只指出操作数的偏移地址。试问:段地址如何确定?如果要用某个段寄存器指出段地址,指令应如何表示?

  答案

  若无前缀说明,默认DS为段寄存器,则应指明段名称,例如:MOV BX,CS:[3000H]即是将CS段中的3000H和3001H两个单元的内容送BX中。

  17、试问:在寄存器间接寻址方式中,如果指令中没有具体指明段寄存器,段寄存器如何确定?

  答案

  无前缀说明时,默认段寄存器为DS,但若寄存器用BP,则对应的段为SS。

  18、当用寄存器间接寻址方式时,试问:BX,BP,SI,DI分别在什么情况下使用?它们的物理地址如何计算?请举例说明。

  答案

  寄存器间接的物理地址为

  DS*16+BX

  DS*16+SI

  DS*16+DI

  SS*16+BP

  例如,MOV AX,[BX] 若(DS)=2000H,(BX)=1000H则物理地址为

  2000H*16+1000H=21000H

  19、试问:使用堆栈操作指令时要注意什么?传送与交换指令涉及内存操作时分别注意什么?

  答案

  堆栈操作时应注意:(1)堆栈操作是字操作;(2)CS不能作为POP指令的目标操作数;(3)堆栈操作不影响标志。交换指令涉及内存时必须有一个是寄存器操作数。

  20、试指出对SS和SP寄存器值修改时的特殊规定,并说明原因。

  答案

  SP的变化范围为64KB,在堆栈段指定后,SP可以在该段指定范围内从0000H~FFFFH。当64KB不够用时,可对SS设新值。但只有一个堆栈段是当前可直接寻址的。

  21、用增、减量指令设计程序时,其后不能用标志位作为判断依据。为什么?

  答案

  增、减量指令不影响标志位。

  22、当使用乘法指令时,特别要注意判断用有符号乘法指令还是用无符号指令。为什么?

  答案

  带符号乘法指令在运算过程中是将该数变为原码并去掉符号,然后再相乘(绝对值相乘)。无符号数乘法指令无此转换过程。

  23、条件转移指令均为相对转移指令。请解释“相对转移”的含义。试问若需往较远的地方进行条件转移,该怎么办?

  24、当执行中断指令时,堆栈的内容有什么变化?如何求得子程序的入口地址?

  答案

  当执行中断指令时,堆栈内应保护断点和现场。8086的中断地址取得与中断类型码有关。

  25、试述中断返回指令IRET和RET指令的区别。

  答案

  IRET可使压如堆栈中的断点值及程序状态字弹出至CS,IP和PSW(FLAGS)继续执行程序。RET仅用语段内返回,即只恢复IP之值。