(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
5.画图说明下列语句所分配的存储空间及初始化的数据值。 BYTE-VAR DB ‘BYTE’,12,-12H,3DUP(0,?,2DUP(1,2),?) WORD-VAR DW 5DUP(0,1,2),?,-5,’BY’,’TE’, 256H 解答:(1)BYTE-VAR (2)WORD-VAR
┊ 42 B
00 59 Y 00 54 T
01 45 E
12 00 OC -12H 02 F4H 00 0 ┊ - ┊ 1
00
2 00 1
01 2 00 - 02 0
00 -
- 1 - 2 FB 1 FF 2 59 -
42
0 45 -
54 1 56 2 02 1
┊ 2
-
6.试列出各种方法,使汇编程序把5150H存入一个存储器字中。 解答:(1) DW 5150H;(2)DB 50H,51H;(3)DB ‘PQ’
7.请设置一个数据段DATASG,其中定义以下字符变量或数据变量。FLD1B为字符串变量:‘personal computer’; FLD2B为十进制数字节变量:32; FLD3B为十六进制数字节变量:20; FLD4B为二进制数字节变量:01011001;
FLD5B为数字的ASCII字符字节变量:32654; FLD6B为10个零的字节变量;
FLD7B为零件名(ASCII码)及其数量(十进制数)的表格: PART1 20 PART2 50 PART3 14
FLD1W为十六进制数字变量:FFF0; FLD2W为二进制数字变量:01011001; FLD3W为(7)中零件表的地址变量;
FLD4W为包括5个十进制数的字变量:5,6,7,8,9; FLD5W为5个零的字变量;
FLD6W为本段中字数据变量和字节数据变量之间的地址差。 解答: DATASG SEGMENT
FLD1B DB ‘personal computer’ FLD2B DB 32D FLD3B DB 14H
FLD4B DB 01011001B FLD5B DB 32654
FLD6B DB 10DUP(0) FLD7B DB ‘PART1’,20D,‘PART2’,50D,‘PART3’,14D FLD1W DW 0FFFOH FLD2W DW 01011001B FLD3W DW [FLD7B]
FLD4W DW 5,6,7,8,9 FLD5W DW 5DUP(0) FLD6W DW FLD1W-FLD1B DATASG ENDS
8.假设程序中的数据定义如下: PARTNO DW ?
PNAME DB 16 DUP(?) COUNT DD ?
PLENTH EQU $-PARTNIO
问PLENTH的值为多少?它表示什么意义?
解答:PLENTH代表着PARTNO至PLENTH的地址差,也即三段数据的字节数PLENTH=22。 9.有符号定义语句如下: BUFF DB 1,2,3,‘123’ EBUFF DB 0
L EQU EBUFF-BUFF 问L的值为多少? 解答:L=6
10.假设程序中的数据定义如下: LNAME DB 30 DUP(?) ADDRESS DB 30 DUP(?) CITY DB 15 DUP(?) CODE-LIST DB 1,7,8,3,2
(1)用一条MOVE指令将LNAME的偏移地址放入AX。
(2)用一条指令将CODE-LIST的头两个字节的内容放入SI。
(3)写一条伪操作使CODE-LENGTH的值等于CODE-LIST域的实际长度。 解答:(1)MOVE AX,0FFSET LNAME;(2)MOVE SI,0701H; (3)DE-LENGTH EQU LENGTH CODE-LIST。
11.试写出一个完整的数据段DATA_SEG,它把整数5赋与一个字节,并把整数-1,0,2,5和4放在10字数组DATA_LIST的头5个单元中。然后写出完整的代码段,其功能为:把DATA-_LIST中头5个数中的最大值和最小值分别存入MAX和MIN单元中。 解答:DATA_SEG SEGMENT LENGTH DB 5
DATA_LIST DW –1,0,2,5,4,5DUP(?) MAX DW ? MIN DW ?
DATA_SEG ENDS CODE_SEG SEGMENT
ASSUME CS:CODE_SEG,DS:DATA_SEG START:MOV AX,DATA_SEG
相关推荐: