第三章 微型计算机的指令系统 § 1 指令的构成和操作数的类型...

Post on 12-Jan-2016

198 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

第三章 微型计算机的指令系统 § 1 指令的构成和操作数的类型 一、指令构成 一条指令由操怍码字段和操作数字段构成。 1 、操作码字段 操作码字段表明指令执行何种性质的操作。 2 、操作数字段 操作数字段是指明指令执行的操作所需要的操作数 . 该字段中,可以是操作数本身或是操作数地址。. 二、操作数类型 操作数有以下三种类型:立即数操作数、寄存器操 作数和存储器操作数。 1 、立即数操作数 - PowerPoint PPT Presentation

TRANSCRIPT

第三章 微型计算机的指令系统

§ 1 指令的构成和操作数的类型 一、指令构成 一条指令由操怍码字段和操作数字段构成。 1 、操作码字段 操作码字段表明指令执行何种性质的操作。 2 、操作数字段 操作数字段是指明指令执行的操作所需要的操作数 . 该字段中,可以是操作数本身或是操作数地址。

二、操作数类型 操作数有以下三种类型:立即数操作数、寄存器操 作

数和存储器操作数。 1 、立即数操作数

立即数只能作为源操作数,而不能作为目标操作 数。立即数可以是 8 位和 16 位带符号数或者无符号 数,并只能是整数,不能是小数。

2 、寄存器操作数 寄存器操作数可以存放于 CPU 内部寄存器中,即通 用

寄存器、地址指针寄存器、变址寄存器、段寄存 器。所有的通用寄存器和地址指针寄存器既可以用 作源操作数,又可以用作目标操作数。

3 、存储器操作数 存储器操作数的数据可能是 8 位、 16 位和 32 位的二

进 制数。在指令中,存储器操作数可以分别作为源操 作数和目标操作数,但是不允许二者同时都为存储 器操作数。

§2 8086 的寻址方式 一、立即寻址 操作数包含在指令中 , 此操作数又称为立即数, ( 立

即数只能作源操作数 ) 立即数可为 8 位,也可为 16 位,它用来给寄存器存贮器赋初值。

二、寄存器寻址 操作数在某一寄存器中。一条指令中,可以对源

操作数采用寄存器寻址,也可对目的操作数采用 寄存器寻址,还可两者都用寄存器寻址。

寄存器可为: AX,BX,CX,DX,SI,DI,SP,BP AH,AL,BH,BL,CH,CL,DH,DL 。

三、直接寻址 操作数的地址包含在指令中。

( 注意:此地址为 16 位偏移地址 ) 通常操作数一般在数据段区域中,如果要对其他段

寄存器所指出的存贮区进行寻址 ( 所谓段超越), 则在本条指令中,须用前缀指出段寄存器名。

四、寄存器间接寻址 操作数的地址在某寄存器中,

这些寄存器可以为: BX,BP,SI,DI 之一。 有效地址: EA=[BX 或 BP 或 SI 或 DI] 注:如果指令前没有用前缀指明具体的段寄存器, � 则

寻址时默认为 DS/SS 。 采用寄存器间址允许在指令中指定一个位移量 (8位 或 16 位 ) 。其有效地址 EA 为寄存器内容加上此位移 量。 ( 称寄存器相对寻址 ) 有效地址: EA=[ ( BX 或 BP 或 SI 或 DI )+位移量 ( 带符号数 )]

1、数据段基址寻址 用 BX 寄存器进行间接寻址 。 2、堆栈段基址寻址 用 BP 寄存器进行间接寻址。 3、变址寻址 用 SI,DI 寄存器进行间接寻址。 4、基址加变址寻址 用 BX 、 BP 和 SI 、 DI 寄存器组合起来进行间接寻址。 有效地址 EA=[ ( BX 或 BP )+( SI 或 DI ) ] 注:只要用上 BP 寄存器,那么默认的段寄存器就是 SS, 在其他情况,则为 DS 。否则应用前缀指出相应段 寄存器名。

附:几种常见的书写形式 MOV AX,VALUE → MOV AX,[VALUE] (VALUE 为符号地址 ) MOV AX,ES:VALUE → MOV AX,ES:[VALUE] MOV AX,COUNT[SI]→ MOV AX,[COUNT+SI] (COUNT 为位移量的符号地址 ) MOV AX,[BX][DI] → MOV AX,[BX+DI] MOV AX,MASK[BX][SI] → MOV AX,MASK[BX+SI] → MOV AX,[MASK+BX+SI]

5、例 1 : DS=2000H, ES=2100H, SS=1500H, SI=00A0H, BX=0100H, BP=0010H ,

VAL=0050H , 请指出下列的源操作数字段是什么寻址方式?

它的物理地址是多少? A、 MOV AX,OABH B 、 MOV AX,BX C、 MOV AX,[VAL+100H] D 、 MOV AX,[BX] E 、 MOV AX,ES:[BX] F 、 MOV AX,[BP] G 、 MOV AX,[SI] H 、 MOV AX,[VAL+BX+SI]

例2:根据以下要求写出相应的汇编语言指令 A、把数 OB5H 与 (AL) 相加,结果送回 AL 中。 B、把 BX 和 DX 内容相加,结果存入 DX 中。 C、用位移量 0524H 的直接寻址方式把存贮器中一个

字 与数 2A59 相加 , 结果送回存贮单元中。 D、用 BX 和 SI 的基址变址寻址方式 , 把存贮器中一个

字 节与 AL 内容相加 , 结果存入 AL 中。 E、用 BX 和位移量 OB2H 的寄存器相对寻址方式把存

贮 器中一个字和 CX 相加,结果存入内存单元中。

§ 3 8086/8088CPU 指令系统

一、数据传送指令 1、通用数据传送指令 <1> MOV传送指令 格式: MOV DST, SRC DST :目的操作 操作: DST SRC SRC :源操 A、立即数到寄存器存贮器 reg , data 注:不包括段寄 mem , data

B 、从寄存器到寄存器 reg , reg 从存贮器到寄存器 mem , reg 从寄存器到存贮器 reg , mem 注:不包括段寄

C、从存贮器/寄存器到段寄存器 (mem/reg,segreg)

注 : 不能往 CS 中传送数据 .

D、从段寄存器到存贮器/寄存器 (segreg,mem/reg)

注: 1, 不影响标志

2, 不允许两操作数都使用存储器 3, 不允许往 CS 中送数

4,8 位传送/ 16 位传送决定于指令中寄存器及立 即数形式

5,凡给 SS 赋值时,系统会自动禁止中断,等下 条指令执行完后才会恢复

E 、例:一批数的传送

<2> PUSH 进栈与 POP 出栈指令 A、堆栈

堆栈是以“后进先出”方式工作的一个存贮区。它存在于堆栈段中 . 堆栈在计算机工作中起着重要作

用, 它在子程序结构的程序以及中断程序中是不可少的。堆栈指针寄存器 SP 用来指示堆栈在那里。

它始 终指向当前堆栈的栈顶。 注:在 8086 中堆栈的存取是以字为单位进行的 B、 PUSH/POP 指令格式与操作 格式: PUSH SRC 操作: 1,SP-1 SP 2,高字节 (SP) 3,SP-1 SP 4,低字节 (SP) 格式: POP DST 操作: 1,低字节 弹出 2,SP+1 SP 3,高字节 弹出 4,SP+1 SP

C 、注: PUSH/POP 指令可使用除立即数以外的所有寻址 方式。指令也可以指定段寄为操作数,但 POP 指

令不允许用 CS 寄存器。 所有标志不受影响。 D 、例 1 :两寄存器内容交换 分析下面程序段: 设 SP=2000H,SS=1000H ST : PUSH BX PUSH CX POP BX POP CX

例 2 :设BX=2A0CH, CX=A530H, SS=2000H 程序执行后, BX= AX= CX= SP= ST : MOV SP, 1000H

PUSH BX PUSH CX MOV AX, 62CEH ADD AX, SP POP BX HLT

例 3 :分析下面程序: ST : MOV CX , 5 POP CX L1 : PUSH CX DEC CX MOV CX , 10 JNZ L1

L2 : DEC CX HLT JNZ L2

<3> XCHG 指令 (交换 ) A、 XCHG 指令格式与操作 XCHG OPR1, OPR2 OPR1←→OPR2 B、 XCHG 指令可以在寄存器之间或寄存器与存贮器之

间交换信息。 C 、例

注:不允许使用段寄。

该指令不影响标志位。

2、累加器专用传送指令 <1> IN/OUT输入输出指令 A、指令的格式与操作 长格式: IN AL, PORT AL ←(PORT) IN AX, PORT AX ← (PORT+1,PORT) OUT PORT,AL (PORT)← AL OUT PORT,AX (PORT+1,PORT)← AX 短格式: IN AL,DX AL ← (DX) IN AX,DX AX ←( DX+1,DX ) OUT DX,AL (DX )← AL OUT DX,AX (DX+1,DX)←AX 注: I/O 指令中只能用 AX/AL 与 DX 和 8 位的端口地址。

B 、 用长格式时可以在指令中直接指定端口号 , 但只限 于外设的前 256 个端口,当端口号≥ 256 时,只能使 用短格式, ( 间接 ) ,必须注意端口号即为外设地 址,它与段寄无关。 I/O 指令不影响标志位。

C 、 例 1 : D 、 例 2 :

OUT DX, AL

<2> XLAT换码指令 A、指令格式与操作 XLAT OPR 或 XLAT AL ←[ BX + AL ] B、注:使用 XLAT 指令,应先建立一个表格。

表格首址存入 BX 中,需转换的代码应是相对于 表格首址的位移量(即项号)也提前放入 AL 中。

表格的内容(即项值)则是所要换取的代码它将存入 AL 中。

指令格式中的 OPR为表格首址(符号地址)。 所有标志不受影响。

C、例 设: BX=0040H, AL=02H , DS=F000H

项号 项值

表格: 0 (F0040H)=11H ( 0040H 为表格首址)

1 (F0041H)=22H

2 (F0042H)=33H

3 (F0043H)=44H

4 (F0044H)=55H

5 (F0045H)=66H

则:执行 XLAT后, AL=

3、地址传送指令 A、指令格式与操作 偏移地址送寄存器 LEA REG REG SRC

把源操作数的偏移地址送寄存器。 指针送寄存器和 DS LDS REG,SRC REG (SRC) DS (SRC+2)

把源操作数提供的 32 位数送寄存器与段寄 DS 指针送寄存器和 ES LES REG,SRC REG (SRC) ES (SRC+2) 把源操作数提供的 32 位数送寄存器与段寄 ES 注:所有标志不受影响 REG必须为 16 位通用寄存器 SRC 为内存单元地址。

B、例LEA BX,[BX+SI]

执行前: BX=0400H SI=003CH执行后: BX=

LDS SI,[10H] 执行前: DS=C000H, (C0010H)=0180H

(0012H)=2000H执行后: SI= DS=

LES DI,[BX] 执行前: DS=B000H, BX=080AH

(B080AH)=05AEH, (B080CH)=4000H

执行后: DI= ES=

4、标志寄存器传送指令 标志送 AH : LAHF AH← PSW的低字节 AH 送标寄: SAHF PSW的低字节← AH 标志进栈: PUSHF SP←SP-2;

( SP+1,SP )← PSW 标志出栈: POPF PSW←( SP+1,SP )

SP← SP+2 PSW 15 8 7 0

AH

/ / / / OF DF IF TF SF ZF / AF / PF / CF

/ / /

三、算术运算指令 1、加法指令

加: ADD DST,SRC DST←SRC+DST

reg,reg; reg,mem; mem,reg reg,data; mem,data; ac,data

带进位加: ADC DST,SRC (DST)← (SRC)+(DST)+CF

reg,reg; reg,mem; mem,reg reg,data; mem,data; ac,data 加 1 : INC OPR (OPR)←─ (OPR)+1 (reg;mem)

注: INC 指令不影响 CF 标志

2、减法指令 减: SUB DST,SRC

DST←DST-SRC 带借位减: SBB DST,SRC

OST←DST-SRC-CF 减1: DEC OPR OPR←OPR-1 求

补: NEG OPR OPR←0-DPR 比较: CMP OPR1,OPR2 OPR1 - OPR2

注: CMP 指令执行减操作,但它不保存结果 , 只是

根据操作结果设置条件标志位。 CMP 指令后 往往跟着一条条件快移指令,实现程序分支。 DEC 指令不影响 CF 标志。 �

3、乘法指令 格式:无符号数乘 MUL SRC (reg/mem) 带符号数乘 IMVL SRC 操作:字节操作 AL*(SRC) AX 字操作 AX*(SRC) DX,AX 注:执行前 ,必须将被乘数送入 AX/AL 中。 MUL :当积的高位为 0 ,则 CF=0,OF=0 否则均为1 。 IMVL :当积的高一半是低一半的符号扩展则

CF=OF=0 ,否则为 1 。 例:设 AL=04H BH=02H AH=E5H 则 执行 MUL BH 后 AX=

4、除法指令 格式:无符号数除 DIV SRC (reg/mem) 带符号数除 IDIV SRC 操作:字节操作: AX÷(SRC)→商 AL ,余 AH 字操作: DX,AX÷(SRC)→商 AX ,余 DX 注: IDIV 、 DIV 执行前 ,必须将被除数送入指定寄存器

AX,DX 中。 用除法指令时,必须注意它要求商为 8 位 ( 字节 )/

16 位 ( 字 ) ,如果被除数的高 8 位 ( 字节 ) 或 16位 ( 字 )大于除数的绝对值,商就会产生溢出,此时 会作除数为 0 的情况来处理。 例:设 AX=0009H BH=02H 则 执行 DIV BH 后 AL= AH=

D 、字节转换为字指令: 格式: CBW 操作: AL 的内容符号扩展到 AH 。

字转换为双字指令: 格式: CWD 操作: AX 的内容符号扩展到 DX 。

注: CBW,CWD 指令不影响条件码。 例:设有两个 16 位数存于 AX,BX 中,求 Z=AX/BX

5、十进制调整指令 A、压缩的 BCD 码:用 4 位 2 进制表示一个十进制数位。 如 502D─→0101,0000,0010B 非压缩的 BCD 码:以 8 位为一组表示一个十进制数

位,其中低 4 位为 BCD 码,高 4 位没 有意义

如: 502D─→00110101,00110000,0011,0010B 。 注: ASCII 码是一种非压缩的 BCD 码。

B、压缩的 BCD 码调正指令 DAA : 条件:用 ADD 或 ADC将两个压缩 BCD码 相加,和存于 AL 中。 操作:将和 AL调正到压缩的 BCD格式存入 AL 中。

DAS : 条件:用 SUB 或 SBB将两个压缩 BCD码 相减,差存于 AL 中。 操作:将 AL 中的差调正到压缩的 BCD格

式存入 AL 中。 注: DAA/DAS 对 OF 标志无定义对其他标志有影响。

例 1 : 设: AL=28H, BL=68H

执行: ADD AL,BL

DAA

指令后: AL= CF= AF=

例 2 : 设: AL=86H, BL=07H

执行: SUB AL,BL

DAS

指令后: AL= CF= AF=

C、非压缩的 BCD 码调整指令 AAA :加法的 ASCII调正指令 条件:用 ADD/ADC将 2 个非压缩 BCD 码相加,

和存于 AL 中。 操作:将 AL 中和调正到非压缩的 BCD格式。将 调正产生的进位值加到 AH 中。 AAS :减法的 ASCII调正指令 条件:用 SUB/SBB将 2 个非压缩 BCD 码相减,

差存于 AL 中。 操作:将 AL 中差调正到非压缩 BCD格式,其调 正产生的借位从 AH 中减去。

AAM :乘法的 ASCII调正指令。 ( 对结果调正 ) 条件: 用 MUL将 2 个非压缩 BCD 码相乘 ( 要求

高 4 位为 0) , 结果存于 AL 中。 操作: 将 AL 内容除以 OAH ,其商存于 AH 中,

余 数存于 AL 中。 AAD :除法的 ASCII调整指令 ( 对被除数必须进行调整 ) 操作: AH*10+AL→AL; 0→AH 将 AX 中的被除数 (非压缩 BCD 码,高 4 位为 0)调 整成二进制数 例: a、设: AX=0505H , BL=09H 执行: ADD AL,BL AAA 后: AX= b、设: AL=07H, BL=09H 执行: MUL AL,BL AAM 后: AH= AL= c、设: AX=0604H 执行: AAD 后: AX=

6 、编程举例: A 、试编一程序计算一批数中, 0 的个数。

B 、设有 100 个无符号字节数存于以 TAB 为首址的单元

中,试将其最大值存于 AL 中 .最小值存于 BL 中。

C 、 试分析下面程序功能: ST : LEA SI,DATA1 LEA DI,DATA2 MOV CX,5 CLC L1 : MOV AL,[SI] MOV BL,[DI] ADC AL, BL DAA MOV [SI],AL INC SI INC DI LOOP L1 MOV AL, 0 ADC AL, 0 MOV [SI], AL HLT

四、逻辑运算和移位指令 1、逻辑运算指令 (按位操作 ) 逻辑与: AND DST,SRC DST← DST∧SRC reg,reg reg,mem mem,reg

reg,data mem,data 逻辑或: OR DST,SRC DST← DST∨URC 逻辑非: NOT OPR OPR ← OPR 异或: XOR DST,SRC DST←DST V SRC 测试: TEST OPR1,OPR2 OPR1∧OPR2 注: NOT 不影响标志位 , 其余 4 条将使 CF=OF=0 , AF 无 定义 ,对 SF,ZF,PF 有影响。 逻辑运算指令对处理操作数的某些位很有用。它可

屏蔽某些位,可使某些位置“1”,可测试某些位等 .

2、移位指令 逻辑左移: SHL OPR,CNT 逻辑右移: SHR OPR,CNT 算术左移: SAL OPR,CNT

算术右移: SAR OPR,CNT

循环左移: ROL OPR,CNT

循环右移: ROR OPR,CNT

带进位循环左移: RCL OPR,CNT

带进位循环右移: RCR OPR,CNT

其中 : OPR: reg;mem CNT : 1 或 CL

注:移位指令: OF 位当 CNT=1 有效,在移位后 D7值发 生变化时 1→OF, 否则为 o。

它影响 SF,ZF,PF, 对 AF 无定义。 循环指令:不影响除 OF,CF 以外的其它条件标志。

OF影响同移位指令 例: a、设: SI=1450H 则:执行 MOV CL,2 SHL SI,CL 后 , SI= CF= b、计算 BX*6 c、计算 AX/256, 结果存于 AL 中

五、串处理指令 串处理指令是指用一条指令实现对一串字符或数据

的操作。 8086 的串处理指令有如下几个特点: a、通过加重复前缀 (REP REPNZ等 )实现串操作。 b、可以对字节/字串进行操作 c、用 SI 对源操作数进行间接寻址 ( 在 DS 段中 ), 用 DI对 目的操作数进行间接寻址 ( 在 ES 段中 ) 。 d、串操作时,地址的修改与方向标志 DF 有关,当 DF=1 时, SI/DI 作自动减量修改,当 DF=0 时, SI/DI作 自动增量修改。 e、在执行串操作指令过程中, IP保持指向重复前缀

( 前缀本身也是一条指令 ) 的偏移地址。

1、字符串传送指令与重复前缀指令 A、 REP CX←CX-1,当 CX=0退出重复 , 否则 执行其后的串指令。 B、 MOVSB (DI)←─(SI) MOVSW SI←SI±1 或 2

DI←DI±1 或 2 。 ( DF=0 为 "+"; DF=1 为 "-") 注: MOVSB( 字节 )/MOVSW( 字 ) 指令前通常加 REP,

该指令不影响 F 标志。

C、例:一批数的传送 ( 1 )

( 2 )

( 3 )

2、取字符串指令 LODSB AC←(SI) LODSW SI←SI±1减 2 ( DF=0 为 "+"; DF=1为 "-") 注:此指令前,通常不加 REP ,它不影响 F 标志。 例:数 0 的个数存于 CH 中

3、存字符串指令 STOSB (DI)←AC STOSW DI←DI±1 或 2. DF=0为 "+"; DF=1 为 "-" 注:该指令前加 REP后,可以使一批内存单元,填满

相同的数。 该指令不影响 F 标志。 例:使 0400H开始的 256 个单元清 0

4、 字符串比较指令与相等/不相等,为 0/不为 0 ,重 复前缀指令 A、 REPE CX←CX-1,当 CX=0 或 ZF=0 REPZ 退出重复 , 否则执行其后的串指令 B、 REPNE CX←CX-1,当 CX=0 或 ZF=1 REPNZ 退出重复 , 否则执行其后的串指令

C、 CMPSB (SI)- (DI) CMPSW SI←SI±1 或 2;

DI←DI±1 或 2 。 DF=0 为“ +”; DF=1 为“ -”

D、例:判一批数是否与要求的数相同

5、字符串检索指令 按累加器中给出的字节/字对 ES:DI 所指的字节/字 串进行检索 ,建立相应标志。 A、 SCASB AC -(DI) SCASW DI←DI±1 或±2 B、例: 100 个字符存于以 TAB 为首址单元中,试检索 A 字符的位置 , 位置值存于 DX 中 ,若无 A 字使 A=-1

六、控制转移指令 1、转移指令 <1> 段内与段间:段内转移 : 在同一段内进行的转移

段间转移 : 段与段之间进行的转移 <2> 转移指令的寻址方式 A 、段内直接寻址 它是一种相对寻址 , 其转移的有效地址为 IP� 的当 前值与位移量 8 位 /16 位 ( 带符号数 ) 之和,其中条 件转移指令只能采用这种寻址方式,位移量为 8 位 . B 、段内间接寻址: ( 只适用于无条件转移指令 ) 段内间接寻址的转移有效地址为寄存器的内容或

存贮单元的内容。它可以用数据寻址方式中除立即数以外的任一种寻址方式取得。

C 、段间直接寻址: ( 只适用无条件转移指令 ) 段间直接寻址的转移地址的段值和偏移量直接由指

令给出。产生转移时 , 其段值送 CS, 偏移量送 IP 。 D 、段间间接寻址: ( 只适用无条件转移指令 ) 段间间接寻址用存贮器中 2� 个相继字的内容取代 IP

与 CS 内容,以达到段间转移之目的。其中相继字的 存贮单元地址将由指令指定的除立即数/寄存器方

式以外的任一种数据寻址方式取得。 两个相继字中 , 前一个为偏移量 ,后一个为段值。 <3> 无条件转移指令 JMP SHORT PTR OPR IP←IP+8 位位移量 段内直接短转移 JMP NEAR PTR OPR IP←IP+16 位位移量 段内直接近转移 JMP WORD PTR OPR IP←─(EA) 段内间接转移

JMP FAR PTR OPR IP←OPR( 偏移地址 ) 段间直接转移 CS←OPR( 段地 ) JMP DWORD PTR OPR IP←(EA) 段间间接转移 CS←EA+2 <4> 条件转移指令 A、 JZ(JE) OPR 条件ZF=1 结果为零 ( 相等转 ) JNZ(JNE) OPR ZF=0 结果不为零 ( 不等转 ) JS OPR SF=1 为负转 JNS OPR SF=0 为正转 JO OPR OF=1 有溢出转 JNO OPR OF=0 无溢出转 JP OPR PF=1 偶转 JNP OPR PF=0 奇转

B、无符号数条件转移JB(JNAE,JC) OPR 条件: CF=1 小于转

JNP(JAE,JNC)OPR CF=0 大于等于转 JBE(JNA) OPR CFVZF=1 小于等于转 JNBE(JA) OPR CFVZF=0 大于转

C、带符号数条件转移JL(JNGE) OPR 条件: SF≯OF=1 小于转

JNL(JGE) OPR SF≯OF=0 大于等于转 JLE(JNG) OPR (SF≯OF)∨ZF=1 小于等于转 JNLE(JG) OPR (SF≯OF)∨ZF=0 大于转

D、 JCXZ OPR CX=0 CX=0转

<5> 例:

A、设: DS=2600H, BX=1256H, SI=528F

TAB( 位移量 )=20A1H PC当= 2000H

[232F7H]=3280H, [264E5H]=2450H

执行 JMP 1000H 后 IP=

JMP BX 后 IP=

JMP [BX+TAB] 后 IP=

JMP [BX+SI] 后 IP=

JMP 2000H : 1000H 后 IP= CS=

B、试分析下面程序 ST : MOV AL, X SHL AL,1 JC L2 CMP AL,Y JNZ L1 MOV Z,0 HLT L1 : JB L3 L2 : MOV Z,1 HLT L3 : MOV Z,-1 HLT

2、子程序调用和返回指令 A、调用指令:把下一条指令的地址 (CS/IP 即断点)

压栈,并实现转移( DST 送 IP/CS) CALL DST 段内直接 SP←SP-2 调用 [SP+1,SP]←IP / IP←IP+D16 段内间接 SP←SP-2 调用

[SP+1,SP]←IP / IP←EA 段间直接 SP←SP-2 [SP+1,SP]←CS 调用 SP←SP-2 [SP+1,SP]←IP IP←偏移地址 CS←段地址

段间间接 SP←SP-2, [SP+1,SP]←CS 调用 SP←SP-2, [SP+1,SP]←IP IP←(EA) CS←(EA+2) B、返回指令 RET 段内返回

IP← [SP+1,SP] SP←SP+2

RET EXP 段内带立即数返回 IP←[SP+1,SP] SP←SP+2

SP←SP+D16 ( 出栈后修改 SP)

RET IP←[SP+1,SP] 段间返回 SP←SP+2 CS←[SP+1,SP] SP←SP+2 RET EXP IP←[SP+1,SP] 段间带立即数返回 SP←SP+2

CS←[SP+1,SP] SP←SP+D16

注: EXP 是一个表达式,其值为 D16( 位移量 ) 。它用来在 返回地址出栈后修改堆栈指针。这便于调用程序在

用 CAIL 之前把子程序所需参数入栈,以便子程序使 用。当子程序返回后,这些参数已不再有用,就可

以修改栈指针使其指向参数入栈以前的值。

C 例:

CALL 1000H

CALL AX

CALL 2500H:3600H

CALL DWORD PTR[DI]

RET6

3、循环控制指令 LOOP OPR CX←CX-1,当 CX≠0 时: 则: IP←IP+D8实现循环

否则: IP 值不变 ,退出循环 LOOPZ(LOOPE) OPR

CX←CX-1,当 CX≠0,ZF=1 时: 则: IP←IP+D8实现循环

否则: IP 值不变 ,退出循环 LOOPNZ(LOOPNE) OPR

CX←CX-1,当 CX≠0,ZF=0 时: 则: IP←IP+D8实现循环 否则: IP 值不变 ,退出循环

注:循环控制指令不影响条件码。 LOOPZ/LOOPNZ提供了提前结束循环的可能性。

例:试分析下面程序 ST : MOV CX, M MOV AX, 0 MOV SI, AX L1 : ADD AX,[ARRAY +SI] ADD SI, 2 LOOP L1 MOV [ TOTAL], AX

HLT

4、中断指令和中断返回指令 A、 INT SP←SP-2;[SP+1,SP]←PSW INT TYPE SP←SP-2;[SP+1,SP]←CS SP←SP-2;[SP+1,SP]←IP IP←(TYPE*4) CS←(TYPE*4+2) 注: TYPE 为类型号,其值为 0~ 255 。 (TYPE 不能为 0) INT 是一个字节的中断指令,它隐含的类型号为 3 。

(断点中断 ) INT 指令在执行完上述操作后,将 0→IF→TF 。

B、 INTO 若 OF=1 则: SP←SP- 2;[SP+1,SP]←PSW, SP←SP- 2;[SP+1,SP]←CS SP←SP- 2;[SP+1,SP]←IP IP←[00010H,00011H] CS←[00012H,00013H] 注: INTO 为若溢出则中断的指令。 ( 类型号为 4) C、 IRET IP←[SP+1,SP] , SP←SP+2 CS←[SP+1,SP] , SP←SP+2

PSW←[SP+1,SP] , SP←SP+2 注:中断指令:保存现场: PSW、 CS 、 IP 实现转移: [TYPE*4]→IP

[TYPE*4+2]→CS

5、处理器控制指令 A、 CLC 0→CF 进位位置 "0" CMC CF→CF 进位求反 STC 1→CF 进位置 "1" CLD 0→DF 方向标志置 "0" STD 1→DF 方向标志置 "1" CLI 0→IF 中断标志置 "0" STI 1→IF 中断标志置 "1" B、 NOP 无 (空 ) 操作 HLT 停机 WAIT 等待

C、 ESC mem 交权 (调用协处理器工作 ) ESC 指令把mem存贮单元的内容送到 数据总线。这条指令在使用协处理器 执行某些操作时,可以从存贮器取得 指令或操作数。 D、 LOCK 封锁 该指令是一种前缀,它可以与其它指 令联合,用来维持总线的锁存信号直 到与其联合的指令执行完为止。 当 CPU 与其他处理机协同工作时,该

指令可避免破坏有用信息。

小 结 一、 CPU 结构 1 、通用寄存器: AX,BX,CX,DX/AH,AL,BH,BL,CH, CL,DH,DL 专用寄存器: SP,BP,SI,DI 。 标志寄存器: F,(AF,CF,OF,SF,PF,ZF//DF,IF,TF,) 段地址寄存器: CS,DS,ES,SS 指针寄存器: IP 2 、一个 20 位的物理地址可表示成段地址:偏移地址,

其计算方法如下: 物理地址= ( 段地址 X10H ) +偏移地址

二、寻址方式 1 、立即寻址:操作数由指令给出 MOV DX,100H 2 、寄存器寻址:操作数在寄存器中 ADD AX,BX 3 、直接寻址:操作数有效地址由指令给出 MOV AX,[100] MOV AX,VAR 4 、寄存器间接寻址: 操作数的地址在寄存器中,这些寄存器可以 为 BX,BP;SI,DI. 其操作数地址为: A 、┌ BX┐ ( 数据段基址寻址 ) │SI│+位移量+ [DS]* 16 ( 变址寻址 ) └DI┘ ( 变址寻址 ) [BP] +位移量+ [SS]* 16 ( 堆栈段基址寻址 )

B 、┌ SI┐ │ │+ [BX] +位移量+ [DS]*16 ( 基址加变址 ) └DI┘ ┌SI┐ │ │+ [BP] +位移量+ [SS]*16 ( 基址加变址 ) └DI┘ 注:只要用上 BP ,那就默认段寄为 SS ,其他情况为DS 5 、编写指令时应注意的几个问题 A 、注意区别立即寻址方式和直接寻址方式 如: MOV AX,126 与 MOV AX,[126] B 、使用寄存器间址时,应注意和寄存器寻址方式的 区别 如: MOV AX,BX 与 MOV AX, [BX]

C 、在双操作数指令中 , 源操作数和目的操作数的地 址不能同时为存贮器地址。 如: M1 和 M2 为两个存贮器变量, 则: ADD [M1], [M2] 是错误指令。 D 、代码段寄存器 CS 不能用作指令的目的寄存器。 三、指令 1 、数据传送指令 A 、 MOV DST,SRC (DST: 目的操作数, SRC 源操作数 ) 指令的 7种格式与注意事项。 PUSH SRC 指令的操作过程, SP 的变化情况

POP DST 指令的操作过程, SP 的变化情况 XCHG OPR1 ,OPR2 (交换 ) B 、 IN AC,PORT 只能用 AX/AL,DX//64K空间 OUT PORT, AC XLAT (换码 ) AL←[BX + AL] BX 为表格首址, AL 为项号 C 、 LEA REG,SRC 有效地址送寄存器 REG 为通用寄存器 LDS REG,SRC 指针送寄存器和 DS LES REG,SRC 指针送寄存器和 ES

D 、 LAHF 标志送 AH SAHF AH 送标寄 2 、算术运算指令 A 、 ADD DST,SRC ADC DST,SRC INC OPR INC 指令不影响 CF B 、 SUB DST,SRC SBB DST,SRC DEC OPR DEC 指令不影响 CF NEG OPR CMP OPR1 ,OPR1 建立标志/后跟条转

C 、 MUL SRC 字节: AL*(SRC)→AX 字: AX*(SRC)→DX,AX IMUL SRC (带符号) DIV SRC 字节: AX÷(SRC)→AL (余在 AH) 字: DX,AX÷(SRC)→AX (余在 DX) IDIV SRC ( 带符号 ) D 、 CBW ( 字节转换为字 )/ (AL扩展到 AH) CWD ( 字转换为双字 )/ (AX扩展到 DX) E 、 DAA (BCD 码加调正/压缩码 ) DAS (BCD 码减调正/压缩码 ) AAA (非压缩 BCD 码加调正 ) AAS (非压缩 BCD 码减调正 )

AAM 非压缩 BCD 码乘调正 将 AL积除 OA,商存 AH; 除数存 AL 中。 AAD 非压缩 BCD 码除调正 将被除数 AX调正为 2 进制数 ; H*10+AL→AL 3 、逻辑运算和移位指令 A 、 AND DST,SRC OR DST,SRC NOT OPR XOR DST,SRC TEST OPR1 ,OPR2 (OPR1∧OPR2)

B 、 SHL OPR,CNT (CNT 为 1 或 CL) SAL OPR,CNT 算术左移 SHR OPR,CNT 逻辑右移 SAR OPR,CNT 算术右移 ROL OPR,CNT 循环左移 ROR OPR,CNT 循环右移 RCL OPR,CNT 带进位循环左移 RCR OPR,CNT 带进位循环右移 4 、串处理指令 (使用串指令的条件 ) A 、 REP 重复前缀 CX≠0重复 MOVSB 字符串传送 ( DI )←( SI ) MOVSW 指针自动修改 条件: SI,DI,CX及 DF 赋值后 才可用 MOVSB/W)

B 、 LODSB 取字符串 AC←(SI) LODSW C 、 STOSB 存字符串 (DI)←AC STOSW D 、 REPE/REPZ 重复前缀 CX≠0,ZF=1 时重复 REPNE/REPNZ 重复前缀 CX≠0,ZF=0 时重复 CMPSB 字符串比较 (SI)- (DI) CMPSW 自动修改指针 E 、 SCASB 字符串捡索/ AC- (DI) SCASW 关键字要事先存入 AL,AX 中

5 、控制转移指令 A 、 JMP SHORT PTR OPR 段内直接短转移 JMP NEAR PTR OPR 段内直接近转移 JMP WORD PTR OPR 段内间接转移 JMP FAR PTR OPR 段间直接转移 JMP DWORD PRT OPR 段间间接转移 B 、 JZ/JE OPR ZF=1 JNE/JNE OPR ZF=0 JS OPR SF=1 JNS OPR SF=0

JO OPR OF=1 JNO OPR OF=0 JP OPR PF=1 JNP OPR PF=0 JB/JNAE/JC OPR CF=1 无符号数小于转 JNB/JAE/JNC OPR CF=0 无符号数 大于等于转 JBE/JNA OPR CF∨ZF=1 无符号数 小于等于转 JNBE/JA OPR CF∨ZF=0 无符号数 大于转 JL(JNGE) OPR SF≯OF=1 带符号数 小于转

JNL(JGE) OPR SF≯OF=0 带符号数 大于等于转 JLE/JNG OPR (SF≯OF)∨ZF=1 带符号数 小于等于转 JNLE/JG OPR (SF≯OF)∨ZF=0 带符号数 大于转 JCXZ OPR (CX)=0 CX=0转 C 、 CALL DST 指令的操作过程 RET (EXP) 指令的操作过程 /EXP 的含义

D 、 LOOP OPR 循环控制, CX≠0转移 LOOPZ/LOOPE OPR 循环控制 , CX≠0;ZF=1 则转移 LOOPNZ/LOOPNE OPR 循环控制, CX≠0;ZF=0 则转移 E 、 INT 指令操作过程 INT TYPE INTO IRET F 、 CLC 进位位 (CF)置 "0" CMC 进位位 (CF) 求反 STC 进位位 (CF)置 "1" CLD 方向标志置 "0"

STD 方向标志置 "1" CLI 中断标志置 "0" STI 中断标志置 "1" NOP HLT WAIT 等待 ESC mem 交权 LOCK 封锁 / 前缀 6 、使用指令时,应注意的几个问题 A 、指令对地址还是对地址中的内容进行操作, 要严加区分。 如: LEA BX,MESS MESS 的偏移地址→ BX

B 、使用指令时,要清楚指令隐含的操作寄存器 如:乘法隐含的目的操作数 : AX/AL 除法隐含的目的操作数 : DX,AX/AL 串指令隐含的操作数为: SI,DI 与 AL等。 重复前缀 : CX 十进制调正指令隐含地使用了 AL 换码指令 :XLAT [BX+AL]→AL 循环指令 : CX 输入、输出指令 : AX/AL, DX C 、对带符号数和无符号数的操作应正确选择相应的条 件转移指令。

D 、用移位指令来倍增或倍减一个值时,要注意对 带符号数和无符号数所使用的指令应是不同的。 如: AX=8520H 当 AX 为无符号数时 ,AX/2 可用 SHR AX,1 结果为 4290H ; 当 AX 为带符号数时, AX/2 应用 SAR AX,1 结果为 C290H 。 E 、标号是程序中指令的符号地址,要注意和变量 ( 数据符号 ) 的区别。 如:定义 VAR为一变量, LAB 为一标号 JMP LAB 指令的转移地址为 LAB JMP VAR为一非法指令。

四、举例 1 、指出下列指令的错误 A 、 MOV AH,BX B 、 MOV [BX],[SI] C 、 MOV AX,[SI][DI] D 、 MOV [BX][SI],ES:AX E 、 MOV BYTE PTR[BX],1000H

F 、 MOV CS,AX G 、 MOV DS,BP H 、 INC [AX]

2 、求双字长数 DX:AX 的补码数

3 、将 DX:AX 中双字长数乘以 2 / 除以 2

4 、两字节数相加 ,设两字节数存于 BL 、 DL 中 , 和存于 AX 中。 A 、无符号数

B 、带符号数

5 、比较 AX,BX,CX 中带符号数大小, 将最大数存于 AX 中。

6 、已知内存中有一以 ARRAY为首址的 100 个字的数组 , 试将数组中每个数加 1

7、试将 ELEMS 中的 100 个字节数据的位置颠倒过来

1 X>0

8 、设 Y = 0 X=0 已知一个 8 位带符号数存于 X 单

-1 X<0 元中试求 Y值存于 AL 中。

9 、有 3 个数存于 TAB 为首址单元中,试将中值存于 A中 设数为带符号数

10 、有 3 个无符号字节数存于 BUF 为首址单元中 ,若3 个 数都不为 0, 则求 3 个数之和 , 存于以 BUF + 3 为首址 单元中;若 3 个数有 1 个为 0, 则将其它 2 个单元清零

11 、设有 50 个 ASCLL 字符存于 BUF 为首址单元中,求出 字符串中 A 字符的个数存于 DL 中,并将 A 字符的地

址顺序存于以 ADRY为首址的单元中。

12 、设有 50 个 ASCLL 字符存于 STG 为首址单元中,求出 字符串中 0-9 字符的个数存于 DL 中,并将 0-9 字符

顺序存于以 BUF 为首址的单元中。

top related