ADD AX,DX ;按要求组成一个新字,结果放在AX中。
(5) 将数据段中以BX为偏移地址的连续四个单元的内容颠倒过来的程序段是: 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中
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错,源操作数为字节类型,目的操作数为字类型,二者不一致。
应改为: CMP AX, WORD PTR OP2 (11)MOV W_OP3[BX+4*3][DI], SP正确。
(12)ADD W_OP3, W_OP4错,源操作数和目的操作数均为内存单元,不允许。
应改为: MOV AX, W_OP4 ADD W_OP3, AX
(13)MOV AX, W_OP3[DX] 错,不能用DX寄存器间接寻址。
应改为: MOV BX, DX MOV AX, W_OP3[BX]
(14)MOV OP1, LOW DS错,源操作数中使用LOW来分离寄存器操作数,这是不允许的。
应改为: MOV WORD PTR OP1,DS
(15)MOV SP, OP2[BX][SI] 错,源操作数为字节类型,目的操作数为字类型,二者不一致。
应改为:MOV SP, WORD PTR OP2[BX][SI]
(16)MOV AX, W_OP3+W_OP4错,两个标识符相加无意义。应改为: MOV AX, W_OP1
ADD AX, W_OP2
(17)MOV AX,W_OP3-W_OP4+100正确,源操作数为两个标识符(地址)相减再加一数,
汇编时得到一个数。
(18)SUB AL, W_OP3+7错,两个操作数类型不一致。应改为: SUB AL, BYTE PTR W_OP3+7
(19)MOV AX,BX SHL 2错,SHL只能对常量进行运算,左边不能使用寄存器
(20)MOV BX,W_OP3 AND 8FD7H错,AND只能对常量进行运算,左边不能使用变量
4.设已定义数据段 DATA SEGMENT ??
VAR2 DW 10H,7889H ??
VAR5 DB 20H,0 ADRR DW VAR2,VAR5 DATA ENDS
为使ADRR字存储单元中存放内容为“0010H”,ADRR+2字存储单元中存放内容为“0020H”,上述省略号位置应分别填写一条什么语句?说明理由。
答:为使ADRR字存储单元中存放内容为“0010H”,ADRR+2字存储单元中
存放内容为“0020H”,上述省略号位置应分别填写ORG 10H 和 ORG 20H, 或者分别填写语句
VAR1 DB 10H DUP(?) 和 VAR3 6 DUP(?)
5.下面的数据段中,有数据为‘4100H’的字存储单元有几个?它们的偏移量分别是多少? DATA SEGMENT DA1 DB 0 ORG 41H
DA2 DB 0,‘A’,41H,0,41H ADR DW DA1,DA2
DATA ENDS