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之值。