习题三
5.4 指出下列指令的错误是什么?
(1) MOV BL ,AX (2) MOV [BX],[BP+SI]
(3) MOV CS ,AX (4) MOV DS ,1000H
(5) MOV BX ,[SI][DI] (6) MOV [2000H],10
解: (1)类型属性不匹配; (2)两操作数都是存储单元;
(3)把CS 用作目的操作数 (4)立即数送段寄存器;
(5)源操作数中两个均为变址寄存器; (6)类型属性不明确
5.5 设当前数据段寄存器的内容为1B00H ,在数据段偏移地址为2000H 开始的单元内,含有一个内容为0FF10H 和8000H 的指针,它们是一个16位变量的偏移地址和段地址,试写出把该变量装入AX 的指令序列,并画出内存图。
解: 内存图:
指令序列: MOV BX ,[2000H]
MOV AX ,[2002H]
MOV DS ,AX
MOV AX ,[BX]
或者:
LDS BX ,[2000H]
MOV AX ,[BX]
5.7 要求从85号端口读入一个字节数据,然后到数据段首地址为1000H 的表格中换取相应的数据码,再将该数据输出至3000号端口,试编写指令序列。
解: IN AL ,85
MOV BX ,1000H
XLAT
MOV DX ,3000
OUT DX ,AL
5.9 根据以下要求编写相应的指令:
(1)将AX寄存器和BX寄存器的内容相加,结果存入BX寄存器。
(2)用增量指令使采用BX寄存器间接寻址的单元中的字节内容加1。
(3)用BX寄存器和位移量300H的寄存器相对寻址方式把存储器中的一个字和(CX)相加,结果送回该存储单元中。
(4)用寄存器BX和SI的基址变址寻址方式,把存储器中的一个字节与AH 寄存器的内容相加,并保存在AH中。
(5)采用合适的指令,将1000H单元中的字与1200H单元中的字相加,结果存入1000H单元。
解:(1) ADD BX,AX
(2) INC BYTE PTR[BX]
(3) ADD [BX+300H],CX
(4) ADD AH,[BX][SI]
(5) MOV BX,1000H
MOV AX,[1200H]
ADD [BX],AX
5.10 设以下表达式中的变量名均为16位带符号数所在单元的地址,编写指令序列,完成下列运算(出发运算的余数舍去):
(W×Y)/(A+70)→X
(A-B×C)/(X-Y)→Z
解:(1) MOV AX,W
IMUL Y
MOV BX,A
ADD BX,70
IDIV BX
MOV X,AX
(2) MOV AX,B
IMUL C
MOV BX,AX
MOV CX,DX
MOV AX,A
CWD
SUB AX,BX
SBB DX,CX
MOV BX,X
SUB BX,Y
IDIV BX
MOV Z,AX
5.11 变量VARA1和变量VARA2已定义如下:
VARA1 DW 23A8H,0280H
VARA2 DW 0A210H,1248H
(1)将VARA1和VARA2单元中的对应字数据相加,结果存入VARA2指示的单元中
(2)将VARA1单元中的两个字作为双字和VARA2单元中的两个字组成的双字相加,结果存放在VRAR2单元中,双字的存放格式都是低位字在低地址单元、高位字在高地址单元中。
解:(1) MOV AX,VARA1
ADD VARA2,AX
(2) MOV AX,VARA1
ADD VARA2,AX
MOV AX,VARA1+2
ADC VARA2+2,AX
5.13 指出下列各条指令是否正确,如不正确,则指出其错在何处。
(1) MOV CS,1000H (2) ADC BX,25H
(3) ADD [BX],20 (4) MUL AX,BL
(5) PUSH CS (6) MOV DX,2000H
(7) ADD [BX+SI],30H (8) POP CS
(9) INC [SI] (10)MOV [BX],[SI]
解:(1)错误――――CS不可作目的操作数
(2)正确
(3)错误――――类型属性不明确
(4)错误――――累加器AX应该是隐含的
(5)正确(6)正确
(7)错误――――类型属性不明确
(8)错误――――CS不可作目的操作数
(9)错误――――类型属性不明确
(10)错误――――两操作数不可都在存储器中
5.14 用逻辑运算指令分别写出完成下列要求的指令:
将BX寄存器中的高4位清零。
将CX寄存器中的第0、1两位置1。
将AL寄存器的中间4位变反。
测试AX的最高位和次高位是否为0。
解:(1) AND BX,0FFFH
(2) OR CX,0003H
(3) XOR AL,003CH
(4) TEST AX,0C000H
5.15 设(BX)=0A6H,(CL)=3,CF为1,试指出下列各条指令单独执行后BX 中的值。
(1) SAR BX,1 (2) SHR BX,CL
(3) SHL BL,CL (4) SAL BL,1
(5) ROR BX,CL (6) RCL BX,CL
(7) ROL BH,1 (8) RCR BL,1
解:(1)(BX)=0053H (2)(BX)=0014H (3)(BX)=0030H (4)(BX)=004CH (5)(BX)=0C014H (6)(BX)=0534H (7)(BX)=0A6H (8)(BX)=00D3H
5.17 利用移位指令、传送指令和加法指令完成乘法运算(AX)×10。
解: SAL AX,1
MOV BX,AX
MOV CL,2
SAL AX,CL
ADD AX,BX
5.18 试分别指出在下列3种条件下执行指令 SUB AX,BX 时,对标志位OF、CF、SF、ZF影响的情况:
(1)(AX)=14C6H ,(BX)=80DCH
(2)(AX)=42C8H ,(BX)=608DH
(3)(AX)=0D023H ,(BX)=9FD0H
解:(1) OF=1,CF=1,SF=1,ZF=0
(2) OF=0,CF=1,SF=1,ZF=0
(3) OF=0,CF=0,SF=0,ZF=0
5.20 在一个名为STRING、长度为100字节的字符串中查找是否含有字符“$”,如果有则将第一次发现的“$”字符所在单元的偏移地址送入BX寄存器中;如果未曾找到,则将0FFFFH送入BX寄存器中。
解: CLD
MOV AL,‘$’
LEA DI,STRING
MOV CX,100
REPNE SCASB
JNE ZER
DEC DI
MOV BX,DI
JMP STOP
ZER: MOV BX,0FFFFH
STOP: HLT
5.21 将2000H段中名为BUFST的缓冲区中长度为200个字节的数据串移到3000H段中名为DSTST的缓冲区中。
编写两种采用不同指令实现该功能的程序段。
解:(1) MOV AX,2000H
MOV DS,AX
MOV AX,3000H
MOV ES,AX
MOV CX,200
CLD
LEA SI,BUFST
LEA DI,DSTST
REP MOVSB
HLT
(2) MOV AX,2000H
MOV DS,AX
MOV AX,3000H
MOV ES,AX
MOV CX,200
LEA SI,BUFST
LEA DI,DSTST
AGN: MOV AL,[SI]
MOV ES:[DI],AL
INC SI
INC DI
LOOP AGN
HLT
5.22 将1000段中名为DATSTR的字符串,向高地址方向平移20个字节,字符串的长度为45字节。
解: STD
MOV AX,1000H
MOV DS,AX
MOV ES,AX
LEA SI,DATSTR+44
LEA DI,DATSTR+64
MOV CX,45
REP MOVSB
HLT。