汇编语言程序设计习题解答
1. 指出下列指令的错误: (1)MOV AH,BX
(2)MOV [BX],[SI] (3)MOV AX,[SI][DI]
(4)MOV MYDAT[BX][SI],ES:AX (5)MOV BYTE PTR[BX],1000 (6)MOV BX,OFFSET MYDAT[SI] (7)MOV CS,AX 答:(1)MOV AH,BX AH 为八位,BX为16位
(2)MOV [BX],[SI] 两个操作数不能都是存储单元
(3)MOV AX,[SI][DI] 一个操作数中不能用两个变址寄存器 (4)MOV MYDAT [BX][SI],E8:AX ES
ES 后应为一个变址寄存器,表示偏移量 (5)MOV BYTE PTR[BX],1000
BYTE 说明时BX进行字节操作。 而1000为字 (6)MOV BX,OFFSET MYDAT [SI]
OFFSET 为取某个地址的偏移量,故后面不应用[SI],而应是一个符号地址。 (7)MOV 是数据寻址,不应用程序段寄存器CS.
2.下面哪些指令是非法的?(假设OPl,OP2是已经用DB定义的变量) (1)CMP l5,BX (2)CMP OPl,25 (3)CMP OPl,OP2 (4)CMP AX,OPl 答:(1) CMP 15,BX
非法,两个操作数不能一个为字,一个为字节 (2)CMP OP1,25 正确 (3)CMP OP1,OP2 正确 (4)CMP AX,OP1
非法,两操作数不能一个为字,一个为字节
3.假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列指令中哪些是非法的?它们的错误是什么? (1)MOV BP,AL
(2)MOV WORD_OP[BX+4*3][DI],SP (3)MOV WORD_OPl,WORD_OP2 (4)MOV AX,WORD_OPl[DX] (5)MOV SAVE_WORD,DS
(6)MOV SP,SS:DATA_WORD[BX][SI] (7)MOV [BX][SI],2
(8)MOV AX,WORD_ OPl+WORD_OP2 (9)MOV AX,WORD_ OPl-WORD_OP2+100 (10)MOV WORD_ OPl,WORD_ OPl-WORD_OP2 答:(1)MOV BP,AL
非法,BP为16位 AL为八位 (2)MOV WORD_OP[BX+4*3][DI] ,SP 正确
(3)MOV WORD_OP1 ,WORD_OP2 非法,两个操作数不能都是变量 (4)MOV AX , WORD_OP1[DX]
非法,[DX]应改为[BX],[BP],[SI]或[DI],则为寄存器相对寻址。 (5)MOV SAVE_WORD ,DS
非法,未指明数据段地址DS的偏移量 (6)MOV SP,SS:DATA_WORD[BX][SI]
非法,SS与[BX],[SI]不匹配,SS的偏移量用SP (7)MOV [BX][SI] ,2 正确
(8) MOV AX,WORD_OP1+WORD_OP2 正确
(9) MOV AX, WORD_OP1—WORD_OP2+100 正确 (10)MOV WORD_OP1,WORD_OP1—WORD_OP2 非法
4.假设VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处: (1)ADD VAR1,VAR2 (2)SUB AL,VAR1 (3)JMP LAB[SI] (4)JNZ VARl (5)JMP NEAR LAB 答:(1) ADD VAR1,VAR2
ADD指令中,目的操作数必须是寄存器或存储单元。 (2)SUB AL,VAR1
AL为8位的,而VAR为字变量16位 (3)JMP LAB [SI]
格式不对,LAB处应为一偏移量,而不是标号。 (4)JNZ VAR1
JNZ 为非零转移,应转移到某个程序段,故后面应为一个标号。 (5)JMP NEAR LAB
段内直接转移,格式应为 JMP NEAR PTR LAB