(5) JNZ VAR1
解:(1) ADD VAR1,VAR2
错误,两个操作数不能都为存储单元,可改为 MOV BX,VAR2 ADD VAR1,BX
(2) MOV AL,VAR2
错误,数据类型不匹配,可改为MOV AX,VAR2 (3) SUB AL,VAR1
错误,数据类型不匹配,可改为SUB AX,VAR1 (4) JMP LAB[SI]
错误,寄存器相对寻址形式中不能用标号做位移量,可改为JMP VAR1[SI] (5) JNZ VAR1
错误,条件跳转指令只能进行段内短跳转,所以后面只能跟短标号。可改为JNZ LAB (6) JMP NEAR LAB
错误,缺少运算符PTR,可改为JMP NEAR PTR LAB
注:本题错误改正部分有的答案并不唯一,可参考原题题意改成合法形式。
9. 已知 (AL)=6CH, (BL)=0A9H,试问执行指令ADD AL,BL后,AF、CF、OF、PF、SF、和
ZF的值各为多少?
解:指令ADD AL,BL的功能为AL+BL→AL,其运算过程如下:
6CHA9H 115H
由以上运算可知,
低4位向高4位有进位,所以AF=1; 最高位产生了进位,所以CF=1;
该运算是一个正数加一个负数,所以不会产生溢出,所以OF=0;只有正数+正数=负数,或者负数+负数=正数时,才可能产生溢出现象;
该运算结果的低8位为0001 0101,含有奇数个1,所以PF=0; 该运算结果的最高位为符号位,为0,所以SF=0; 当前的运算结果不为零,所以ZF=0。 10.试判断下列程序执行后,(BX)=的内容。
MOV CL,5 MOV BX,01C9H ROL BX,1 RCR BX,CL
解:该程序段是首先将BX内容不带进位循环左移1位,再循环右移5位。即相当于将原BX内容不带进位循环右移4位
第 9 页 共 27 页
01C9H=0000 0001 1100 1001B
程序执行后,为1001 0000 0001 1100B 故结果为901CH
11.写出能够完成下列操作的8086CPU指令。 (1) 把4629H传送给AX寄存器; (2) 从AX寄存器中减去3218H; (3) 把BUF的偏移地址送入BX中。
12.根据以下要求写出相应的汇编语言指令。
(1) 把BX和DX寄存器的内容相加,结果存入DX寄存器中;
(2) 用BX和SI的基址变址寻址方式,把存储器中的一个字节与AL内容相加,并保存在AL寄存器中;
(3) 用寄存器BX和位移量21B5H的变址寻址方式把存储器中的一个字和(CX)相加,并把结果送回存储器单元中;
(4) 用位移量2158H的直接寻址方式把存储器中的一个字与数3160H相加,并把结果送回该存储器中;
(5) 把数25H与(AL)相加,结果送回寄存器AL中。 13.按下列要求写出相应的指令或程序段。 (1)使BL寄存器中的高、低四位互换; (2)屏蔽AX寄存器中的b10和b5位;
(3)分别测试AX寄存器中b13和b2位是否为1。
14.执行以下两条指令后,标志寄存器FLAGS的六个状态为各为何值?
MOV AX,95C8H ADD AX,8379H
解:指令的功能为95C8H+8739H→AL,其运算过程如下:
95C8H
8379H
11941H 由以上运算可知,
低4位向高4位有进位,所以AF=1; 最高位产生了进位,所以CF=1;
该运算是两个负数相加结果为正数,产生溢出,所以OF=1; 该运算结果的低8位为0100 0001,含有偶数个1,所以PF=1; 该运算结果的最高位为符号位,为0,所以SF=0; 当前的运算结果不为零,所以ZF=0。
第 10 页 共 27 页
15.若(AL)=85H,(BL)=11H,在分别执行指令MUL和IMUL后,其结果是多少?
第4章 汇编语言程序设计
1. 请分别用DB、DW、DD伪指令写出在DATA开始的连续8个单元中依次存放数据11H、
22H、33H、44H、55H、66H、77H、88H的数据定义语句。 解:定义如下:
DATA DB 11H,22H,33H,44H,55H,66H,77H,88H DW 2211H,4433H,6655H,8877H DD 44332211H,88776655H
2. 若程序的数据段定义如下,写出各指令语句独立执行后的结果:
DSEG SEGMENT
DATA1 DB 10H,20H,30H DATA2 DW 10 DUP(?) STRING DB ‘123’ DSEG ENDS
(1) MOV AL,DATA1
(2) MOV BX,OFFSET DATA2 (3) LEA SI,STRING ADDBX,SI 解:(1)取变量DATA1的值. 指令执行后,(AL)=10H. (2)取变量DATA2的偏移地址. 指令执行后,(BX)=0002H.
(3)先取变量STRING的偏移地址送寄存器SI,之后送SI的内容与DI的内容相加并将结果送DI.指令执行后,(SI)=0016H;(DI)=(DI)+0018H
3. 试编写求两个无符号双字长数之和的程序。两数分别在MEM1和MEM2单元中,和放
在SUM单元。 解:程序编写如下: DATA SEGMENT
MEM1 DW 6655H,8877H MEM2 DW 8877H,6655H
SUM DW 2 DUP(?) ;55667788H+77885566H=0CCEECCEEH DATA ENDS CODE SEGMENT
第 11 页 共 27 页
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,MEM1+2 ADD AX,MEM2+2 MOV SUM+2,AX MOV AX,MEM1 ADC AX,MEM2 MOV SUM,AX MOV AH,4CH INT 21H CODE ENDS
END START
4. 试编写程序,测试AL寄存器的第4位是否为0?
解:程序编写如下: CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: TEST AL,08H JZ L1
┇
L1:
┇
MOV AH,4CH
INT 21H CODE ENDS
END START
5. 编写程序,将BUFFER中的一个8位二进制数转换为ASCII码,并按位数高低顺序存
放在ANSWER开始的内存单元中。
解:程序编写如下: DATA SEGMENT
BUFFER DB 4AH
ANSWER DB 2 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
第 12 页 共 27 页