第三章
1.分别说明下列指令的源操作数和目的操作数各采用什么寻址方式。
源操作数 目的操作数 源操作数 目的操作数
(1)MOV AX, 2048H 立即寻址 寄存器寻址
(2) MOV CL, 0FFH 立即寻址 寄存器寻址
(3) MOV BX, [SI] 寄存器间接寻址 寄存器寻址
(4) MOV 5[BX], BL 寄存器寻址 寄存器相对寻址
(5) MOV [BP+100H],AX 寄存器寻址 寄存器相对寻址
(6) MOV [BX+DI], ‘$’ 立即寻址 基址变址寻址
(7) MOV DX, ES:[BX+SI] 基址变址寻址 寄存器寻址
(8) MOV VAL[BP+DI], DX 寄存器寻址 相对基址加变址寻址
(9) IN AL, 05H 直接寻址 寄存器寻址
(10) MOV DS, AX 寄存器寻址 寄存器寻址
2. 已知:DS=1000H, BX=0200H, SI=02H, 内存 10200H~10205H 单元的内容分别为 10H, 2AH, 3CH, 46H, 59H, 6BH。下列每条指令执行完后 AX 寄存器的内容各是什么?
(1)MOV AX, 0200H (AX)=0200H
(2) MOV AX, [200H] (AX)=2A10H
(3) MOV AX, BX (AX)=0200H
(4) MOV AX, 3[BX] (AX)=5946H
(5) MOV AX, [BX+SI] (AX)=463CH
(6) MOV AX, 2[BX+SI] (AX)=6B59H
6.指出下列指令中哪些是错误的,错在什么地方
(1)MOV DL, AX 错误,源和目的操作数类型不匹配,DL 是 8 位寄存器,AX 是 16 位寄存器。
(2)MOV 8650H, AX 错误,立即数不能作为目的操作数。
(3)MOV DS, 0200H 错误,不能用立即数直接给段寄存器赋值。
(4)MOV [BX], [1200H] 错误,MOV 不能在两个存储单元之间直接传送数据
(5)MOV IP, 0FFH 错误,IP 不能作目的操作数或不能用立即数直接给 IP
寄存器赋值。
(6)MOV [BX+SI+3], IP 错误,IP 不能做源操作数。
(7) MOV AX, [BX][BP] 错误,基址变址寻址方式必须是一个基址寄存器与一个变址寄存器,不能两个同时为基址寄存器(BX、BP 均为基址寄存器)。
(8)MOV AL, ES:[BP] 正确
(9)MOV DL, [SI][DI] 错误,基址变址寻址方式必须是一个基址寄存器与一个变址寄存器,不能两个同时为变址寄存器(SI、DI 均为变址寄存器)。
(10)MOV AX, OFFSET 0A20H 错误,OFFSET 后必须是存储单元标号地址,不能是立即数。
(11) MOV AL, OFFSET TABLE 错误,操作数类型不匹配,AL 为 8 位, TABLE 为 16 位。
(12)XCHG AL, 50H 错误,交换指令 XCHG 的操作数不能是立即数。
(13)IN BL, 05H 错误,IN 指令的目的操作数必须是累加器
(14)OUT AL, 0FFEH 错误,OUT 指令的源操作数必须是累加器,目的操作数为 8 位 I/O 端口地址或用 DX 做桥梁的 16 位I/O 端口地址。
8. 已知当前数据数据段中有一个十进制数字 0~9 的 7 段码表,其数值依次为 C0H, F9H, A4H, B0H, 99H, 92H, 82H, F8H, 80H, 98H。要求用 XLAT 指令将十进制数 57 转换成相应的7 段码值,存到 BX 寄存器中,试写出相应的程序段。
解:
DATA SEGMENT
TABLE DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 98H
DATA ENDS
……
MOV AL, 5
MOV BX, OFFSET TABLE
XLAT
MOV DL,AL
MOV AL, 7
XLAT
MOV BL,AL
MOV BH,DL
HLT
调试程序:
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
DATA SEGMENT
TABLE DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 98H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AL, 5
MOV BX, OFFSET TABLE
XLAT
MOV DL,AL
MOV AL, 7
XLAT
MOV BL,AL
MOV BH,DL
HLT
CODE ENDS
END START
11. 假设数据定义如下:
DATA SEGMENT
STRING DB ‘The Personal Computer & TV’
DATA ENDS
试用字符串操作指令编程完成以下功能:
(1)把该字符串传送到附加段中偏移地址为 GET_CHAR 开始的内存单元中。
解:程序段如下:
LEA SI,STRING ;置源串偏移地址
LEA DI,GET_CHAR ;置目的串偏移地址
MOV CX,26 ;置串长度
CLD ;方向标志复位
REP MOVSB ;字符串传送
HLT
12.编程将 AX 寄存器中的内容以相反的次序传送到 DX 寄存器中,并要求 AX 中的内容不被破坏,然后统计 DX 寄存器中 1 的个数是多少。
解:将 AX 的内容用 ROR 循环右移,16 次之后 AX 的内容不变(如果用算术/逻辑右移
SHL/SAL,则 AX 的内容破坏,需要用堆栈 PUSHU AX/POP AX 保护),其最低位移入 CF
中,再使用 RCL 循环左移将 CF 中的值移入 DX 中。并且,如果 CF 的值为 1,则将 BL 加
1。
MOV CX, 16
XOR BL, BL
LP1: ROR AX, 1
JNC LP2
INC BL
LP2: RCL DX,1
LOOP LP1
HLT
调试程序:
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
DATA SEGMENT
BUF DW 12
BUF1 DW 100 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: PUSH DS
MOV AX,DATA
MOV DS,AX
MOV AX,1234H
MOV CX, 16
XOR BL, BL
LP1: ROR AX, 1
JNC LP2
INC BL
LP2: RCL DX,1
LOOP LP1
HLT
CODE ENDS
END START
15. 某班有七个同学的英语成绩低于 80 分,分数存在 ARRAY 数组中,试编程完成以下工作:给每人加 5 分,结果存到 NEW 数组中.
解:
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
DATA SEGMENT
ARRAY DB 7 DUP(?)
NEW DB 7 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV CX, 7
MOV BX, 0
LP1: MOV AL, ARRAY[BX]
ADD AL, 05H
DAA
MOV NEW[BX], AL
INC BX
LOOP LP1
HLT
CODE ENDS
END START
调试程序:
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
DATA SEGMENT
ARRAY DB 65H,76H,78H,54H,90H,85H,68H
NEW DB 7 DUP(?)
BUF1 DW 100 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: PUSH DS
MOV AX,DATA
MOV DS,AX
MOV CX, 7
MOV BX, 0
LP1: MOV AL, ARRAY[BX]
ADD AL, 05H
DAA
MOV NEW[BX], AL
INC BX
LOOP LP1
HLT
CODE ENDS
END START