(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中
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
(6)MOV BX, OFFSET [SI+200H] 错,OFFSET运算应在汇编时完成,但[SI+200H]在执行指令时才可获得。应改为: LEA BX,[SI+200H]
(7)MOV OP2,[BX] 错,源操作数和目的操作数均为内存单元,不允许。 应改为: MOV AL, [BX]
MOV OP2, AL (8)CMP HIGH W_OP3, 25错,目的操作数中使用HIGH来分离存储器操作数,这是不允许的。应改为: CMP BYTE PTR W_OP3+1,25
(9)CMP OP1, OP2错,源操作数和目的操作数均为内存单元,不允许。 应改为: MOV AL, OP2 CMP AL, OP1
(10)CMP AX, OP2错,源操作数为字节类型,目的操作数为字类型,二者不一致。