(8) POP CS 错,不能将栈顶数据弹至CS中。 (9)MOV ES,3278H 错,立即数不能直接送ES寄存器。
应改为:MOV AX,3278H MOV ES,AX
(10)PUSH AL 错,栈操作不能按字节进行。应改为:PUSH AX (11)POP [BX] 正确。
(12)MOV [1A8H],23DH 错,源操作数是立即数,目的操作数必须使用寄存器指出。应改为:
MOV BX,1A8H MOV [BX],23DH
(13)PUSH IP 错,不能用IP寄存器做源操作数。
(14)MOV [AX],23DH 错,不能用AX寄存器间接寻址。应改为:MOV BX,AX MOV [BX],23DH (15)SHL AX,5 错,不能用大于己于1的立即数指出移位位数。应改为:
MOV CL,5 SHL AX,CL
(16)MUL AX,BX 错,目的操作数AX是隐含的,不能在指令中写出。应改为:MUL BX
9.设堆栈指针SP的初值为2000H,AX=3000H,BX=5000H,试问: (1)执行指令PUSH AX后 (SP)=?
(2)再执行PUSH BX及POP AX后 (SP)=?(AX)=?(BX)=? 答:(1)执行指令PUSH AX后 (SP)=2000H-2=1FFEH;
(2)再执行PUSH BX及POP AX后 (SP)=1FFEH, (AX)=5000H, (BX)=5000H 10.要想完成把[2000H]送[1000H]中,用指令:MOV [1000H],[2000H]是否正确?如果不正确,应用什么方法?
16
答:把[2000H]送[1000H]中,用指令 MOV [1000H],[2000H]不正确,应改为:
MOV AX,[2000H] MOV [1000H],AX 11.假如想从200中减去AL中的内容,用SUB 200,AL是否正确?如果不正确,应用什么方法?
答:想从200中减去AL中的内容,用SUB 200,AL不正确,应改为: MOV
BL,200 SUB BL,AL 12分别写出实现如下功能的程序段
(1)双字减法(被减数7B1D2A79H,减数53E2345FH)。 (2)使用移位指令实现一个字乘18的运算。 (3)使用移位指令实现一个字除以10的运算。
(4)将AX中间8位,BX低四位,DX高四位拼成一个新字。 (5)将数据段中以BX为偏移地址的连续四个单元的内容颠倒过来
(6)将BX中的四位压缩BCD数用非压缩BCD数形式顺序放在AL、BL、CL、DL中。 答:(1)双字减法的程序段是:
MOV AX,2A79H ;被减数的低位字送AX SUB AX,345FH ;低位字相减,结果送AX MOV BX,7B1DH ;被减数的高位字送BX
SBB BX,53E2H ;高位字相减处并减去低位字相减产生的借位,结果送BX (2)使用移位指令实现一个字乘18的程序段是: MOV AX,05F7H ;被乘数送AX
SHL AX,1 ;被乘数乘以2,结果在AX中 MOV BX,AX ;被乘数乘以2的结果暂存到BX MOV CL,3 ;设置移位位数3
SHL AX,CL ;被乘数再乘以8(共乘以16),结果在AX中 ADD AX,BX ;被乘数再乘以18,结果在AX中
17
(3)使用移位指令实现一个字除以10的运算,必须将X/10拆分成多项的和,而每一项都应是非的某次幂的倒数。利用等比级数的前N项和公式,可求出A0=X/8,公比Q=-1/4,故X/10=X/8-X/32+X/128-X/512+..., 所求的程序段是:
MOV AX,FE00H ;被除数送AX MOV CL,3 ;设置移位位数3
SHR AX,CL ;被乘数除以8,结果在AX中 MOV BX,AX ;被乘数除以8的结果暂存到BX MOV CL,2 ;设置移位位数2
SHR AX,CL ;被乘数除以4(累计除32),结果在AX中 SUB BX,AX ;被除数/8-被除数/32,结果在BX中 MOV CL,2 ;设置移位位数2
SHR AX,CL ;被乘数除以4(累计除128),结果在AX中 ADD BX,AX ;被除数/8-被除数/32+被除数/128,结果在BX中 MOV CL,2 ;设置移位位数2
SHR AX,CL ;被乘数除以4(累计除512),结果在AX中
SUB BX,AX ;被除数/8-被除数/32+被除数/128-被除数/512,结果在BX中
(4) 将AX中间8位,BX低四位,DX高四位拼成一个新字的程序段是: AND DX,0F000H ;将DX的低12位清零,高4位不变
AND AX,0FF0H ;将AX的低4位清零,高4位清零,中间8位不变 AND BX,0FH ;将BX的高12位清零,低4位不变 ADD AX,BX
ADD AX,DX ;按要求组成一个新字,结果放在AX中。
(5) 将数据段中以BX为偏移地址的连续四个单元的内容颠倒过来的程序段是:
18
MOV AL,[BX] ;数据段中BX为偏移地址的字单元内容送AX
XCHG AL,[BX+3] ;数据段中BX+3为偏移地址的字单元内容与AX的内容交换 MOV [BX],AL ;数据段中BX+3为偏移地址的字单元内容送BX为偏移地址的字单元
MOV AL,[BX+1] ;数据段中BX+1为偏移地址的字单元内容送AX
XCHG AL,[BX+2] ;数据段中BX+2为偏移地址的字单元内容与AX的内容交换 MOV [BX+1],AL ;数据段中BX+2为偏移地址的字单元内容送BX+1为偏移地址的字单元
(6)将BX中的四位压缩BCD数用非压缩BCD数形式顺序放在AL、BL、CL、DL中的程序段是:
MOV DL,BL ;四位压缩BCD数的低位字节送DL
AND DL,0FH ;DL的高4位清零,得四位非压缩BCD数的最低位,放入DL中 MOV CL,4 ;设置移位位数4
SHR BX,CL ;BX中的数据逻辑右移4位,使四位压缩BCD数的次低位位于BL的低4位
MOV CH,BL ;将BL的内容暂存到CH中保留
AND CH,0FH ;CH的高4位清零,得四位非压缩BCD数的次低位,放CH中 MOV CL,4 ;设置移位位数4
SHR BX,CL ;BX中的数据逻辑右移4位,使四位压缩BCD数的次高位位于BL的低4位
MOV AL,BL ;将BL的内容暂存到AL中保留
AND BL,0FH ;BL的高4位清零,得四位非压缩BCD数的次高位,放BL中 MOV CL,4 ;设置移位位数4
SHR AL,CL ;使四位压缩BCD数的最高位位于AL的低4位,得四位非压缩BCD数的次高
;位,放入BL中
19
MOV CL,CH ;将四位非压缩BCD数的次低位移入CL中
1.假设OP1,OP2是已经用DB定义的变量, W_OP3和W_OP4是已经用DW定义的变量,判断下列指令书写是否正确?如有错误,指出错在何处?并写出正确的指令(或程序段)实现原错误指令期望实现的操作((19)、(20)不改)。
(1)PUSH OP1 (2)POP [W_OP4]
(3)MOV AX, WORD PTR [SI][DI] (4)MOV AX,WORD PTR ES:BX (5)MOV BYTE PTR [BX], 1000 (6)MOV BX, OFFSET [SI+200H] (7)MOV OP2,[BX]
(8)CMP HIGH W_OP3, 25 (9)CMP OP1, OP2 (10)CMP AX, OP2
(11)MOV W_OP3[BX+4*3][DI], SP (12)ADD W_OP3, W_OP4 (13)MOV AX, W_OP3[DX] (14)MOV OP1, LOW DS
(15)MOV SP, OP2[BX][SI] (16)MOV AX, W_OP3+W_OP4 (17)MOV AX,W_OP3-W_OP4+100 (18)SUB AL, W_OP3+7 (19)MOV AX,BX SHL 2
(20)MOV BX,W_OP3 AND 8FD7H
答:1. (1)PUSH OP1 错,OP1为字节类型,栈操作不能按字节进行,应改为:PUSH WORD PTR OP1
(2)POP [W_OP4] 正确。
(3)MOV AX, WORD PTR [SI][DI] 错,源操作数寻址方式有问题。 应改为: MOV BX, SI
MOV AX, WORD PTR [BX][DI]
(4)MOV AX,WORD PTR ES:BX错,若源操作数为寄存器寻址是不能加段说明及属性修改
的。显然,原意应为寄存器间接寻址,故应改为: MOV AX,WORD PTR ES:[BX]
(5)MOV BYTE PTR [BX], 1000 错,源操作数为字类型,目的操作数为字节类型,二者不
一致。应改为: MOV WORD PTR [BX], 1000
20