第 4章 指令系统
第 4章 8086指令系统
本章主要教学内容
1,8086指令的基本格式
2,8086指令系统的寻址方式
3,8086指令的应用
本章教学目的
使学生掌握指令的寻址方式过程,掌握指令的应
用。
教学重点,指令系统的寻址方式和指令的应用
教学难点,指令的寻址方式
第 4章 指令系统
第 4章 8086指令系统
4.1 指令的基本概念和基本格式
4.2 指令 的寻址方式
4.3 8086指令系统
4.4 中 断调用类指令
开 始
第 4章 指令系统
4.1 指令的基本概念和指令格式
机器指令:指挥计算机完成某种操作
的命令 。
从计算机组成的层次结构来说, 计算
机指令有机器指令, 伪指令和宏指令之分 。
指令格式如下,
操作符 OPD,OPS
OPD,目的操作数
OPS,源操作数
第 4章 指令系统
4.2 指令寻址方式
4.2.1 寻 址方式的基本概念
4.2.2 与数据有关的寻址 方式
4.2.3 I/O端口寻址 方式
返回本章首页
第 4章 指令系统
4.2.1 寻址、寻址方式的概念
指令中操作数字段实质上是指出操作数存放
于何处。一般来说,操作数可以跟随在指令操作
码之后,称为立即数;操作数也可以存放在 CPU
内部的寄存器中,称为寄存器操作数。绝大多数
的操作数存放在内存储器中,称为存储器操作数。
指令指定操作数的位置,即给出地址信息,在执
行时需要根据这个地址信息找到需要的操作数。
这种寻找操作数的过程称为寻址,而寻找操作数
的方法称为寻址方式。
第 4章 指令系统
4.2.2 与数据有关的寻址方式
1,立即寻址
立即寻址方式中, 指令操作码和操作数都在存
储器代码段中 。
汇编格式,n( n为立即操作数, 是用 8位或 16位二进
制补码表示的有符号数 )
功能:操作数存放在
存储器, 指令下一单元的
内容为立即操作数 n。
图形表示如右,
第 4章 指令系统
【例 4.1】
【 例 2.5】 MOV AX,10
执行后 ( AX) =?
该例中源操作数为立即寻址方式, 立即数为 10,存
放在指令的下一单元 。
图形表示,
执行,10→AX
执行后,( AX) =000AH
返回本节
第 4章 指令系统
2,寄存器寻址
寄存器寻址方式的操作数在指令指明的寄
存器中 。
汇编格式,R 其中 R表示寄存器名 。
功能:操作数直接存放在寄存器 R中 。
图形表示,
R
指令 →操作数
第 4章 指令系统
【例 4.2】
下列程序执行后, ( AX) =?, ( BX) =?
MOV AX,1234H
MOV BX,5678H
ADD AX,BX
该程序中 MOV指令为数据传送指令操作符, ADD指令
为加法指令操作符, 三条指令皆为双操作数指令 。 第一, 二
条指令 AX,BX皆为目的操作数地址, 为寄存器寻址方式 。
第三条指令中, AX为目的操作数地址, BX为源操作数地址 。
源地址和目的地址皆为寄存器寻址方式 。
第 4章 指令系统
图形表示,
执行,1234H→AX
5678H→BX
( AX) +( BX) →AX
执行后,( AX) =68ACH,( BX) =5678H
返回本节
第 4章 指令系统
3,存储器寻址
如果操作码所需操作数存放在内存储器中,则指令中
需要给出操作数的地址信息。为了提高程序的灵活性,
8086指令系统提供了多种存储器寻址方式
( 1)直接寻址
( 2)寄存器间接寻址
( 3)寄存器相对寻址
( 4)基址变址寻址
( 5)关于段跨跃前缀
第 4章 指令系统
( 1) 直接寻址
汇编格式,① 含有变量的地址表达式 。
② 段寄存器名,[EA] 。
功能:指令下一字单元的内容是操作数的偏移地
址 EA。
图形表示,
第 4章 指令系统
【例 4.3】
【 例 4.3】 寄存器和存储器内容为,( AX) =1212H,
BUF为数据段定义的变量, 其偏移地址是 2000H,
( DS) =3000H,( 32000H) =4545H。
执行指令,MOV AX, BUF
执行后,( AX) =?
图形表示,
执行,( 32000H) →AX
执行后,( AX) =4545H 返回本节
第 4章 指令系统
( 2) 寄存器间接寻址
寄存器间接寻址方式中, 寄存器的内容为
操作数的偏移地址 EA,操作数在存储器中 。
汇编格式,[R]
功能:操作数存放在存储器, 寄存器 R存放
操作数的偏移地址 EA。
第 4章 指令系统
寄存器间接寻址示意图,
例如,MOV AX,[BX]
若 ( DS) = 2000H,( BX) = 1000H,物理地址= 20000H+
1000H= 21000H。 指令执行前, ( AX) = 2030H,( 21000H)
= 0A0H,( 21001H) = 50H,指令执行后, ( AX) = 50A0H,
( 21000H) = 0A0H,( 21001H) = 50H。 指令执行情况如下,
AX
AH AL
数据段 物理地址
A 0 H 21000H
50H 20001H
56H 20002H
第 4章 指令系统
偏移地址 EA计算方法如下,
EA=
[SI] SI作间址寄存器。
[DI] DI作间址寄存器。
[BX] BX作间址寄存器。
[BP] BP作间址寄存器。
第 4章 指令系统
执行指令,MOV AX, [BP]
执 行 后, ( AX) =?,( BP) =?,( SS) =?,
( 20030H) =?
图形表示如下,
【例 4.4】寄存器和存储器内容分别为:
( AX) =0,( BP) =0030H,( SS) =2000H,
( 20030H) =1234H
返回本节
第 4章 指令系统
( 3) 寄存器相对寻址
寄存器相对寻址方式是在指令中给定一个基址寄存
器 ( 或变址寄存器 ) 名和一个 8位或 16位的相对偏移量,
两者之和作为操作数的有效地址 。 对 BX,SI,DI这三个
间址寄存器, 指示的是数据段中的数据, 而用 BP作间址
寄存器, 则指示的是堆栈段中的数据 。
汇编格式,X[R]( X表示位移量, 是 8位或 16位二
进制补码表示的有符号数 ) 。
功能:操作数存放在存储器, 寄存器 R的内容加位移量 X
为操作数的偏移地址 EA。
第 4章 指令系统
偏移地址 EA计算方法如下,
第 4章 指令系统
【例 4.5】
设执行前,( AX) =0040H,( BX) =0030H,
( DS) =2000H,( 20036H) =0050H
执行指 令,ADD 6[BX],AX
执行后, ( AX) =?,( BX) =?,( DS) =?,
( 20036H) =?
图形表示如下,
第 4章 指令系统
执行:( 20036H) +( AX) →20036H
执行后:( AX) =0040H,( BX) =0030H,( DS)
=2000H,( 20036H) =0090H。
返回本节
第 4章 指令系统
( 4) 基址变址寻址
基址变址寻址方式是在指令中给出一个基址寄存器名
和一个变址寄存器名, 两者内容之和作为操作数的有效地
址 。 基址寄存器为 BX或 BP,变址寄存器为 SI或 DI,但指令
中不能同时出现两个基址寄存器或两个变址寄存器 。 如果
基址寄存器为 BX,则段寄存器使用 DS; 如果基址寄存器用
BP,则段寄存器用 SS。
汇编格式,[BR+IR]
功能:操作数存放在存储器, BR的内容加 IR的内容加
位移量 X是操作数的偏移地址 EA。
第 4章 指令系统
操作数偏移地址 EA计算方法如下
返回本节
第 4章 指令系统
【例 4.6】
例如 MOV AL,[BX+ SI]( MOV AL,[BX][SI])
若 指 令 执 行 前, ( DS) = 1000H,( BX) =
0010H,( SI) = 0002H,( 10012H) = 45H
则 EA= ( BX) + ( SI) = 0012H,PA= ( DS)
× 10H+ EA= 10012H
指令执行后 ( AL) = 45H。
返回本节
第 4章 指令系统
( 5) 跨段问题
按前述规定:若选用 BP作间址基址寄存器, 变址寄存器
或基址寄存器, 则操作数在堆栈段, 操作数的物理地址 PA由
堆栈段寄存器 SS的内容左移 4位与偏移地址 EA相加后形成;否
则, 操作数在数据段, 操作数的物理地址 PA由数据段寄存器
DS的内容左移 4位与偏移 EA相加后形成 。 该规定为系统默认状
态 。 当要否定默认状态, 到非约定段寻找操作数时, 必须用
跨段前缀指明操作数的段寄存器名 。
汇编格式:段寄存器名:操作数地址 。
功能:段寄存器名指明操作数属哪个段。
第 4章 指令系统
【例 4.7】跨段前缀示例。
MOV AX,DS,[BP]
MOV CX,SS,[SI]
该例中, DS:, SS,均为跨段前缀, 此时默认
状态无效, 操作数的物理地址 PA由段寄存器内
容左移 4位加偏移 EA形成 。 上述 2条指令的源操
作数物理地址分别为,
PA1 =( DS) 左移 4位 +[BP]
PA2 =( SS) 左移 4位 +[SI
返回本节
第 4章 指令系统
4.2.3 I/O端口寻址方式
8086CPU采用独立编址的 I/O端口, 可以最多访问 64K个字节端口
或 32K个字端口, 用专门的 IN指令和 OUT指令访问 。 I/O端口寻址只用
于这两种指令中 。 寻址方式有如下两种 。
1,直接端口寻址
在指令中直接给出端口地址, 端口地址一般采用 2位十六进制数,
也可以用符号表示, 这种寻址方式为直接端口寻址 。 因此, 直接端口
寻址可访问的端口数为 0~ 255个 。
例如,IN AL,25H
2,寄存器间接端口寻址
如果访问的端口地址值大于 255,则必须用 I/O端口的间接寻址方式 。
所谓间接寻址, 是指把 I/O端口的地址先送到 DX中, 用 DX作间接寻址
寄存器, 而且只能用 DX寄存器 。
例如,MOV DX,378H
OUT DX,AL
第 4章 指令系统
4.3 8086指令系统
包括数据传送类指令, 算术运算类指令,
位 操作 类指令, 串操作类指令, 控制转移类
指令, 处理机控制类指令 。 后几节将分别介
绍这些指令的语句格式和功能 。
4.3.1 数据传送类指令
4.3.2 算术运算类指令
4.3.3 逻辑运算与移位类指令
4.3.4 串操作类指令
4.3.5 控制转移类指令
第 4章 指令系统
4.3.1 数据传送类指令
1 通用数据传送指令
2 累加器专用传送指令
3 地址传送指令
4 标志寄存器传送指令
返回本章首页
第 4章 指令系统
1 通用数据传送指令
( 1) 传送指令 MOV
( 2) 堆栈指令 PUSH/ POP
( 3) 数据交换指令 XCHG
第 4章 指令系统
( 1) 传送指令 MOV
语句格式,MOV OPD,OPS
功能:将源操作数传送入目的地址, 源
地址内容不变 。 即 ( OPS) →OPD 。
下图 4.1描述了 MOV指令在传送数据时允
许传送的路径及类型 。
第 4章 指令系统
图 4.1 MOV指令所允许的数据传送路径及类型
第 4章 指令系统
MOV指令的形式有如下几种,
1) 从通用寄存器到通用寄存器 MOV reg1,reg2
2) 立即数传送到通用寄存器 MOV reg, data
3) 通用寄存器和存储单元之间
MOV mem (reg),reg (mem)
4) 立即数传送到存储单元 MOV mem,data
5) 段寄存器与通用寄存器间的数据传送
MOV seg,reg 或 MOV reg,seg
6) 段寄存器与存储单元间的数据传送
MOV seg,mem 或 MOV mem,seg
第 4章 指令系统
【例 4.8】 存储器与寄存器间数据传送。
MOV AX,BUF ; BUF是变量,源操作数为直接寻址
MOV BH,[DI] ; 源操作数为寄存器间接寻址
MOV DI,ES,3[SI] ; 源操作数为变址寻址,使用跨段前缀
MOV BP,3[BX+SI] ; 源操作数为基址加变址寻址
MOV BUFA,DL ; BUFA是一字节变量
MOV [BP],AX ; 使用 SS段寄存器
MOV DS,[BP],DL ; 使用跨段前缀
MOV BUF,DS ; BUF是个字变量
MOV ES, BUF
第 4章 指令系统
2.数据交换指令 XCHG
语句格式,XCHG OPD,OPS
功能:将源地址与目的地址中的内容互换 。 即 ( OPD) →OPS,
( OPS) →OPD 。
【 例 4.9】 寄存器与存储器之间数据交换 。
MOV AX,5678H ; ( AX) =5678H
MOV BX,0FFFFH ; ( BX) =0FFFFH
XCHG AX,BX ; ( AX) =0FFFFH, ( BX) =5678H
第 4章 指令系统
( 2) 堆栈操作指令
1) 进栈指令 PUSH
2) 出栈指令 POP
第 4章 指令系统
1)进栈指令 PUSH
语句格式,PUSH OPS
功能:将寄存器, 段寄存器或存储器中的一
个字数据压入堆栈, 堆栈指针减 2。
即,① ( SP) -1 →SP ( OPS) 15~8→[SP]
② ( SP) -1 →SP ( OPS) 7~0→[SP]
第 4章 指令系统
2)出栈指令 POP
语句格式,POP OPD
功能,将栈顶元素弹出送至某一寄存器, 段寄存器
( 除 CS外 ) 或存储器, 堆栈指针加 2。
从 POP指令功能可看出, 该指令为 PUSH指令的逆过程 。
即,① ( [SP]) → ( OPD) 7~0 ( SP) +1 →SP
② ( [SP]) → ( OPD) 15~8 ( SP) +1 →SP
返回本节
第 4章 指令系统
2.累加器专用传送指令
( 1)输入 /输出指令
( 2) XLAT查表指令
第 4章 指令系统
1)输入指令 IN
输入指令用来从指定的外设寄存器取信息送入
累加器 。 它有四种形式,
语句格式,IN AL,PORT
功能,( PORT) →AL
语句格式,IN AX,PORT
功能,( PORT) →AX
语句格式,IN AL,DX
功能,( [DX]) →AL
语句格式,IN AX,DX
功能,( [DX]) →AL
第 4章 指令系统
2)输出指令 OUT
输出指令用来把累加器的内容送往指定的外设
存储器, 它有四种形式,
语句格式,OUT PORT,AL
功能,( AL) →PORT
语句格式,OUT PORT,AX
功能,( AX) →PORT
语句格式,OUT DX,AL
功能,( AL) →[DX]
语句格式,OUT DX,AX
功能,( AX) →[DX]
返回本节
第 4章 指令系统
( 2)查表转换指令 XLAT
语句格式,XLAT OPS或 XLAT
功能:将 ( BX) 为首址 ( AL) 为位移量
的字节存储单元中的数据送 AL寄存器 。
即 ( [BX+AL]) →AL 。
返回本节
第 4章 指令系统
3 地址传送指令
( 1) 传送有效地址指令 LEA
( 2) 传送有效地址及数据段首址指令 LDS
( 3) 传送有效地址及附加数据段指令 LES
第 4章 指令系统
( 1)传送有效地址指令 LEA
语句格式,LEA OPD,OPS
功能:主存按源地址的寻址方式计算偏移地址,
将偏移地址送入指定寄存器 。
【 例 4.10】 主存偏移地址的获取 。
MOV BX,0100H ; ( BX) =0100H
MOV SI,0210H ; ( SI) =0210H
LEA BX,1234[BX+SI] ; ( BX) =1544H
第 4章 指令系统
( 2)传送有效地址及数据段首址指令 LDS
语句格式,LDS OPD,OPS
功能:将主存中指定字单元数据送入指
定存储器, 下一字单元数据送 DS寄存器 。
第 4章 指令系统
( 3)传送有效地址及附加数据段指令 LES
语句格式,LES OPD,OPS
功能:将主存某字单元内容送指定寄存器 。
即 ( OPS) →OPD, ( OPS+2) →ES 。
返回本节
第 4章 指令系统
4 标志寄存器传送指令
( 1) 标志送 AH指令 LAHF
( 2) AH送标志指令 SAHF
( 3) 标志寄存器进栈指令 PUSHF
( 4) 标志寄存器出栈指令 POPF
第 4章 指令系统
( 1)标志送 AH指令 LAHF
语句格式,LAHF
功能:将标志寄存器的低 8位送入 AH寄存器 。
即 ( FLAGS) 7-0→AH 。 该指令的执行对标志
位无影响 。
【 例 4.11】 标志寄存器传送 。
执行前,( FLAGS) =0485H,( AX) =0FFFFH
执行指令,LAHF
第 4章 指令系统
( 2) AH送标志指令 SAHF
语句格式,SAHF
功能:将 AH的内容送入标志寄存器的低 8位, 高
8位不变 。 即 ( AH) →FLAGS 7-0.。
从该指令功能可看出,SAHF为 LAHF的逆过程。
第 4章 指令系统
( 3)标志寄存器进栈指令 PUSHF
语句格式,PUSHF
功能:将标志寄存器的内容压入堆栈 。
即 ( FLAGS) →↓( SP) 。
第 4章 指令系统
( 4)标志寄存器出栈指令 POPF
功能,将栈顶内容弹出送入标志寄存器中 。 即 ↑ ( SP)
→FLAGS 。
POPF指令与 PUSHF指令互为逆过程 。
【 例 4.12】 将标志寄存器的单步标志 TF置位 。
PUSHF ; ( FLSGS) →↓ ( SP)
POP AX ; ( SP) →AX
OR AX,0100H ; 设置 D8=TF=1
PUSH AX ; ( AX) →↓ ( SP)
POPF; ( SP) →↓FLAGS, 即 ( AX) →↓FLAGS
返回本节
第 4章 指令系统
4.3.2 算术运算类指令
1 加法类指令
2 减运算指令
3 乘运算指令
4 除运算指令
5 BCD码调整指令
返回本章首页
第 4章 指令系统
1 加法指令
( 1) 不带进位 加 法 指令 ADD
( 2) 带进位加指令 ADC
( 3) 加 1指令 INC
第 4章 指令系统
( 1) 不带进位加指令 ADD
语句格式,ADD OPD,OPS
功能:将目的操作数与源操作数相加, 结果存
入目的地址中, 源地址的内容不改变 。
即 ( OPD) +( OPS) →OPD 。
第 4章 指令系统
( 2) 带进位加法指令 ADC
语句格式,ADC OPD,OPS
功能:将目的操作数加源操作数再加低位进位,
结果送目的地址 。
即 ( OPD) +( OPS) +CF → OPD。
【 例 4.13】 无符号双字加法运算 。
MOV AX,4652H ; ( AX) =4652H
ADD AX,0F0F0H ; ( AX) =3742H,CF=1
MOV DX,0234H ; ( DX) =0234H
ADC DX,0F0F0H ; ( DX) =0F325H,CF=0
返回本节
第 4章 指令系统
( 3) 加 1指令 INC
语句格式,INC OPD
功能:将目的操作数加 1,结果送目的地址 。 即
( OPD) +1→OPD 。
INC指令是一个单操作数指令, 操作数可以是寄
存器或存储器操作数 。
如,INC BX,即 ( BX) +1→BX 。
加 1指令可用于对计数器和地址指针进行调整。
第 4章 指令系统
2 减运算指令
( 1) 不带借位减法指令 SUB
( 2) 带借位减指令 SBB
( 3) 减 1指令 DEC
( 4) 求补指令 NEG
( 5) 比较指令 CMP
第 4章 指令系统
( 1) 不带借位减法指令 SUB
语句格式,SUB OPD,OPS
功能:目的操作数减源操作数, 结果存于目的地址,
源地址内容不变 。
即 ( OPD) - ( OPS) →OPD
【 例 4.14】 减法运算 。
MOV AX, 5678H ; ( AX) =5678H
SUB AX, 1234H ; ( AX) =4444H
MOV BX, 3354H ; ( BX) =3354H
SUB BX, 3340H ; ( BX) =0014H
第 4章 指令系统
( 2) 带借位减指令 SBB
语句格式,SBB OPD, OPS
功能:目的操作数减源操作数再减低位借
位 CF,结果送目的地址 。
即 ( OPD) ― ( OPS) ―CF → OPD
第 4章 指令系统
( 3) 减 1指令 DEC
语句格式,DEC OPD
功能:将目的操作数减 1,结果送目的地址 。 即
( OPD) - 1→OPD 。
DEC指令是一个单操作数指令, 操作数可以是寄
存器或存储器操作数 。
如,DEC CX。 即 ( CX) - 1→CX 。
减 1指令 DEC也一般用于对计数器和地址指针的调
整 。
第 4章 指令系统
( 4) 求补指令 NEG
语句格式,NEG OPD
功能:将目的操作数的每一位求反 ( 包括符号位 ) 后加 1,
结果送目的地址 。
即 ( OPD) +1→OPD 。
【 例 4.15】 求补运算 。
MOV AX,0FF64H
NEG AL ; ( AX) =0FF9CH
SUB AL,9DH ; ( AX) =0FFFFH
NEG AX ; ( AX) =0001H
DEC AL ; ( AX) =0000H
NEG AX ; ( AX) =0000H
第 4章 指令系统
( 5) 比较指令 CMP
语句格式,CMP OPD,OPS
功能:目的操作数减源操作数, 结果只影响标志位, 不送入
目的地址 。
即 ( OPD) - ( OPS) 。
【 例 4.16】 比较 AL的内容数值大小 。
CMP AL,50 ; ( AL) - 50
JB BELOW ; ( AL) <50,转到 BELOW处执行
SUB AL,50 ; ( AL) >=50,( AL) - 50→AL
INC AH ; ( AH) +1→AH
BELOW,…
返回本节
第 4章 指令系统
3 乘法运算指令
( 1) 无符号数乘法指令 MUL
( 2) 有符号乘指令 IMUL
第 4章 指令系统
( 1)无符号数乘法指令 MUL
语句格式,MUL OPS
功能,若是字节数据相乘, ( AL) 与 OPS相乘得到
字数据存入 AX中;若是字数据相乘, 则 ( AX) 与 OPS
相乘得到双字数据, 高字存入 DX,低字存入 AX中 。
即字节乘法:( AL) * ( OPS) →AX, 字乘法:
( AX) * ( OPS) →DX, AX
【例 2.25】无符号数 0A3H与 11H相乘 。
MOV AL,0A3H ; ( AL) =0A3H
MOV BL,11H ; ( BL) =11H
MUL BL ; ( AX) =0AD3H
第 4章 指令系统
( 2)有符号乘指令 IMUL
语句格式,IMUL OPS
功能:字节乘法,( AL) *( OPS) →AX, 字乘法,( AX) *
( OPS) →DX, AX。
IMUL指令除计算对象是带符号二进制数外,其他都与 MUL一样,
但计算结果不同。 【例 4.17】有符号数 0B4H与 11H相乘。
MOV AL,0B4H ; ( AL) =B4H
MOV BL,11H ; ( BL) =11H
IMUL BL ; ( AX) =0FAF4H
返回本节
第 4章 指令系统
4 除运算指令
( 1) 无符号除指令 DIV
( 2) 有符号 除指令 IDIV
( 3) 符号扩展指令
第 4章 指令系统
( 1) 无符号除指令 DIV
语句格式,DIV OPS
功能,
字节除法 ( AX) /( OPS) → AL( 商 ), AH( 余数 )
字除法 ( DX,AX) /( OPS) → AX( 商 ), DX( 余数 )
【 例 4.18】 写出实现无符号数 0400H / 0B4H运算的程
序段 。
MOV AX,0400H ; ( AX) =0400H
MOV BL,0B4H ; ( BL) =0B4H
DIV BL ; 商( AL) =05H,余数( AH) =7CH
第 4章 指令系统
( 2) 有符号除指令 IDIV
语句格式,IDIV OPS
功能,
字节除法,( AX) /( OPS) → AL( 商 ), AH( 余数 )
字除法,( DX,AX) /( OPS) → AX ( 商 ), DX( 余数 )
除法指令 DIV和 IDIV虽然对标志的影响未定义, 但可产生溢出 。
【 例 4.19】 写出实现有符号数 0400H /0B4H运算的程序段 。
MOV AX,0400H ; ( AX) =0400H
MOV BX,0B4H ; ( BX) =0B4H
IDIV BX ; ( AL) =0F3H,( AH) =24H
返回本节
第 4章 指令系统
( 3) 符号扩展指令
1) 字节转换成字指令 CBW
2) 将字转换成双字指令 CWD
第 4章 指令系统
1) 字节转换成字指令 CBW
语句格式,CBW
功能:将 AL中的符号位数据扩展至 AH。
【 例 4.20】 将字节数据扩展成字数据 。
MOV AL,0A5H ; ( AL) =0A5H
CBW ; ( AX) =0FFA5H
ADD AL,70H ; ( AL) =25H
CBW ; ( AX) =0025H
第 4章 指令系统
2) 将字转换成双字指令 CWD
语句格式,CWD
功能:将 AX中的符号位数据扩展至 DX 。
【 例 4.21】 将字数据扩展成双字数据 。
MOV DX,0 ; ( DX) =0
MOV AX,0FFABH ; ( AX) =0FFABH
CWD ; ( DX) =0FFFFH ( AX) =0FFABH
返回本节
第 4章 指令系统
5 十进制调整指令
( 1) 加法的十进制调整指令 DAA
( 2) 减法的十进制调整指令 DAS
( 3) 加法的非压缩 BCD码调整指令 AAA
( 4)减 法的非压缩 BCD码调整指令 AAS
第 4章 指令系统
( 1)加法的十进制调整指令 DAA
语句格式,DAA
功能:如果 AL寄存器中低 4位大于 9或辅助进位 ( AF)
=1,则 ( AL) =( AL) +6且 ( AF) =1; 如果 ( AL)
>=0A0H或 ( CF) =1,则 ( AL) =( AL) +60H且 ( CF)
=1。 同时, SF,ZF,PF均有影响 。
【 例 2.31】 压缩 BCD码的加法运算 。
MOV AL,68H ; ( AL) =68H,表示压缩 BCD码 68
MOV BL,28H ; ( BL) =28H,表示压缩 BCD码 28
ADD AL,BL ; 二进制加法,( AL) =68H+28H=90H
DAA ; 十进制调整,( AL) =96H; 实现压缩 BCD码加法,68+28=96
第 4章 指令系统
( 2)减法的十进制调整指令 DAS
语句格式,DAS
功能:如果 ( AF) =1或 AL寄存器中低 4位大于 9,则 ( AL) =
( AL) - 6且 ( AF) =1; 如果 ( AL) >=0A0H或 ( CF) =1,则
( AL) =( AL) - 60H且 ( CF) =1。 同时 SF,ZF,PF均受影响 。
【 例 4.20】 压缩 BCD码的减法运算 。
MOV AL,68H ; ( AL) =68H,表示压缩 BCD码 68
MOV BL,28H ; ( BL) =28H,表示压缩 BCD码 28
SUB AL,BL ; 二 进 制 减 法, ( AL) =68H-
28H=40H
DAS ; 十进制调整,( AL) =40H; 实现压缩 BCD码减法,68- 28=40
第 4章 指令系统
( 3) 加法的非压缩 BCD码调整指令 AAA
语句格式,AAA
功能:如果 AL的低 4位大于 9或 ( AF) =1,则,
( AL) =( AL) +6
( AH) =( AH) +1
( AF) =( CF) =1
且 AL高 4位清零 。
否则,( CF) =( AF) =0
AL高 4位清零 。
第 4章 指令系统
( 4) 减法的非压缩 BCD码调整指令 AAS
语句格式,AAS
功能:如果 AL的低 4位大于 9或 ( AF) =1,则,
( AL) =( AL) - 6
( AH) =( AH) - 1
( AF) =( CF) =1
AL高 4位清零 。
否则,( CF) =( AF) =0
AL高 4位清零 。
其他标志位 OF,PF,SF,ZF不确定 。
第 4章 指令系统
4.3.3 逻辑运算与移位指令
1 逻辑运算指令
2 移位指令
3 循环移位指令
返回本章首页
第 4章 指令系统
1 逻辑运算指令
( 1) 求反指令 NOT
( 2) 逻辑乘指令 AND
( 3) 测试指令 TEST
( 4) 逻辑加指令 OR
( 5) 按位加指令 XOR
第 4章 指令系统
( 1) 求反指令 NOT
语句格式,NOT OPD
功能:将目的地址中的内容逐位取反后送
入目的地址 。 即 ( OPD) →OPD
【 例 4.21】 逻辑非运算 。
MOV AX,878AH ; ( AX) =878AH
NOT AX,; ( AX) =7875H
第 4章 指令系统
( 2) 逻辑乘指令 AND
语句格式,AND OPD,OPS
功能:将目的操作数和源操作数进行逻辑乘运算,
结果存目的地址 。
即 ( OPD) ∧ ( OPS) →OPD 。
该指令用于清除目的操作数中与源操作数置 0的对应
位 。 说明:逻辑乘的运算法则为,1∧ 1=1,1∧ 0=0,
0∧ 1=0,0∧ 0=0
【 例 4.22】 将 AL中第 3位和第 7位清零 。
MOV AL,0FFH
AND AL,77H
第 4章 指令系统
( 3) 测试指令 TEST
语句格式,TEST OPD,OPS
功能:源地址和目的地址的内容执行按位的逻辑
乘运算, 结果不送入目的地址 。
即 ( OPD) ∧ ( OPS) 。
【 例 4.23】 测试 AX中的第 12位是否为 0,不为 0则
转 L。
TEST AX,1000H
JNE L
第 4章 指令系统
( 4) 逻辑加指令 OR
语句格式,OR OPD,OPS
功能:将目的操作数和源操作数进行逻辑加运算,
结果存目的地址 。
即 ( OPD) ∨ ( OPS) →OPD 。
说明:逻辑加的运算法则为,1∨ 1=1,1∨ 0=1,
0∨ 1=1,0∨ 0=0。
【 例 4.24】 将 AL寄存器中第 3位和第 7位置 1。
MOV AL,0
OR AL,88H
第 4章 指令系统
( 5) 按位加指令 XOR
语句格式,XOR OPD,OPS
功能:目的操作数与源操作数做按位加运算, 结
果送入目的地址 。
即 ( OPD) ⊕(OPS) →OPD 。
说明:按位加的运算法则为; 1⊕ 1=0,1⊕ 0=1,
0⊕ 1=1,0⊕ 0=0。
【 例 4.25】 按位加运算 。
MOV AL,45H ; ( AL) =45H
XOR AL,31H ; ( AL) =74H
返回本节
第 4章 指令系统
2 移位指令
移位指令包括算术移位指令, 逻辑移位指令和循环
移位指令, 分别进行左移和右移操作 。 这些指令均有统
一的语句格式,
[标号,]操作符 OPD,1或 [标号,]操作符 OPD,CL
其功能为将目的操作数的所有位按操作符规定的方
式移动 1位或按寄存器 CL规定的次数 ( 0~ 255) 移动,
结果送入目的地址 。 目的操作数是 8位 ( 或 16位 ) 的寄
存器数据或存储器数据 。
第 4章 指令系统
( 1) 算术左移和逻辑左移指令 SAL( SHL)
语句格式,SAL OPD,1 或 SHL OPD,1
SAL OPD,CL或 SHL OPD,CL
功能:将 ( OPD) 向左移动 CL指定的次数, 最低
位补入相应的0, CF的内容为最后移入位的
值 。
第 4章 指令系统
( 2) 算术右移指令 SAR
语句格式,SAR OPD,1或 SAR OPD,CL
功能:将( OPD) 向右移动 CL指定的次数且最
高位保持不变; CF的内容为最后移入位的值。
第 4章 指令系统
【 例 4.26】 算术右移运算 。
MOV BH,0F4H ; ( BH) =0F4H
MOV CL,2 ; ( CL) =2
SAR BH,CL ; ( BH) =0FDH,( CF) =0
该例语句, SAR BH,CL”实际上完成了 ( BH)
/4 →BH 的运算, 所以, 用 SAR指令可以实
现对有符号数除 2n的运算 ( n为移位次数 ) 。
第 4章 指令系统
( 3) 逻辑右移指令 SHR
语句格式,SHR OPD,1或 SHR OPD,CL
功能:将 ( OPD) 向右移动 CL规定的次数, 最高位
补入相应个数的0, CF的内容为最后移入位的值 。
第 4章 指令系统
3,循环移位指令
( 1) 循环左移指令 ROL
语句格式,ROL OPD,1或 ROL LPD,CL
功能:将目的操作数的最高位与最低位连成一
个环, 将环中的所有位一起向左移动 CL规定的
次数 。 CF的内容为最后移入位的值 。
第 4章 指令系统
( 2) 循环右移指令 ROR
语句格式,ROR OPD,1或 ROR OPD,CL
功能:将目的操作数的最高位与最低位连成一
个环, 将环中的所有位一起向右移动 CL规定的
次数, CF的内容为最后移入位的值 。
第 4章 指令系统
( 3) 带进位的循环左移指令 RCL
语句格式,RCL OPD,1或 RCL OPD,CL
功能:将目的操作数连同 CF标志一起向左循环
移动 CL规定的次数。
第 4章 指令系统
( 4) 带进位的循环右移指令 RCR
语句格式,RCR OPD,1或 RCR OD,CL
功能:将目的操作数连同 CF标志一起向右循环
移动所规定的次数。
返回本节
第 4章 指令系统
4.3.4 串操作类指令
串操作指令,
数据传送类指令每次只能传送一个数据,若
要传送大批数据就需要重复编程,这样就浪费了
大量的时间和空间。
为此 8086提供了一组处理主存中连续存放数
据串的指令,这就是 串操作指令。
返回本章首页
第 4章 指令系统
图 4.3流程图总结了串操作的过程。
图 2.3 串操作流程图
第 4章 指令系统
1,传送指令 MOVS
语句格式,① MOVSB—— 字节串传送
② MOVSW—— 字串传送
功能:将以 SI为指针的源串中的一个字节 ( 或字 )
存储单元中的数据传送至以 DI为指针的目的地址中
去, 并自动修改指针, 使之指向下一个字节 ( 或字 )
存储单元 。
即,① ( DS,[SI]) →ES, [DI]。
② 当 DF=0时, ( SI) 和 ( DI) 增量 。
当 DF=1时, ( SI) 和 ( DI) 减量 。
第 4章 指令系统
2,串比较指令 CMPS
语句格式,① CMPSB—— 字节串比较
② CMPSW—— 字串比较
功能:将 SI所指的源串中的一个字节 ( 或字 ) 存储单元中的
数据与 DI所指的目的串中的一个字节 ( 或字 ) 存储单元中的
数据相减, 并根据相减的结果设置标志, 但结果并不保存 。
即,① ( [SI]) - ( [DI]) 。
② 修改串指针, 使之指向串中的下一个元素 。
当 DF=0时, ( SI) 和 ( DI) 增量 。 当 DF=1时, ( SI) 和 ( DI)
减量 。
第 4章 指令系统
3,串搜索指令 SCAS
语句格式,① SCASB—— 字节串搜索
② SCASW—— 字串搜索
功能,AL( 字节 ) 或 AX( 字 ) 中的内容与 DI所指的目的串中
的一个字节 ( 或字 ) 存储单元中的数据相减, 根据相减结果
设置标志位, 结果不保存,
即,① 字节操作,( AL) - ( [DI]), 字操作,( AX) -
( [DI]) 。
② 修改指针使之指向串中的下一个元素 。
当 DF=0时, ( DI) 增量 。 当 DF=1时, ( DI) 减量 。
第 4章 指令系统
4,从源串中取数指令 LODS
语句格式,① LODSB—— 从字节串中取数
② LODSW—— 从字串中取数
功能:将 SI所指的源串中的一个字节 ( 或字 ) 存储
单元中的数据取出来送入 AL( 或 AX) 中 。
即,① 字节 操作, ( [SI]) →AL, 字 操作,
( [SI]) →AX 。
② 修改指针 SI,使它指向串中的下一个元素 。
当 DF=0时,( SI) 增量。当 DF=1时,( SI) 减量。
第 4章 指令系统
5,往目的串中存数指令 STOS
语句格式,① STOSB—— 往字节串中存数
② STOSW—— 往字串中存数
功能:将 AL或 AX中的数据送入 DI所指的目的串中的
字节 ( 或字 ) 存储单元中 。
即,① 字节操作,( AL) →[DI], 字操作,( AX)
→[DI] 。
② 修改指针 DI,使之指向串中的下一个元素 。
当 DF=0时, ( DI) 增量 ) 。 当 DF=1时, ( DI) 减量 。
第 4章 指令系统
6,重复前缀指令 REP REPZ REPNZ
( 1) REP
REP前缀用在 MOVS,STOS, LODS指令前 。
功能:每执行一次串指令 ( CX) - 1,直到 ( CX) =0,重复
执行结束 。
( 2) REPZ
该指令一般用在 CMP,SCAS指令前 。
功能:每执行一次串指令 ( CX) - 1,并判断 ZF标志是否为 0,
只要 ( CX) =0或 ZF=0,则重复执行结束 。
( 3) REPNZ
该指令一般用在 CMPS,SCAS 指令前 。
功能:每执行一次串指令 ( CX) - 1,并判断 ZF标志是否为 0,
只要 ( CX) =0或 ZF=1,则重复执行结束 。
第 4章 指令系统
4.3.5 控制转移类指令
1 无条件转移指令
2 条件转移指令
3 循环控制指令
4 子程序调用指令
返回本章首页
第 4章 指令系统
1 无条件转移指令
表 2.4 无条件转移指令的语句格式及功能
返回本节
第 4章 指令系统
2 条件转移指令
( 1) 简单条件转移指令
( 2) 无符号数条件转移指令
( 3) 有符号数条件转移指令
它们都有通用的语句格式和功能 。
语句格式,[ 标号,] 操作符 短标号
功能,
如果条件满足, 则 ( IP) + 位移量 → IP。
第 4章 指令系统
( 1)简单条件转移指令
第 4章 指令系统
第 4章 指令系统
( 2) 无符号数条件转移指令
表 4.2 无符号数条件转移指令
第 4章 指令系统
【 例 4.27】 比较无符号数大小, 将较大的数
存放 AX寄存器 。
CMP AX,BX ; ( AX) - ( BX)
JNB NEXT ; 若 AX>=BX,转移到 NEXT
XCHG AX,BX ; 若 AX<BX,交换
NEXT,…
第 4章 指令系统
( 3) 有符号数条件转移指令
表 2.3 有符号数条件转移指令
第 4章 指令系统
【 例 4.28】 比较有符号数大小, 将较大的数存放在
AX寄存器 。
CMP AX,BX ; ( AX) - ( BX)
JNL NEXT ; 若 AX>=BX,转移到 NEXT
XCHG AX,BX ; 若 AX<BX,交换
NEXT,…
返回本节
第 4章 指令系统
3 循环指令
( 1) 循环指令 LOOP
( 2) 相等 /为零循环指令 LOOPE
( 3 ) 不相等 / 不 为 零 循 环 指 令
LOOPNE
( 4) CX为零转移指令 JCXZ
第 4章 指令系统
( 1) 循环指令 LOOP
语句格式,LOOP 短标号
功能,( CX) - 1 ≠ 0,则程序转移 ( 循环 ) ;
否则, 顺序执行 。
说明:使用 LOOP指令可代替两条指令,
DEC CX
JNE 短标号
第 4章 指令系统
( 2) 相等 /为零循环指令 LOOPE
语句格式,① LOOPE 短标号
② LOOPZ 短标号
功能,( CX) - 1 ≠ 0且 ZF=1,则程序转
移 ( 循环 ) ;否则, 顺序执行 。
第 4章 指令系统
( 3) 不相等 /不为零循环指令 LOOPNE
语句格式,① LOOPNE 短标号
② LOOPNZ 短标号
功能,( CX) - 1≠ 0,则程序转移
( 循环 ) ;否则, 顺序执行 。
第 4章 指令系统
( 4) CX为零转移指令 JCXZ
语句格式,JCXZ 短标号
功能,( CX) - 1≠ 0,则程序转移 ( 循环 ) ;
否则, 顺序执行 。
返回本节
第 4章 指令系统
4 子程序调用指令
( 1) 子程序调用指令 CALL
1) 段内直接调用
2) 段间直接调用
3) 段内间接调用
4) 段间间接调用
( 2) 返回指令 RET
( 1) 语句格式,RET
( 2) 语句格式,RET n( n为偶数 )
返回本节
第 4章 指令系统
4.3 中断指令
4.4.1 8086中断机构
4.4.2 BIOS调用
4.4.3 DOS功能调用
返回本节
第 4章 指令系统
4.4.1 8086中断机构
1,中断的基本概念
( 1) 中断
中断就是计算机暂时停止当前正在执行的程序, 转而执行
完成更紧急任务的子程序, 执行结束后恢复原先执行的程序 。
( 2) 中断源
向 CPU提出中断请求的事件称为中断源。 8086CPU的中
断源有两大类:内部中断和外部中断。内部中断是指由 CPU
的标志位 TF为 1或执行一条软件中断指令而引起的;外部中断
是由外部请求信号引起的,包括可屏蔽中断源 INTR和不可屏
蔽中断源 NMI。 INTR称为可屏蔽中断请求,是因为该中断请
求是否能得到响应,受 IF标志位的影响。当 IF= 1,CPU可响
应 INTR中断请求,否则不予响应。 NMI则不受 IF影响。中断
源形式如图 4-3所示。
第 4章 指令系统
第 4章 指令系统
( 3)中断类型号和中断向量表
8086的中断系统能够处理 256个不同的中断源, 并为每一
个中断安排一个编号, 范围为 00H~ FFH,对应十进制数为
0~ 255,称为中断类型号 。 一种中断对应一个中断服务程序,
每一个中断服务程序有一个确定的入口地址, 这个地址称为中
断向量 。 把系统中所有的中断向量集中起来, 按中断类型号从
小到大的顺序放到存储器的某一个区域, 这个存放中断向量的
存储区称为中断向量表 。
8086CPU把存储器的 00000H— 003FFH共 1024个存储单
元作为中断向量的存储区, 每个中断向量占用 4个存储单元 。
4个单元中的低地址字存放中断服务程序所在段的偏移地址,
高地址字存放中断服务程序所在段的段地址 。 CPU响应中断
后是通过将中断类型号 × 4得到中断向量在中断向量表中的首
地址 。
第 4章 指令系统
( 4)中断优先级
在中断源数量很多的情况下, 为保证系统的运行效率,
方便软件控制, 一般将所有的中断源根据不同的类别划分为
若干级别, 称为中断优先级 。 确定各中断级之间的优先顺序,
然后在同级内确定中断源的优先权 。
8086CPU中断机构的优先级序列从高到低为,
l 除法出错中断, 溢出中断, INT n
l NMI
l INTR
l 单步中断
第 4章 指令系统
2,中断过程
中断的处理过程分为 4步:中断请求, 中断响应,
中断处理, 中断返回 。
( 1) 中断请求
程序执行过程中,不同的中断源根据程序运行
情况发出不同的中断请求,例如,当除数为 0或商
值超过所能表示的范围时产生一个除法出错中断请
求,外设需要和 CPU传输数据,可通过 8259向
CPU的 INTR端发出可屏蔽中断请求。
第 4章 指令系统
( 2)中断响应
CPU每执行完一条指令, 都要查询是否有中断请求 。 若有, 则根据中断优
先级的高低顺序确定对某个中断请求是否响应 。 对于非屏蔽中断, 只要有中断
请求, CPU就响应 。 对于可屏蔽中断请求, CPU还要看标志寄存器的 IF位的状
态是否为 1,若为 1,则响应该中断请还应 。 当 CPU对某一中断请求予以响应
后, 将完成如下工作,
1) 取中断类型号 N;
2) 标志寄存器 F的内容入栈;
3) 当前代码段寄存器 CS的内容入栈;
4) 当前指令指针 IP的内容入栈;
5) 禁止外部中断和单步中断, IF和 TF清 0;
6) 从中断向量表中取中断服务程序入口地址,( 4× N) 送 IP,( 4× N+ 2)
送 CS;
7) 转中断处理程序;
第 4章 指令系统
( 3) 中断处理
中断处理是由中断服务程序来完成的 。 中断
服务程序根据不同的中断请求, 其内容各不相同 。
但其开始部分往往都是保护现场, 即把 CPU中寄
存器的内容压入堆栈, 结束时又把堆栈中的内容恢
复寄存器中 。
( 4) 中断返回
中断服务程序的最后要使用中断返回指令
IRET,该指令的功能是恢复 IP,CS和 F中的内容,
返回被中断的程序继续执行 。
第 4章 指令系统
4.4.2 BIOS调用
IBM PC系列机在只读存储器中提供了 BIOS基本的输入
输出系统, 它占用系统板上 8K字节的 ROM区, 又称为 ROM
BIOS。 它为用户程序和系统程序提供主要外设的控制功能,
即系统加电自检, 引导装入及对键盘, 磁盘, 磁带, 显示器,
打印机, 异步串行通信口等控制 。 计算机系统软件就是利用
这些基本的设备驱动程序, 完成各种功能操作 。 每个功能模
块的入口地址都在中断矢量表中, 通过软中断指令 INT n可
以直接调用 。 n= 8~1FH是中断类型号, 每个类型号 n对应一
种 I/ O设备的中断调用, 每个中断调用又以功能号区分控制
功能 。
第 4章 指令系统
4.4.3 DOS功能调用
DOS磁盘操作系统的两个 DOS模块,IBMBIO.COM和
IBMDOS.COM,提供了更多的测试功能。 DOS功能调用对
硬件的依赖性更少,使 DOS功能调用更方便、简单。
DOS功能调用可完成对文件、设备、内存的管理。对
用户来说,这些功能模块就是几十个独立的中断服务程序,
这些程序的入口地址已由系统置入中断向量表中,在汇编语
言程序中可用软中断指令直接调用。这样,用户就不必深入
了解有关设备的电路和接口,只须遵照 DOS规定的调用原则
即可使用。
第 4章 指令系统
1,系统功能调用的方法
要完成系统功能调用, 基本按如下步骤,
l 将入口参数送到指定寄存器中;
l 子程序功能号送入 AH寄存器中;
l 使用 INT 21H指令。
第 4章 指令系统
2,常用的几种系统功能调用
( 1) 1号系统功能调用-键盘输入并回显
此调用的功能是系统扫描键盘并等待键盘输入一
个字符, 有键按下时, 先检查是否是 Ctrl+ Break键,
若是则将字符的键值 ( ASCII码 ) 送入 AL寄存器中, 并
在屏幕上显示该字符 。
此调用没有入口参数 。
例如:下列语句可实现键盘输入 。
MOV AH,01H ; 01H为功能号
INT 21H
第 4章 指令系统
( 2) 2号系统功能调用-显示输出
此调用的功能是向输出设备输出一个字符 。
入口参数:被显示字符的 ASCII送 DL。
例如:要在屏幕上显示, $” 符号, 可用以下指令序

MOV DL,’$’
MOV AH,02H
INT 21H
第 4章 指令系统
( 3) 3号系统功能调用-异步通信输入 ( 从串口输入
字符 )
3号系统功能调用的功能是将从异步串行通信口 ( 默
认为 COM1) 输入一个字符 ( 或者 ASCII码 ) 。
出口参数:输入的 ACSII码送 AL寄存器中。
DOS系统初始化时此端口的标准是字长 8位,2400
波特、一个停止位、没有奇偶校验位。
第 4章 指令系统
( 4) 4号系统功能调用-异步通信输出 ( 从串口输出字符 )
此调用的功能是系统将从异步通信口 ( 默认为 COM1) 输
出一个字符 ( 或者 ASCII码 ) 。
入口参数:被输出的字符的 ASCII码送入 DL中 。
例如:现要将, $” 这个符号通过异步串行通信口输出, 指
令序列如下,
MOV DL,’$’
MOV AH,04H
IN 21H
第 4章 指令系统
( 5) 5号系统功能调用-打印机输出 ( 从串口输
出字符 )
此调用的功能是将一个字符输出到打印机 ( 默认 1
号并行口 ) 。
入口参数:欲打印的字符的 ASCII码送入 DL寄存器
中 。
第 4章 指令系统
( 6) 6号系统功能调用-直接控制台输入输出字符
此调用的功能是从键盘输入一个字符, 或输出一个字符到
屏幕 。
如果 ( DL) = 0FFH,表示是从键盘输入字符 。
当标志 ZF= 0时, 表示有键被按下, 将字符的 ASCII码送入
AL寄存器中 。
当标志 ZF= 1时, 表示没有键按下, 寄存器 AL中不是键入
字符的 ASCII码 。
如果 ( DL) ≠0FFH,表示输出一个字符到屏幕, 将被输出
字符 ASCII码送到 DL中 。 此调用与 1号, 2号调用的区别在
于不检查 Ctrl+ Break。
第 4章 指令系统
本章小结
本章讲述了寻址方式的基本概念, 各种指令的使
用情况 。
寻找操作数地址的目的是为了得到操作数 。 本
章介绍了 8086的 6种基本寻址方式:立即数寻址, 寄
存器寻址, 直接寻址, 寄存器间接寻址, 相对寻址,
基址变址寻址 。 在学习时, 要弄清这 6种寻址方式的
区别和特点, 重点掌握存储器寻址方式中的有效地
址和物理地址的计算方法 。
指令系统是程序设计的基础,要想编出高质量
的程序,就必须清楚地了解计算机的指令系统。
Intel 8086微处理器的指令系统中有 99条指令,按
功能分为 6类。
第 4章 指令系统
THANK YOU VERY MUCH
本章到此结束,
谢谢您的光临!
返回本章首页 结 束