2010级汇编语言典型问题
需要注意的问题
1. 对大多数指令而言,目标(目的)操作数不能使用立即 寻址方式;
2. EA只对存储器操作数;立即寻址和寄存器寻址无物理地 址; 3. 对存储器操作数,能用于存放地址的寄存器是:
BX
BP
SI
DI;其它寄存器不能使用。
4. 对大多数指令而言,目标(目的)操作数和源操作数不 能同时使用存储器操作数; 5. 计算物理地址时,BP默认与SS搭配;BX、SI、DI默认与 DS搭配。
答案:AX=320EH
课堂练习
已知OPER1和OPER2为16位带符号数,分析下面程序段功能。 MOV AX,OPER1 MOV BX,OPER2 MOV CX,0 CMP AX,0 JNL L1 NEG AX L1: ADD CX,AX CMP BX,0 JNL L NEG BX L: ADD CX,BX CX←|OPER1|+|OPER2| 程序段完成的功能是: 。
AGAIN:MOV AX,[SI] CMP AX,0
JLE
NEXT
ADD SUM,AX INC NEXT: COUNT
ADD SI,2 LOOP AGAIN MOV AX,4C00H INT 21H
END START
2. 参考程序:
CODE SEGMENT ASSUME CS:CODE START:MOV BL,1 MOV CX,0 AGAIN:MOV AL,BL MUL BL ; ;CX清零,用于统计级数的和 ; ;求平方,指令也可使用IMUL
串操作程序
【例】: 在数据段DATAREA中有一个字符串,其长度为17,要求把它们
转送到附加段EXTRA中的一个缓冲区。 程序如下: ;先完成数据段和附加段定义,其中源串放在数据段,目的串放在附加 段。
DATAREA SEGMENT
MESS1 DATAREA ENDS EXTRA SEGMENT MESS2 EXTRA ENDS DB
ADD CX,AX
CMP CX,1000 JG DISPLAY
;平方和
;比较CX是否大于1000 ;是,则转入显示处理
INC
JMP
BL
SHORT AGAIN
;不是,BL加1
;重复执行
DISPLAY:MOV DL,BL CMP DL,9 JG ADD37 ADD DL,30H JMP NEXT ADD37: ADD DL,37H NEXT: MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START
;定义数据段
DB ‘PERSONAL COMPUTER $’ ;定义附加段 17 DUP(?)
;在存储器中分配17个字节单元的空间
CODE SEGMENT ASSUME CS:CODE, DS:DATAREA, ES:EXTRA START: MOV AX,DATAREA MOV DS,AX ;数据段地址送DS MOV AX,EXTRA MOV ES,AX ;附加段地址送ES LEA SI,MESS1 ;MESS1 SI LEA 首地址送 SI,MESS1+16 ; LEA 首地址送 DI,MESS2+16 ; LEA DI,MESS2 ;MESS2 DI MOV CX,17 ; MOV CX,17 ;字符串大小 STD CLD ;地址自动增量方式 REP MOVSB ;重复实现串复制 MOV AX, 4C00H 思考:如果从末地址开始传送,程序该如何实现? INT 21H CODE ENDS END START
答: AX=28DFH。
分析: 第四条指令执行完,(AX)=16AAH,CF=1。 第五条指令注意要加上CF的值。
● DUP操作可以嵌套 例: DUP嵌套使用 ARRAY3 DB 100 DUP(0,2 DUP(1,2),0,3) 占用的存储单元数为: 100×(1+2×(1+1)+1+1)=700B 试给出下列变量所占用的存储空间(字节数)
常见的非法指令错误
1. MOV
2. MOV 3. ADD 4. SUB 6. DIV
CS, AX
ES, 2000H AX, DL 2000H, BX 600H
5. IMUL 400H 7. XCHG AX, 2000H
8. SHL
9. ADD
CL, AX
AX, [DX]
10.MOV AX, ARRAY[BX][BP]
简单程序设计练习
1. 已知字数组ARRAY,有N个元素,试编写程序,把数组中 的正数累加,结果放在SUM中(不考虑溢出),并统计正数 个数,保存到COUNT。 2. 试编写程序,求级数12+22+32+ 的前n项和刚大于1000 的项数n。并在屏幕上显示结果(用十六进制)。 (注:n是一个满足十六进制的个位数)
11.MOV [BX], ARRAY[SI]
乘法除法指令使用 【例】 分析指令执行后,AX的值
MOV MOV IMUL MOV MOV AX, 0FFFAH BL, AH BL AX, 0A9H BL, 0E8H AX=6
DIV
BL
AX=0A900H
例:分析下列程序段执行后,AX的值: (AX)=0,CF=0 XOR AX,AX (AX)=0A2D5H,CF=0 MOV AX,0A2D5H (AX)=0A2D5H,CF=0 MOV CL,3 (AX)=16AAH, CF=1 RCL AX,CL ADC AX,1234H (AX)=28DFH, CF=0
; ; 比较是否大于9 ;是则转ADD37执行 ;不是,则加30H,把数符变成ASCII码
ARRAY DB ‘ABC’,200 DUP (20,10 DUP(‘EF’,5,6),10) TEST DW 1,2,10 DUP(20 DUP (9, 5 DUP ARRAY 8403 , TEST 6424
例:试分析下列程序段执行完后,AX的值。 … … ORG 3200H ARRAY DB ‘abc’ EVEN LIST DW 1,2,3,$+4,5 …… MOV CX,3 LEA BX,LIST ; (BX)=3204H SHL CX,1 ; (CX)=6 ADD BX,CX ; (BX)=320AH MOV AX,[BX] ;