(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
┊ 00 00 01 00 02 00 ┊ ┊ 00 00 01 00 02 00 - - FB FF 59 42 45 54 56 02 ┊ 42 B
Y 59 T
54 E
45 12
OC -12H F4H 0 -
1
2 1
2 -
0
-
1 2
1
2
-
0 -
1 2 6.试列出各种方法,使汇编程序把5150H存入一个存储
1 器字中。
2 解答:(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 MOV DS,AX
MOV SI,OFFSET DATA_LIST
MOV AX,[SI] MOV BX,[SI] MOV CX,LENGTH
XOR AX,AX XOR BX,BX CLC
AGAIN:CMP AX,[SI] JG NEXT1 MOV AX,[SI] NEXT1:CMP BX,[SI] JNG NEXT2 MOV BX,[SI] NEXT2:JNZ AGAIN MOV MAX,AX MOV MIN,BX CODE ENDS END START
12.给出等值语句如下: ALPHA EQU 100 BETA EQU 25 GAMMA EQU 2
下列表达式的值是多少? (1)ALPHA*100+BETA
(2)ALPHA MOD GAMMA+BETA (3)(ALPHA+2)*BETA-2 (4)(BETA/3)MOD5
(5)(ALPHA+3)*(BETA MOD GAMMA) (6)ALPHA GE GAMMA (7)BETA AND 7 (8)GAMMA OR 3 解答:
(1)=10025;(2)=19;(3)=2548;(4)=3;(5)=103;(6)=0;(7)=01H;(8)=03H。 13.对于下面的数据定义,三条指令分别汇编成什么? TABLEA DW 10 DUP(?) TABLEB DB 10 DUP(?) TABLEC DB ‘1234’ ┊ ┊
MOVE AX,LENGTH TABLEA MOVE BL,LENGTH TABLEB MOVE CL,LENGTH TABLEC 解答:
MOVE AX,10 MOVE BL,10 MOVE CL,1
14.对于下面的数据定义,各条MOVE指令单独执行后,有关寄存器的内容是什么? FLDB DB
TABLEA DW 20DUP(?) TABLEB DB ‘ABCD’ MOVE AX,TYPE FLDB MOVE AX,TYPE TABLEA
MOVE CX,LENGTH TABLEA MOVE DX,SIZE TABLEA MOVE CX,LENGTH TABLEB 解答: AX=0001H AX=0002H CX=0014H DX=0028H CX=0001H。
15.指出下列伪操作表达方式的错误,并改正之。 (1)DATA_SEG SEG
(2)SEGMENT ‘CODE’
(3)MYDATA SEGMENT/DATA ┆
ENDS (4)MAIN_PROC PROC FAR ┆
END MAIN_PROC MAIN_PROC ENDP 答:(1) DATA-SEG SEGMENT
(2) CODE SEGMENT PARA 'CODE'
(3) /DATA错。定义数据段应在代码段中用ASSUME。ENDS缺少‘MYDATA’。 (4) 多余END,MAIN-PROC应删除。 16.按下面的要求写出程序的框架 (1)数据段的位置从0E000H开始,数据段中定义—个l00字节的数组,其类型属性既是字
又是字节;
(2)堆栈段从小段开始,段组名为STACK,
(3)代码段中指定段寄存器,指定主程序从1000H开始,给有关段寄存器赋值; (4)程序结束。
答: DATA-SEG SEGMENT ORG 0E000H
BYTE-ARRAY LABLE BYTE WORD-ARRAY DW 50 DUP(?) DATA-SEG ENDS
STACK-SEG SEGMENT PARA 'STACK' STACK-SEG ENDS CODE-SEG SEGMENT
ASSUME CS:CODE-SEG,DS:DATA-SEG,SS:STACK-SEG ORG 1000H
START: MOV AX ,DATA-SEG MOV DS ,AX
MOV AX ,STACK-SEG MOV SS ,AX . .
CODE-SEG ENDS END START
17.假设在数据段X_SEG、附加段Y_SEG和堆栈段Z_SEG中分别定义了字变量X,Y和Z。试编制一完整的程序计算
X?X+Y+Z