应改为: 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
答:给出的数据段中,有数据‘4100H’的字存储单元有3个,它们的偏移量分别是41H、 44H、47H。
7.试用数据定义语句DB或DW改写下述两语句中的某一个,使它们在存储器中有完全相同的存储情况。
VAR1 DB ‘abcdefghij’
VAR2 DW 6162H,6364H,6566H,6768H,696AH
答:将第一个伪指令语句改写为VAR1 DW ‘ab’,‘cd’,‘ef’,‘gh’,‘ij’,第二个伪指令语句不变。或第一个伪指令语句不变,而将第二个伪指令语句改写为:
VAR2 DB 61H,62H,63H,64H,65H,66H,67H,68H,69H,6AH
9.按下面的要求写出程序的框架
(1)数据段的位置从0E000H开始,数据段中定义一个100字节的数组,其类型属性既是字又是字节;
(2)堆栈段从小段开始,段组名(类别名)为STACK;
(3)代码段中指定段寄存器,指定主程序从1000H开始,给有关段寄存器赋值;
(4)程序结束。 答:所求程序框架为: Data SEGMENT AT 0E000H Arr_w LABEL WORD Arr_b DB 100 DUP(?) Data ENDS
Sta_seg SEGMENT PARA ‘STACK’ DB 80 DUP(?)