第三章 微型计算机指令系统指令系统是微处理器( CPU)所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。在本章中我们主要讲解
INTEL公司生产的 8086/8088CPU的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功能和使用方法。
通过本章的学习,读者应该掌握以下内容:
3种操作数的寻址方式
常用指令的格式、功能、以及对标志位的影响
3,1 8086/8088的寻址方式操作码 操作数汇编指令:
操作码,指令操作类型;
操作数,指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。
例,MOV AX,CX ;将 CX的内容送入 AX中。
本章主要介绍 8086/8088的指令系统以及在指令中为取得操作数地址所使用的寻址方式。
3,1,1 立即寻址方式指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中 。 立即数有 8位和 16位。
例,MOV AL,5 ;源操作数为立即寻址指令执行后,AL=05H,8位数据 05H存入 AL寄存器。
例,MOV AX,3064H ;源操作数为立即寻址指令执行后,AX=3064H,16位数据 3064H存入 AX寄存器。
3,1,2 寄存器寻址方式寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括 8位或 16位通用寄存器和段寄存器。
可使用的 16位寄存器,AX,BX,CX,DX,SI,DI、
SP,BP;其中,AX,BX,CX,DX可分成两 8位使用。
例,MOV AX,CX ;( AX) ( CX)
MOV AL ;( AL) ( AL) -1
3,1,3 内存寻址方式在内存寻址方式中,操作数是某个内存单元的内容
(值),指令中给出的是内存单元的有效地址 EA(即偏移地址),段地址通常在隐含的某个段寄存器中。
1、直接寻址方式直接寻址方式的操作数的形式为,Variable或 [Variable]
在直接寻址方式中,操作数的偏移地址 (有效地址 EA)
直接用指令加以指定 (有直接地址值和标号两种形式 ),
它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。段地址隐含的由 DS 指定,也可以 ES指定,但需在指令中指明。最后存储器地址为,DS:偏移地址 或 ES:偏移地址。
例,MOV AX,ES:[2000H]
将 ES:2000H单元内容送入 AX。
例,MOV AX,LABLE 或 MOV AX,[LABEL]
将标号为 LABLE(存放操作数单元的符号地址 ),即
DS:LABLE中的内容送入 AX。
2、寄存器间接寻址寄存器间接寻址方式的操作数形式为,[reg]
操作数的有效地址包含在基址寄存器 BX,基址指针 BP
或一个变址寄存器( SI或 DI)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。
例,MOV AX,[BX];将由 BX决定的存储单元的内容送到 AX寄存器。
0000
0001
0002
0003
BB
AA
TAB:
AX
AH AL
AA BB
间接寻址数据段
0001BX
操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。
( BX)
( SI)
( DI)
( BP)
有效地址 = 段寄存器为 DS
段寄存器为 SS
物理地址计算方法:
物理地址 = ( DS) * 16 + ( BX)或( SI)或( DI)
物理地址 = ( SS) * 16 + ( BP)
例:已知:( DS) =2100H,( DI) =2000H
指令,MOV AX,[DI] ;( AX) (( DI))
物理地址 =( DS) * 16 + ( DI)
=2100H * 16 + 2000H
=21000H + 2000H
=23000H
指令结果:将 23000H单元内容送 AL中,
将 23001H单元内容送 AH中。
3、寄存器相对寻址方式操作数在存储器内,指令中寄存器内容与指令指定的位移量( DISP)之和作为操作数所在单元的有效地址。
( BX) DISP8
( SI)
( DI)
( BP) DISP16
有效地址 = 段寄存器为 DS
段寄存器为 SS
+
物理地址 = ( DS) * 16 +( BX) +DISP8
( SI)、( DI),DISP16类同。
物理地址 = ( SS) *16 + ( BP) +DISP16
例,如果 (DS)=3000H,(SI)= 2000H,COUNT=3000H,
则执行指令 MOV AX,CONUT[SI],求出此种寻址方式对应的有效地址和物理地址。
有效地址 = 2000H + 3000H = 5000H
物理地址 =( DS) *16 + 5000H
=30000H + 5000H =35000H
4、基址变址寻址方式:
操作数在存储器中,指令将基址寄存器( BX或 BP)
与变址寄存器( SI或 DI)内容之和作为操作数所在存储单元的有效地址。
( BX) ( SI)
( BP) ( DI)
有效地址 = +
物理地址 = ( DS) * 16 + ( BX) + ( SI)或( DI)
物理地址 = ( SS) * 16 + ( BP) + ( SI)或( DI)
例,MOV AX,[BX+DI] 或 MOV AX,[BX][DI]
DS:(BX)+(DI) 字存储单元内容送 AX。
例,MOV AX,[BP+SI] 或 MOV AX,[BP][SI]
SS:(BP)+(SI) 字存储单元内容送 AX。
例:如果 (DS)=2100H,(BX)= 0158H,(DI)=10A5H,EA=11FDH,
则执行指令 MOV AL,[BX][DI]
有效地址,EA=( BX) +( DI) =0158H+10A5H=11FDH
物理地址:( DS) * 16 + 有效地址 =21000H+11FDH=221FDH
执行结果:将 221FDH单元内容送入寄存器 AL中。
5、相对基址变址寻址方式操作数在存储器内,指令将基址寄存器( BX或 BP)与变址寄存器( SI或 DI)的内容之和再加上位移量( 8位或 16位),得到操作数所在单元的有效地址。
( BX) ( SI) DISP8
( BP) ( DI) DISP16有效地址 = + +
物理地址 = ( DS) * 16 +( BX)产生的有效地址物理地址 = ( SS) * 16 +( BP)产生的有效地址例:已知:( DS) =3000H,( BX) =2000H,( SI) =1000H,
MK=0250H
指令,MOV AX,MK[BX][SI]
或 MOV AX,MK[BX+SI]
或 MOV AX,[MK+BX+SI]
有效地址,MK+( BX) +( SI) =0250H+2000H+0100H
=3250H
物理地址:( DS) *16 +有效地址 =30000H+3250H=33250H
执行结果:将 33250H单元内容送 AL,33251H内容送 AH。
3,1,4 段超越当操作数在内存单元时,系统根据隐含约定,自动将寄存器 DS或 SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。
段超越前缀形式为:
段寄存器名:
例如:
MOV AX,ES,[BP] ;段地址在 ES
MOV AX,CS,[BX] [SI] ;段地址在 CS
段地址的基本约定和允许超越的情况如表所示:
存储器存取方式 约定段 允许超越段 偏移地址取指令堆栈操作源串目的串
BP作基址通用数据读写
CS
SS
DS
ES
SS
DS
无无
CS,ES,SS
无
CS,DS,ES
CS,ES,SS
IP
SP
SI
DI
有效地址 EA
有效地址 EA
3,1,5 对 8086内存寻址方式的注解
( 1)在汇编后,指令中的变量名有具体的偏移地址所取代。
( 2)在寄存器相对寻址与相对基址变址方式中,位移量 disp可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。
( 3)在 Microsoft宏汇编 MASM( Microsoft Macro
Assembler)中,内存操作数可以采用多种书写形式。
( 4)操作数中使用变量的地方也可以用下列形式:
变量名 ± 整数表达式。
5)计算出的有效地址以 16位表示,若超过 0FFFFH,
CPU将忽略所有溢出。
( 6)记忆 8086内存操作数形式的简易方法如下:
[BX] [SI]
disp
[BP] [DI]
每列选择 0项或一项,构成至少一项,即可得到有效的内存操作数形式。
3,2 标志位在标志寄存器 FLAGS中有若干标志位,这些标志用来表示 CPU当前的操作方式和状态信息。
与普通应用程序有关的主要是 FLAGS中的 9个标志
6个状态标志( CF,OF,SF,ZF,AF,PF)
3个控制信息标志( DF,IF,TF)
3,2,1 深入认识 CF和 OF
1,深入认识 CF和 OF
CF表示无符号溢出,即运算结果超出了无符号数的表示范围。
OF表示带符号溢出,即运算结果超出了带符号数的表示范围。
2,CF和 OF判断方法
( 1)加法
① CF的判断方法从十进制角度来看,若无符号加的结果大于 2n-1
( n为位数),则 CF=1,否则 CF=0。
从二进制角度来看,若结果最高位向前有进位,则
CF=1,否则 CF=0。
② OF的判断方法从十进制角度来看,若带符号加的结果不在范围-
2 n - 1~2 n-1- 1( n为位数)内,则 OF=1,否则
OF=0。
从二进制角度来看,若两个数同号,而相加结果与之异号,说明溢出,则 OF=1,否则 OF=0。
例,8位数加法,判断 CF和 OF
二进制加法 看作无符号数 看作带符号数
① 0011 0000B 6 6
+ 0000 1001B + 9 + 9
0011 1001B 15 15
CF=0 OF=0
② 0000 0111B 7 +7
+ 1111 1011B +251 + (- 5)
0000 0010B 258 +2
1 CF=1 OF=0
现为 2结果错
③ 0000 1001B 9 +9
+ 0111 1100B + 124 +( +124)
1000 0101B 133 +133
CF=0 OF=1
现为- 123,结果错
④ 1000 0111B 135 (- 121)
+ 1111 0101B + 245 + (- 11)
0111 1100B 380 - 132
1 CF=1 OF=1
现为 124,结果错 现为 124,结果错
( 2)减法
① CF的判断方法从十进制角度来看,若无符号减数大于被减数,则
CF=1,否则 CF=0。
从二进制角度来看,若结果最高位向前有借位,则
CF=1,否则 CF=0。
② OF的判断方法从十进制角度来看,若带符号减的结果不在范围 -
2 n-1~2 n-1- 1( n为位数)内,则 OF=1,否则
OF=0。
从二进制角度来看,若两个数异号,而结果与被减数符号相反,说明溢出,则 OF=1,否则 OF=0。
3,3 指令系统
8086/8088的指令系统可以分为 6组:
( 1)数据传送指令;
( 2)算术运算指令;
( 3)逻辑指令与移位指令;
( 4)串操作指令;
( 5)控制转移指令;
( 6)处理机控制指令;
3,3,1 数据传送指令数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中 。
1,MOV( Move):传送指令
MOV指令的格式为:
MOV dest,src ; dest←src
功能:将源操作数 src复制到目的操作数 dest中,结果目的操作数的内容等于源操作数的内容,源操作数 src的内容不变。
对标志位的影响:无语法格式:
MOV reg/mem/seg,reg/mem/seg/imm
说明:
( 1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。
MOV seg,seg ;错误
MOV mem,mem ;错误
( 2)立即数不能传送到段寄存器中。
MOV seg,imm ; 错误
( 3)目的操作数不允许使用 CS段寄存器。
( 4) dest与 src必须类型匹配,即同时是字节或字类型。
以下几点要注意:寄存器具有明确的类型,例如,AL、
AX分别为字节、字类型。若立即数没有明确的类型,
MASM负责将立即数扩展为与目的操作数位数相同。
有时 MASM不能确定内存操作数的类型,需要用
byteptr和 wordptr明确指出是字节或字类型。关于 PTR
的详细介绍见第 4章。只要其中一个操作数的类型确定即可。
例:错误的 MOV 指令如下所示:
MOV AX,BL ;类型不匹配
MOV DS,1000H ;不允许立即数送段寄存器
MOV [BX],[SI] ;不允许内存操作数之间传送
MOV ES,CS ;不允许段寄存器之间传送
MOV CS,AX ; CS不能作为目的操作数例:设 B是已定义的字节变量,以下是一些错误和正确的指令。
MOV AX,B ;错误,类型不匹配
MOV A,0 ;正确,MASM可以判断出要送字节 0
2,XCHG( Exchange):交换指令
XCHG指令的格式为:
XCHG oprd1,oprd2 ;交换 oprd1与 oprd2的内容语法格式为:
XCHG reg/mem,reg/mem
例,XCHG BX,[BP+SI]
如指令执行前:( BX) =6F30H,( BP) =0200H,( SI)
=0046H,( SS) =2F00H,( 2F00H) =4254H,OPR2
的物理地址 =2F00+0200+0046=2F246
则指令执行后:( BX) =5154H,( 2F246H) =6F30H。
3、堆栈操作指令堆栈概念 ------ 存储器的一段区域,按“先进后出”
的原则进行存出操作。 8086/8088系统,堆栈位于堆栈段,其段地址由 SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元。
作用,在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。
指令格式:进栈 PUSH SRC ;
操作:( SP) ( SP) -2,(( SP) +1,( SP)) ( SRC)
出栈 POP DST ;
操作:( DST) (( SP) +1,( SP)),( SP) ( SP) +2
堆栈
SS,01F8
SS,01FA
SS,01FC
SS,01FESP
AA BB
(执行 PUSH AX之前)
堆栈
SS,01F8
SS,01FA
SS,01FC
SS,01FE
SP
AA BB
(执行 PUSH AX之后)
1101H 1101H
AX
堆栈
SS,01F8
SS,01FA
SS,01FC
SS,01FESP
AA BB (执行 POP AX之后)
1101H
AX
1 2
3
8086/8088系统的堆栈具有如下特点:
·堆栈是在内存的堆栈段中,具有“先进后出”的特点;
·堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元;
·堆栈有两个基本操作,PUSH(进栈)和 POP(出栈)。
PUSH操作使栈顶向低地址方向移动,而 POP操作则刚好相反;
·堆栈操作只能作字操作;
·SS,SP在任何时候都指向当前的栈顶。
4、地址传送指令将操作数所在存储器的地址送入目标寄存器。
指令格式:
有效地址送寄存器,LEA reg16,mem ; reg16 mem
指针送寄存器和 DS,LDS reg16,mem32 ;
把源操作数指定的 4个相继字节到由指令指定的寄存器及 DS寄存器中。该指令常指定 SI寄存器。
指针送寄存器和 ES,LES reg16,mem32 ;
把源操作数指定的 4个相继字节送到由指令指定的寄存器及 ES寄存器中。该指令常指定 DI寄存器 。
LEA 指令与 MOV 指令的区别:
LEA SI,BUFF指令是将标号 BUFF的偏移地址送入寄存器中;
MOV SI,BUFF指令是将标号 BUFF所指存储单元的内容送入 SI。
BUFF =
0
1
2
3
4
5
48
00
FE
FF
LEA SI,BUFF;
执行后:( SI) =0002H
MOV SI,BUFF;
执行后:( SI) =0048H
段起始地址
B,LDS或 LES指令将源操作数指定的 4个连续字节单元内容分别送入指令指定的寄存器以及 DS或 ES中。
其中:低 16位送到一个指定的字寄存器,高 16位送到
DS或 ES中。
57H
13H
68H
24H
例:( DS) =C000H,( C2480H) =1357H,( C2482H) =2468H
DS,2480H
DS,2481H
DS,2482H
DS,2483H
13 57
24 68
SI
DS
LDS SI,[2480]
4、标志寄存器传送指令指令格式:
LAHF ; ( AH) ( PSW低字节)
SAHF ; ( PSW低字节) AH
PUSHF; ( SP) ( SP) -2,(( SP) +1,( SP)) ( PSW)
POPF ; ( PSW)(( SP) +1,( SP))( SP)( SP) +2
说明,LAHF/SAHF指令是寄存器 AH与标志寄存器 PSW的低字节之间完成的字节型数据传送。
PUSHF/POPF指令是标志寄存器 PSW与堆栈间进行的字型数据传送。
指令 SAHF/POPF将影响标志位。
4,2,2 算术运算指令
1、加法指令指令格式:
加法 ADD DST,SRC;( DST) ( SRC) +( DST)
带进位加法 ADC DST,SRC;
( DST) ( SRC) +( DST) +CF
加 1 INC OPR ;( OPR) ( OPR) +1
说明:这在三条指令运算结果将影响状态标志位,但是 INC指令不影响标志 CF。
2、减法指令指令格式:
减法 SUB DST,SRC ;( DST) ( DST) - ( SRC)
带进位减法 SBB DST,SRC;( DST)( DST) -( SRC) -CF
减 1 DEC OPR ;( OPR) ( OPR) -1
求补 NEG OPR ;( OPR) 0FFFFH-( OPR) +1
比较 CMP OPR1,OPR2;( OPR1) -( OPR2)
以上五条指令均可作字或字节运算,而且除 DEC不影响 CF外,其他都按一般规则影响状态标志位 。
3、乘法指令指令格式:
无符号数乘法 MUL SRC ;( AX)( AL) *( SRC)字节乘法;( DX,AX)( AX) *( SRC)字乘法带符号数乘法 IMUL SRC;操作同上进行字节运算时,目的操作数必须是累加器 AL,乘积在寄存器
AX中;进行字运算时,目的操作数必须是累加器 AX,乘积在寄存器 DX,AX中。 源操作数不允许使用立即数。
乘法指令运算结果只影响状态标志 CF,OF。
例,MUL BX ;无符号数乘法,BX乘上 AX
4、除法指令指令格式:
无符号数除法 DIV SRC ;( AL) ( AX) /( SRC)除法的商
( AH) ( AX) /( SRC)除法余数或者 ( AX)( DX,AX) /( SRC)除法的商
( DX)( DX,AX) /( SRC)除法余数带符号数除法 IDIV SRC ;操作同上。
当除数是字节数据时,被除数必须放在 AX中;当除数是字数据时,被除数必须放在 DX,AX中。
除法指令运算结果对状态标志无定义。
8086/8088规定 IDIV指令运算结果余数的符号与被除数相同。
带符号数除法运算中,当被除数位数不够时,可进行扩展。
符号扩展指令:
字节扩展到字 CBW;将寄存器 AL中的符号位扩展到寄存器 AH
字扩展到双字 CWD;将寄存器 AX中的符号位扩展到寄存器 DX
7 0AL7 0AH
015 AXDX15 0
CBW
CWD
5、压缩 BCD码十进制调整指令加法十进制调整 DAA;
执行的操作:这条指令执行前必须先执行 ADD或 ADC
指令,加法指令必须把两个压缩的 BCD码相加,并把结果存放在 AL寄存器中。
减法十进制调整 DAS;
执行的操作:这条指令执行之前,必须先执行 SUB或
SBB指令,减法指令必须把两个 BCD码相减,并把结果存放在 AL寄存器中。
调整的方法:
累加器 AL低 4位大于 9或辅助进位标志位 AF=1,则累加器 AL加
06H修正。
累加器 AL高 4位大于 9或辅助进位标志位 AF=1,则累加器 AL加
60H修正。
累加器 AL高 4位大于等于 9,低 4位大于 9,则累加器 AL进行加
66H修正。
例:进行 BCD码加法运算 59+68=127
0101 1001 59
+ 0110 1000 68
1100 0001 C1
+ 0110 0110 66
10010 0111 127
加法运算结果为 C1,
AF=1,高位大于 9
加 66H进行压缩
BCD调整说明:
压缩 BCD码加法或减法十进制调整指令必须在 ADD( ADC)
或 SUB( SBB)指令之后,调整结果对标志 OF无影响,对其它状态标志位均有影响。
减法十进制调整方法与加法十进制调整方法类同,只是将加 6
变为减 6操作。
6、非压缩 BCD码十进制调整指令指令格式:
加法十进制调整 AAA ;
减法十进制调整 AAS ;
乘法十进制调整 AAM ;
除法十进制调整 AAD ;
AAA指令将 AL的内容变换成一位非压缩的十进制数。 AAA检查 AL低四位,如低四位是 0--9的数字,AAA就清除 AL的高四位,以及 AF和 CF标志;如 AL低四位表示的数大于 9或 AF=1,
AAA执行:
加 6到 AL寄存器;
加 1到 AH寄存器;
置 AF=1,CF=1;
清除 AL高四位为 0。
例,ADD AL,BL; AL和 BL中的数相加
AAA ;非压缩 BCD码调整
AAS指令检查 AL低四位,如低四位表示的数是 0-9的数字,
ASS清除 AL高四位及 CF和 AF标志;如 AL低四位表示的数大于
9或 AF=1,AAS进行如下调整:
AL减去 6;
AH减去 1;
置 AF=1,CF=1;
清除 AL中高四位。
例,SUB AL,BL;
AAS
AAM指令的作用是用 10( 0AH)来除 AL寄存器的内容,并将除得的商和余数分别送到 AH和 AL来实现转换。
例,MUL BL ; AL * BL
AAM
3,3,3 逻辑指令与移位指令
1、逻辑运算指令:对字节或字数据进行按位的操作。
格式:
逻辑与 AND DST,SRC; ( DST)( DST) AND( SRC)
逻辑或 OR DST,SRC; ( DST)( DST) OR( SRC)
逻辑非 NOT OPR ; ( OPR)( OPR)
异或 XOR DST,SRC; ( DST)( DST) XOR( SRC)
测试 TEST OPR1,OPR2;( OPR1) AND( OPR2)
( 1)、逻辑与( AND)、或( OR)、异或( XOR)操作指令
AND指令主要用来屏蔽掉一个数中某些位,以便对剩下的其它位进行某些处理。对那此两个操作数都是 1的位,目的操作数相对应位就是 1,其它各种组合的位,目的操作数相应位都是 0。
例,AND AX,BX ;两个寄存器逻辑与
AND AL,MEM-BYTE;寄存器和存储单元逻辑与
AND MEM-BYTE,AL;存储单元和寄存器逻辑与
OR指令在两个操作数相对应位中有一个是 1或两个都是 1时,
在目的操作数的该位产生一个 1。
例,OR BX,0C000B
将 BX的两位最高的有效位( 15和 14位)置成 1,而其它位不变。
XOR指令主要用于判断两个操作数中那些位是不同的。如两个操作数相对应位的值不同时,在目的操作数产生一个 1。相同为 0,不同为 1。
例,XOR BX,0C000B;
NOT指令改变寄存器或存储单元的每一位状态,原来为 0变为
1,原为 1变为 0。
例,NOT AX ; AX各位取反
TEST指令是一条测试指令,它执行的操作与 AND相同,不过它不送回结果,只影响标志位。
例,TEST AL,0000 0001B;如 AL最低位为 0,则 ZF=1。
2、移位指令逻辑左移 SHL OPR,CNL
算术左移 SAL OPR,CNL
逻辑右移 SHR OPR,CNL
算术右移 SAR OPR,CNT
其中,OPR为操作数,CNT为 1或 CL表示移位次数
0
CF OPR
0
CFOPR
CFOPR
例:设 AL=1011 0100,CF=1
在 SAL AL,1之后,AL= 0110 1000 CF=1
在 SAR AL,1之后,AL=1101 1010 CF=0
在 SHL AL,1之后,AL=0110 1000 CF=1
在 SHR AL,1之后,AL=0101 1010 CF=0
算术左移( SAL)和算术右移( SAR)实现带符号数移位。
SAR通过在整个移位过程中复制符号来保护操作数的符号。
SAL不保护进位,但如果符号位发生变化的话,就将 1送 OF标志。每次移位,SAL都将操作数空出来的第 0位置 0。
逻辑左移( SHL)和逻辑右移( SHR)对无符号数的移位。
SHL将操作数左移,空出来的第 0位置 0;
SHR将操作数右移,空出来的高位(字节时第 7位,字时第 15
位)置 0。
例:将两个非压缩 BCD码(高位在 BL,低位在 AL)合并成压缩 BCD码送 AL。
MOV CL,4 ;将计数值送 CL
SHL BL,CL ;将高位移到 BL的高 4位
AND AL,0FH;清零 AL高 4位
OR AL,BL ;合并 AL和 BL形成压缩 BCD码。
( 2)、循环移位指令循环左移 ROL OPR,CNT
循环右移 ROR OPR,CNT
带进位循环左移 RCL OPR,CNT
带进位循环右移 RCR OPR,CNT
CF OPR
CFOPR
CF OPR
CFOPR
例:设 AL=1011 0100B,CF=1执行下列语句:
执行 ROL AL,1 后,AL=0110 1001,CF=1
执行 ROR AL,1后,AL=0101 1010,CF=0
执行 RCL AL,1后,AL=0110 1001,CF=1
执行 RCR AL,1后,AL=1101 1010,CF=0
3,2,4 串操作指令串操作:对存储区中连续存放的字节或一串字进行操作。
1.与 REP前缀相配合工作的指令 MOVS,LODS、和
STOS指令
( 1) REP重复串操作直到( CX) =0为止。
格式,REP STRING PRIMITIVE
其中 STRING PRIMITIVE可为 MOVS,LODS或 STOS
指令。
① 如( CX) =0则退出 REP,否则继续执行;②( CX)
← ( CX)- 1;③ 执行其后的串指令;④ 重复① ~③ 。
( 2) MOVS串传送指令格式:① MOVS DST,SRC ;② MOVSB(字节);
③ MOVSW(字)
( 3) STOS存入串指令
STOS指令的格式为:① STOS DST ; ② STOSB(字节);③ STOSW(字)。
执行的操作:字节操作:(( DI)) ← ( AL),( DI)
← ( DI) ± 1
字操作,(( DI)) ← ( AX),( DI) ← ( DI) ± 2
( 4) LODS 从串中取指令
LODS指令的格式为:① LODS SRC ; ② LODSB(字节);③ LODSW(字)。
执行的操作:字节操作:(( AL)) ← ( SI),( SI)
← ( SI) ± 1
字操作,(( AX)) ← ( SI),( SI) ← ( SI) ± 2
2,与 REPE/REPZ和 REPNE/REPNZ联合工作的 CMPS和
SCAS指令
( 1) REPE/REPZ当相等 /为零时重复串操作
REPE/REPZ指令的格式为,REPE/REPZ string
primitive
其中 string primitive可为 CMPS或 SCAS指令。
执行的操作:①如( CX) =0或 ZF=0(即某次比较的结果两个操作数不等)时退出,否则继续执行;②
( CX) ← ( CX)- 1;③执行其后的串指令;④重复
①~③。
( 2) REPNE/REPNZ当不相等 /不为零重复串操作
REPNE/REPNZ指令的格式为,REPNE/REPNZ
string primitive
其中 string primitive可为 CMPS或 SCAS指令。
执行的操作:除退出条件为( CX) =0或 ZF=1外,其他操作与 REPE指令完全相同。
( 3)、串比较指令
CMPSB ;(( SI)) -(( DI))
( SI)( SI) ± 1,( DI)( DI) ± 1
CMPSW ;(( SI)) -(( DI))
( SI)( SI) ± 2,( DI)( DI) ± 2
( 4) SCAS串扫描指令
SCAS指令的格式为:① SCAS DST; ② SCASB(字节);③ SCASW(字)。
执行的操作:字节操作:(( AL)) ← ( DI),
( DI) ← ( DI) ± 1
字操作,(( AX)) ← ( DI),( DI) ← ( DI)
± 2
3,2,5 控制转移指令控制转移指令分成 无条件转移指令 和 条件转移指令 。
1,无条件转移指令转移可以分成两类,段内转移 和 段间转移 。
段内转移 是指在同一段的范围之内进行转移,此时只需改变 IP寄存器的内容,即用新的转移目标地址代替原有的 IP的值就可达到转移的目的。
段间转移 则是要转到另一个段去执行程序,此时不仅要修改 IP寄存器的内容,还需要修改 CS寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成 。
( 1)直接短转移 JMP SHORT OPR ;
操作:( IP) ( IP) +8位位移量
( 2)段内直接转移 JMP NEAR PTR OPR;
操作:( IP) ( IP) +16位位移量
( 3)段内间接转移 JMP WORD PTR OPR;
操作:( IP) (有效地址)
( 4)段间直接(远)转移 JMP NEAR PTR OPR
操作:( IP) ← OPR的段内偏移地址
( CS) ← OPR所在段的段地址
( 5)段间间接转移 JMP DWORD PTR OPR
操作:( IP) ← ( EA)
( CS) ← ( EA+2)
2、条件转移指令状态标志作为转移的条件,当满足一定的条件时,转移到指定的地址,否则,将顺序执行下条指令。
作为判断条件的状态标志位有,CF,PF,ZF,SF和 OF。
(1) 根据单个标志位的设置情况转移这组包括 10种指令,它们一般适用于测试某一次运算的结果并根据其不同特征产生程序分支作不同处理的情况 。
结果为零 ( 或相等 ) 转移 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
奇偶位为 1转移 JP/PE OPR ; PF=1
奇偶位为 0转移 JNP/JPO OPR; PF=0
低于 /不高于或等于 /进位为 1转移 JB/JNAE/JC OPR; CF=1
不低于 /高于或等于 /进位为 0转移 JNB/JAE/JNC OPR; CF=0
( 2)比较两个无符号数,并根据比较的结果转移。
低于 /不高于或不等于 /进位为 1转移
JB/JNAE/JC OPR; CF=1且 ZF=0
不低于 /高于或等于 /进位为 0转移
JNB/JAE/JNC OPR; CF=0或 ZF=1
低于或等于 /不高于转移 JBE/JNA OPR;
CF=1或 CF=1
不低于或不等于 /高于转移 JNBE/JA OPR;
CF=0且 ZF=0
( 3)比较两个带符号数,并根据比较结果转移。
小于或者不大于或者等于转移 JL(或 JNGE) OPR
SF⊕ ZF=1
小于或者不大于或者等于转移 JNL(或 JGE) OPR
SF⊕ ZF=0
小于或等于,或者不大于转移 JLE(或 JNG) OPR
( SF⊕ ZF) ∨ ZF=1
小于或等于,或者不大于转移 JNLE(或 JG) OPR
( SF⊕ ZF) ∨ ZF=0
( 4)测试 CX的值为 0则转移指令
JCXZ OPR; ( CX) =0则转移
3、循环控制指令
( 1) LOOP( LOOP)循环指令格式,LOOP OPR
测试条件:( CX) ≠0
( 2) LOOPZ/LOOPE( Loop while zero or equal)
当为零或相等时循环指令格式,LOOPZ(或 LOOPE) OPR
测试条件,ZF=1且( CX) ≠0
( 3) LOOPNZ/LOOPNE( Loop while nonzero,or
not equal)当不为零或不相等时循环指令格式,LOOPNZ(或 LOOPNE) OPR
测试条件,ZF=0且( CX) ≠0
4、子程序
CALL调用指令
( 1)段内直接调用格式,CALL DST
执行的操作:( IP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( IP);
( IP) ← ( IP)+ D16;
(2)段内间接调用格式,CALL DST
执行的操作:( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← (IP);
( IP) ← ( EA)
(3)段间直接调用格式,CALL DST
执行的操作:( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( CS);
( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( IP);
( IP) ← 偏移地址(指令的第 2,3个字节);
( CS) ← 段地址(指令的第 4,5个字节)。
( 4)段间间接调用格式,CALL DST
执行的操作:( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( CS);
( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( IP);
( IP) ← ( EA);
( CS) ← ( EA+ 2)
RET返回指令段内返回 RET ;( IP) (( SP) +1,( SP))
( SP)( SP) +2
段内带立即数返回 RET EXP;
( IP)(( SP)) +1,( SP))
( SP)( SP) +2
( SP)( SP) +DISP16位移量段间返回 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) +2
( SP)( SP) +DISP16位移量
3,2,6 处理机控制指令
1.标志处理指令
( 1) CLC进位位置 0指令 (Clear carry) CF ←0
( 2) CMC进位位求反指令( Complement carry)
CF←CF
( 3) STC进位位置 1指令( Set carry) CF←1
( 4) CLD方向标志置 0指令 (Clear direction) DF←0
( 5) STD方向标志位置 1指令 (Set direction) DF←1
( 6) CLI中断标志置 0(关中断)指令( Clear
interrupt) IF←0
( 7) STI中断标志置 1(开中断)指令 (Set interrupt)
IF←1
2,其它处理机控制指令
( 1) NOP 空操作指令
NOP指令的语法格式为,NOP
( 2) HLT 停机指令
HLT指令的语法格式为,HLT
( 3) WAIT 等待指令
WAIT指令的语法格式为,WAIT
( 4) ESC 换码指令
ESC指令的语法格式为,ESC mem
( 5) LOCK 封锁前缀指令
LOCK指令的语法格式为,LOCK
习 题
1.判断下列指令是否正确。若不正确,指出错误原因。
( 1) MOV SP,DL ( 2) POP CS
( 3) MOV [BP][SI],[DI( 4) MOV [SP],[BP]
( 5) JLE BX ( 6) MOV ES,1000H
( 7) MOV AX,BX+2 ( 8) MOV ES,CS
( 9) AND AX,[CX] ( 10) SHR BL
2.说明指令 DEC AX与 SUB AX,1的区别。
3.IP寄存器能作为指令的操作数吗?哪类指令的执行会改变 IP的值?
4.在无符号数和带符号数比较两种情况下,分别给出下列条件成立时相关标志位的值。
( 1)相等 ( 2)不相等
( 3)小于
( 4)小于或等于 ( 5)大于
( 6)大于或等
5,说明 CALL和 RET指令要执行的操作。
6,如果过程的第一条指令是 POP AX,那么 AX的值将是什么?
7,在哪两种情况下,执行 DIV或 IDIV指令将出错?
8,给出与下列每组指令序列功能相同的一条指令。
( 1) MOV AH,AL
SAR AH,7
( 2) MOV DX,AX
SAR DX,15
( 3) TEST AX,1
JZ ISZERO
STC
JMP DONE
ISZERO,CLC
DONE
9,写出实现下列功能的指令序列。
( 1)将 AL与 BX中的两个无符号数相加,结果放入 AX。
( 2)将 AL与 BX中的两个带符号数相加,结果放入 AX。
10.分析下列指令序列完成什么功能。
MOV CL,4
SHL AX,CL
MOV BL,DL
SHR DX,CL
SHL BL,CL
OR AH,BL
11.给出下列各条指令执行后 AL以及 CF,OF,SF和 ZF的值。
XOR AL,AL
MOV AL,255
INC AL
NOT AL
SHL AL
CMP AL
SUB AL,7FH
SHL AL,1
12,写出与下列指令功能相同的指令序列。
( 1) CLD
REP MOVSB
( 2) CLD
RDP STOSD
( 3) CLD
REPE CMPSW
13.设 AX与 DX存放的均为4位十进制数对应的压缩
BCD码,给出下列代码的功能。
ADD AL,DL
DAA
XCHG AL,AH
ADC AL,DH
DAA
XCHG AL,AH
14.编写实现下列功能的指令序列。
( 1) AL的高4位与低4位分别放入 BH与 BL的低 4
位,并将 BH与 BL的高 4位清 0。
( 2) 将 CX,BX,AX中的 48位数加倍。其中,CX
与 AX分别作为最高 16位与最低 16位。
( 3) 设 AL的值为带符号数,若 AL的绝对值小于 10,
则置 CF=0,否则置 CF=1。
( 4) 若 AX和 BX中的数恰好一个是奇数、一个是偶数,则将奇数放入 AX,偶数放入 BX;否则,AX
和 BX不变。
( 5) 将 AX中的无符号数乘以 10存入 DX,AX(要求用移位、传送和加法指令实现)。
( 6) 设字节变量 X中存放着8位带符号数,计算
4X- 5+ X/ 2,将结果存入 AX中。
( 7) 求 1+ 2+ … + 100,结果放入 AX中。
INTEL公司生产的 8086/8088CPU的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功能和使用方法。
通过本章的学习,读者应该掌握以下内容:
3种操作数的寻址方式
常用指令的格式、功能、以及对标志位的影响
3,1 8086/8088的寻址方式操作码 操作数汇编指令:
操作码,指令操作类型;
操作数,指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。
例,MOV AX,CX ;将 CX的内容送入 AX中。
本章主要介绍 8086/8088的指令系统以及在指令中为取得操作数地址所使用的寻址方式。
3,1,1 立即寻址方式指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中 。 立即数有 8位和 16位。
例,MOV AL,5 ;源操作数为立即寻址指令执行后,AL=05H,8位数据 05H存入 AL寄存器。
例,MOV AX,3064H ;源操作数为立即寻址指令执行后,AX=3064H,16位数据 3064H存入 AX寄存器。
3,1,2 寄存器寻址方式寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括 8位或 16位通用寄存器和段寄存器。
可使用的 16位寄存器,AX,BX,CX,DX,SI,DI、
SP,BP;其中,AX,BX,CX,DX可分成两 8位使用。
例,MOV AX,CX ;( AX) ( CX)
MOV AL ;( AL) ( AL) -1
3,1,3 内存寻址方式在内存寻址方式中,操作数是某个内存单元的内容
(值),指令中给出的是内存单元的有效地址 EA(即偏移地址),段地址通常在隐含的某个段寄存器中。
1、直接寻址方式直接寻址方式的操作数的形式为,Variable或 [Variable]
在直接寻址方式中,操作数的偏移地址 (有效地址 EA)
直接用指令加以指定 (有直接地址值和标号两种形式 ),
它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。段地址隐含的由 DS 指定,也可以 ES指定,但需在指令中指明。最后存储器地址为,DS:偏移地址 或 ES:偏移地址。
例,MOV AX,ES:[2000H]
将 ES:2000H单元内容送入 AX。
例,MOV AX,LABLE 或 MOV AX,[LABEL]
将标号为 LABLE(存放操作数单元的符号地址 ),即
DS:LABLE中的内容送入 AX。
2、寄存器间接寻址寄存器间接寻址方式的操作数形式为,[reg]
操作数的有效地址包含在基址寄存器 BX,基址指针 BP
或一个变址寄存器( SI或 DI)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。
例,MOV AX,[BX];将由 BX决定的存储单元的内容送到 AX寄存器。
0000
0001
0002
0003
BB
AA
TAB:
AX
AH AL
AA BB
间接寻址数据段
0001BX
操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。
( BX)
( SI)
( DI)
( BP)
有效地址 = 段寄存器为 DS
段寄存器为 SS
物理地址计算方法:
物理地址 = ( DS) * 16 + ( BX)或( SI)或( DI)
物理地址 = ( SS) * 16 + ( BP)
例:已知:( DS) =2100H,( DI) =2000H
指令,MOV AX,[DI] ;( AX) (( DI))
物理地址 =( DS) * 16 + ( DI)
=2100H * 16 + 2000H
=21000H + 2000H
=23000H
指令结果:将 23000H单元内容送 AL中,
将 23001H单元内容送 AH中。
3、寄存器相对寻址方式操作数在存储器内,指令中寄存器内容与指令指定的位移量( DISP)之和作为操作数所在单元的有效地址。
( BX) DISP8
( SI)
( DI)
( BP) DISP16
有效地址 = 段寄存器为 DS
段寄存器为 SS
+
物理地址 = ( DS) * 16 +( BX) +DISP8
( SI)、( DI),DISP16类同。
物理地址 = ( SS) *16 + ( BP) +DISP16
例,如果 (DS)=3000H,(SI)= 2000H,COUNT=3000H,
则执行指令 MOV AX,CONUT[SI],求出此种寻址方式对应的有效地址和物理地址。
有效地址 = 2000H + 3000H = 5000H
物理地址 =( DS) *16 + 5000H
=30000H + 5000H =35000H
4、基址变址寻址方式:
操作数在存储器中,指令将基址寄存器( BX或 BP)
与变址寄存器( SI或 DI)内容之和作为操作数所在存储单元的有效地址。
( BX) ( SI)
( BP) ( DI)
有效地址 = +
物理地址 = ( DS) * 16 + ( BX) + ( SI)或( DI)
物理地址 = ( SS) * 16 + ( BP) + ( SI)或( DI)
例,MOV AX,[BX+DI] 或 MOV AX,[BX][DI]
DS:(BX)+(DI) 字存储单元内容送 AX。
例,MOV AX,[BP+SI] 或 MOV AX,[BP][SI]
SS:(BP)+(SI) 字存储单元内容送 AX。
例:如果 (DS)=2100H,(BX)= 0158H,(DI)=10A5H,EA=11FDH,
则执行指令 MOV AL,[BX][DI]
有效地址,EA=( BX) +( DI) =0158H+10A5H=11FDH
物理地址:( DS) * 16 + 有效地址 =21000H+11FDH=221FDH
执行结果:将 221FDH单元内容送入寄存器 AL中。
5、相对基址变址寻址方式操作数在存储器内,指令将基址寄存器( BX或 BP)与变址寄存器( SI或 DI)的内容之和再加上位移量( 8位或 16位),得到操作数所在单元的有效地址。
( BX) ( SI) DISP8
( BP) ( DI) DISP16有效地址 = + +
物理地址 = ( DS) * 16 +( BX)产生的有效地址物理地址 = ( SS) * 16 +( BP)产生的有效地址例:已知:( DS) =3000H,( BX) =2000H,( SI) =1000H,
MK=0250H
指令,MOV AX,MK[BX][SI]
或 MOV AX,MK[BX+SI]
或 MOV AX,[MK+BX+SI]
有效地址,MK+( BX) +( SI) =0250H+2000H+0100H
=3250H
物理地址:( DS) *16 +有效地址 =30000H+3250H=33250H
执行结果:将 33250H单元内容送 AL,33251H内容送 AH。
3,1,4 段超越当操作数在内存单元时,系统根据隐含约定,自动将寄存器 DS或 SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。
段超越前缀形式为:
段寄存器名:
例如:
MOV AX,ES,[BP] ;段地址在 ES
MOV AX,CS,[BX] [SI] ;段地址在 CS
段地址的基本约定和允许超越的情况如表所示:
存储器存取方式 约定段 允许超越段 偏移地址取指令堆栈操作源串目的串
BP作基址通用数据读写
CS
SS
DS
ES
SS
DS
无无
CS,ES,SS
无
CS,DS,ES
CS,ES,SS
IP
SP
SI
DI
有效地址 EA
有效地址 EA
3,1,5 对 8086内存寻址方式的注解
( 1)在汇编后,指令中的变量名有具体的偏移地址所取代。
( 2)在寄存器相对寻址与相对基址变址方式中,位移量 disp可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。
( 3)在 Microsoft宏汇编 MASM( Microsoft Macro
Assembler)中,内存操作数可以采用多种书写形式。
( 4)操作数中使用变量的地方也可以用下列形式:
变量名 ± 整数表达式。
5)计算出的有效地址以 16位表示,若超过 0FFFFH,
CPU将忽略所有溢出。
( 6)记忆 8086内存操作数形式的简易方法如下:
[BX] [SI]
disp
[BP] [DI]
每列选择 0项或一项,构成至少一项,即可得到有效的内存操作数形式。
3,2 标志位在标志寄存器 FLAGS中有若干标志位,这些标志用来表示 CPU当前的操作方式和状态信息。
与普通应用程序有关的主要是 FLAGS中的 9个标志
6个状态标志( CF,OF,SF,ZF,AF,PF)
3个控制信息标志( DF,IF,TF)
3,2,1 深入认识 CF和 OF
1,深入认识 CF和 OF
CF表示无符号溢出,即运算结果超出了无符号数的表示范围。
OF表示带符号溢出,即运算结果超出了带符号数的表示范围。
2,CF和 OF判断方法
( 1)加法
① CF的判断方法从十进制角度来看,若无符号加的结果大于 2n-1
( n为位数),则 CF=1,否则 CF=0。
从二进制角度来看,若结果最高位向前有进位,则
CF=1,否则 CF=0。
② OF的判断方法从十进制角度来看,若带符号加的结果不在范围-
2 n - 1~2 n-1- 1( n为位数)内,则 OF=1,否则
OF=0。
从二进制角度来看,若两个数同号,而相加结果与之异号,说明溢出,则 OF=1,否则 OF=0。
例,8位数加法,判断 CF和 OF
二进制加法 看作无符号数 看作带符号数
① 0011 0000B 6 6
+ 0000 1001B + 9 + 9
0011 1001B 15 15
CF=0 OF=0
② 0000 0111B 7 +7
+ 1111 1011B +251 + (- 5)
0000 0010B 258 +2
1 CF=1 OF=0
现为 2结果错
③ 0000 1001B 9 +9
+ 0111 1100B + 124 +( +124)
1000 0101B 133 +133
CF=0 OF=1
现为- 123,结果错
④ 1000 0111B 135 (- 121)
+ 1111 0101B + 245 + (- 11)
0111 1100B 380 - 132
1 CF=1 OF=1
现为 124,结果错 现为 124,结果错
( 2)减法
① CF的判断方法从十进制角度来看,若无符号减数大于被减数,则
CF=1,否则 CF=0。
从二进制角度来看,若结果最高位向前有借位,则
CF=1,否则 CF=0。
② OF的判断方法从十进制角度来看,若带符号减的结果不在范围 -
2 n-1~2 n-1- 1( n为位数)内,则 OF=1,否则
OF=0。
从二进制角度来看,若两个数异号,而结果与被减数符号相反,说明溢出,则 OF=1,否则 OF=0。
3,3 指令系统
8086/8088的指令系统可以分为 6组:
( 1)数据传送指令;
( 2)算术运算指令;
( 3)逻辑指令与移位指令;
( 4)串操作指令;
( 5)控制转移指令;
( 6)处理机控制指令;
3,3,1 数据传送指令数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中 。
1,MOV( Move):传送指令
MOV指令的格式为:
MOV dest,src ; dest←src
功能:将源操作数 src复制到目的操作数 dest中,结果目的操作数的内容等于源操作数的内容,源操作数 src的内容不变。
对标志位的影响:无语法格式:
MOV reg/mem/seg,reg/mem/seg/imm
说明:
( 1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。
MOV seg,seg ;错误
MOV mem,mem ;错误
( 2)立即数不能传送到段寄存器中。
MOV seg,imm ; 错误
( 3)目的操作数不允许使用 CS段寄存器。
( 4) dest与 src必须类型匹配,即同时是字节或字类型。
以下几点要注意:寄存器具有明确的类型,例如,AL、
AX分别为字节、字类型。若立即数没有明确的类型,
MASM负责将立即数扩展为与目的操作数位数相同。
有时 MASM不能确定内存操作数的类型,需要用
byteptr和 wordptr明确指出是字节或字类型。关于 PTR
的详细介绍见第 4章。只要其中一个操作数的类型确定即可。
例:错误的 MOV 指令如下所示:
MOV AX,BL ;类型不匹配
MOV DS,1000H ;不允许立即数送段寄存器
MOV [BX],[SI] ;不允许内存操作数之间传送
MOV ES,CS ;不允许段寄存器之间传送
MOV CS,AX ; CS不能作为目的操作数例:设 B是已定义的字节变量,以下是一些错误和正确的指令。
MOV AX,B ;错误,类型不匹配
MOV A,0 ;正确,MASM可以判断出要送字节 0
2,XCHG( Exchange):交换指令
XCHG指令的格式为:
XCHG oprd1,oprd2 ;交换 oprd1与 oprd2的内容语法格式为:
XCHG reg/mem,reg/mem
例,XCHG BX,[BP+SI]
如指令执行前:( BX) =6F30H,( BP) =0200H,( SI)
=0046H,( SS) =2F00H,( 2F00H) =4254H,OPR2
的物理地址 =2F00+0200+0046=2F246
则指令执行后:( BX) =5154H,( 2F246H) =6F30H。
3、堆栈操作指令堆栈概念 ------ 存储器的一段区域,按“先进后出”
的原则进行存出操作。 8086/8088系统,堆栈位于堆栈段,其段地址由 SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元。
作用,在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。
指令格式:进栈 PUSH SRC ;
操作:( SP) ( SP) -2,(( SP) +1,( SP)) ( SRC)
出栈 POP DST ;
操作:( DST) (( SP) +1,( SP)),( SP) ( SP) +2
堆栈
SS,01F8
SS,01FA
SS,01FC
SS,01FESP
AA BB
(执行 PUSH AX之前)
堆栈
SS,01F8
SS,01FA
SS,01FC
SS,01FE
SP
AA BB
(执行 PUSH AX之后)
1101H 1101H
AX
堆栈
SS,01F8
SS,01FA
SS,01FC
SS,01FESP
AA BB (执行 POP AX之后)
1101H
AX
1 2
3
8086/8088系统的堆栈具有如下特点:
·堆栈是在内存的堆栈段中,具有“先进后出”的特点;
·堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元;
·堆栈有两个基本操作,PUSH(进栈)和 POP(出栈)。
PUSH操作使栈顶向低地址方向移动,而 POP操作则刚好相反;
·堆栈操作只能作字操作;
·SS,SP在任何时候都指向当前的栈顶。
4、地址传送指令将操作数所在存储器的地址送入目标寄存器。
指令格式:
有效地址送寄存器,LEA reg16,mem ; reg16 mem
指针送寄存器和 DS,LDS reg16,mem32 ;
把源操作数指定的 4个相继字节到由指令指定的寄存器及 DS寄存器中。该指令常指定 SI寄存器。
指针送寄存器和 ES,LES reg16,mem32 ;
把源操作数指定的 4个相继字节送到由指令指定的寄存器及 ES寄存器中。该指令常指定 DI寄存器 。
LEA 指令与 MOV 指令的区别:
LEA SI,BUFF指令是将标号 BUFF的偏移地址送入寄存器中;
MOV SI,BUFF指令是将标号 BUFF所指存储单元的内容送入 SI。
BUFF =
0
1
2
3
4
5
48
00
FE
FF
LEA SI,BUFF;
执行后:( SI) =0002H
MOV SI,BUFF;
执行后:( SI) =0048H
段起始地址
B,LDS或 LES指令将源操作数指定的 4个连续字节单元内容分别送入指令指定的寄存器以及 DS或 ES中。
其中:低 16位送到一个指定的字寄存器,高 16位送到
DS或 ES中。
57H
13H
68H
24H
例:( DS) =C000H,( C2480H) =1357H,( C2482H) =2468H
DS,2480H
DS,2481H
DS,2482H
DS,2483H
13 57
24 68
SI
DS
LDS SI,[2480]
4、标志寄存器传送指令指令格式:
LAHF ; ( AH) ( PSW低字节)
SAHF ; ( PSW低字节) AH
PUSHF; ( SP) ( SP) -2,(( SP) +1,( SP)) ( PSW)
POPF ; ( PSW)(( SP) +1,( SP))( SP)( SP) +2
说明,LAHF/SAHF指令是寄存器 AH与标志寄存器 PSW的低字节之间完成的字节型数据传送。
PUSHF/POPF指令是标志寄存器 PSW与堆栈间进行的字型数据传送。
指令 SAHF/POPF将影响标志位。
4,2,2 算术运算指令
1、加法指令指令格式:
加法 ADD DST,SRC;( DST) ( SRC) +( DST)
带进位加法 ADC DST,SRC;
( DST) ( SRC) +( DST) +CF
加 1 INC OPR ;( OPR) ( OPR) +1
说明:这在三条指令运算结果将影响状态标志位,但是 INC指令不影响标志 CF。
2、减法指令指令格式:
减法 SUB DST,SRC ;( DST) ( DST) - ( SRC)
带进位减法 SBB DST,SRC;( DST)( DST) -( SRC) -CF
减 1 DEC OPR ;( OPR) ( OPR) -1
求补 NEG OPR ;( OPR) 0FFFFH-( OPR) +1
比较 CMP OPR1,OPR2;( OPR1) -( OPR2)
以上五条指令均可作字或字节运算,而且除 DEC不影响 CF外,其他都按一般规则影响状态标志位 。
3、乘法指令指令格式:
无符号数乘法 MUL SRC ;( AX)( AL) *( SRC)字节乘法;( DX,AX)( AX) *( SRC)字乘法带符号数乘法 IMUL SRC;操作同上进行字节运算时,目的操作数必须是累加器 AL,乘积在寄存器
AX中;进行字运算时,目的操作数必须是累加器 AX,乘积在寄存器 DX,AX中。 源操作数不允许使用立即数。
乘法指令运算结果只影响状态标志 CF,OF。
例,MUL BX ;无符号数乘法,BX乘上 AX
4、除法指令指令格式:
无符号数除法 DIV SRC ;( AL) ( AX) /( SRC)除法的商
( AH) ( AX) /( SRC)除法余数或者 ( AX)( DX,AX) /( SRC)除法的商
( DX)( DX,AX) /( SRC)除法余数带符号数除法 IDIV SRC ;操作同上。
当除数是字节数据时,被除数必须放在 AX中;当除数是字数据时,被除数必须放在 DX,AX中。
除法指令运算结果对状态标志无定义。
8086/8088规定 IDIV指令运算结果余数的符号与被除数相同。
带符号数除法运算中,当被除数位数不够时,可进行扩展。
符号扩展指令:
字节扩展到字 CBW;将寄存器 AL中的符号位扩展到寄存器 AH
字扩展到双字 CWD;将寄存器 AX中的符号位扩展到寄存器 DX
7 0AL7 0AH
015 AXDX15 0
CBW
CWD
5、压缩 BCD码十进制调整指令加法十进制调整 DAA;
执行的操作:这条指令执行前必须先执行 ADD或 ADC
指令,加法指令必须把两个压缩的 BCD码相加,并把结果存放在 AL寄存器中。
减法十进制调整 DAS;
执行的操作:这条指令执行之前,必须先执行 SUB或
SBB指令,减法指令必须把两个 BCD码相减,并把结果存放在 AL寄存器中。
调整的方法:
累加器 AL低 4位大于 9或辅助进位标志位 AF=1,则累加器 AL加
06H修正。
累加器 AL高 4位大于 9或辅助进位标志位 AF=1,则累加器 AL加
60H修正。
累加器 AL高 4位大于等于 9,低 4位大于 9,则累加器 AL进行加
66H修正。
例:进行 BCD码加法运算 59+68=127
0101 1001 59
+ 0110 1000 68
1100 0001 C1
+ 0110 0110 66
10010 0111 127
加法运算结果为 C1,
AF=1,高位大于 9
加 66H进行压缩
BCD调整说明:
压缩 BCD码加法或减法十进制调整指令必须在 ADD( ADC)
或 SUB( SBB)指令之后,调整结果对标志 OF无影响,对其它状态标志位均有影响。
减法十进制调整方法与加法十进制调整方法类同,只是将加 6
变为减 6操作。
6、非压缩 BCD码十进制调整指令指令格式:
加法十进制调整 AAA ;
减法十进制调整 AAS ;
乘法十进制调整 AAM ;
除法十进制调整 AAD ;
AAA指令将 AL的内容变换成一位非压缩的十进制数。 AAA检查 AL低四位,如低四位是 0--9的数字,AAA就清除 AL的高四位,以及 AF和 CF标志;如 AL低四位表示的数大于 9或 AF=1,
AAA执行:
加 6到 AL寄存器;
加 1到 AH寄存器;
置 AF=1,CF=1;
清除 AL高四位为 0。
例,ADD AL,BL; AL和 BL中的数相加
AAA ;非压缩 BCD码调整
AAS指令检查 AL低四位,如低四位表示的数是 0-9的数字,
ASS清除 AL高四位及 CF和 AF标志;如 AL低四位表示的数大于
9或 AF=1,AAS进行如下调整:
AL减去 6;
AH减去 1;
置 AF=1,CF=1;
清除 AL中高四位。
例,SUB AL,BL;
AAS
AAM指令的作用是用 10( 0AH)来除 AL寄存器的内容,并将除得的商和余数分别送到 AH和 AL来实现转换。
例,MUL BL ; AL * BL
AAM
3,3,3 逻辑指令与移位指令
1、逻辑运算指令:对字节或字数据进行按位的操作。
格式:
逻辑与 AND DST,SRC; ( DST)( DST) AND( SRC)
逻辑或 OR DST,SRC; ( DST)( DST) OR( SRC)
逻辑非 NOT OPR ; ( OPR)( OPR)
异或 XOR DST,SRC; ( DST)( DST) XOR( SRC)
测试 TEST OPR1,OPR2;( OPR1) AND( OPR2)
( 1)、逻辑与( AND)、或( OR)、异或( XOR)操作指令
AND指令主要用来屏蔽掉一个数中某些位,以便对剩下的其它位进行某些处理。对那此两个操作数都是 1的位,目的操作数相对应位就是 1,其它各种组合的位,目的操作数相应位都是 0。
例,AND AX,BX ;两个寄存器逻辑与
AND AL,MEM-BYTE;寄存器和存储单元逻辑与
AND MEM-BYTE,AL;存储单元和寄存器逻辑与
OR指令在两个操作数相对应位中有一个是 1或两个都是 1时,
在目的操作数的该位产生一个 1。
例,OR BX,0C000B
将 BX的两位最高的有效位( 15和 14位)置成 1,而其它位不变。
XOR指令主要用于判断两个操作数中那些位是不同的。如两个操作数相对应位的值不同时,在目的操作数产生一个 1。相同为 0,不同为 1。
例,XOR BX,0C000B;
NOT指令改变寄存器或存储单元的每一位状态,原来为 0变为
1,原为 1变为 0。
例,NOT AX ; AX各位取反
TEST指令是一条测试指令,它执行的操作与 AND相同,不过它不送回结果,只影响标志位。
例,TEST AL,0000 0001B;如 AL最低位为 0,则 ZF=1。
2、移位指令逻辑左移 SHL OPR,CNL
算术左移 SAL OPR,CNL
逻辑右移 SHR OPR,CNL
算术右移 SAR OPR,CNT
其中,OPR为操作数,CNT为 1或 CL表示移位次数
0
CF OPR
0
CFOPR
CFOPR
例:设 AL=1011 0100,CF=1
在 SAL AL,1之后,AL= 0110 1000 CF=1
在 SAR AL,1之后,AL=1101 1010 CF=0
在 SHL AL,1之后,AL=0110 1000 CF=1
在 SHR AL,1之后,AL=0101 1010 CF=0
算术左移( SAL)和算术右移( SAR)实现带符号数移位。
SAR通过在整个移位过程中复制符号来保护操作数的符号。
SAL不保护进位,但如果符号位发生变化的话,就将 1送 OF标志。每次移位,SAL都将操作数空出来的第 0位置 0。
逻辑左移( SHL)和逻辑右移( SHR)对无符号数的移位。
SHL将操作数左移,空出来的第 0位置 0;
SHR将操作数右移,空出来的高位(字节时第 7位,字时第 15
位)置 0。
例:将两个非压缩 BCD码(高位在 BL,低位在 AL)合并成压缩 BCD码送 AL。
MOV CL,4 ;将计数值送 CL
SHL BL,CL ;将高位移到 BL的高 4位
AND AL,0FH;清零 AL高 4位
OR AL,BL ;合并 AL和 BL形成压缩 BCD码。
( 2)、循环移位指令循环左移 ROL OPR,CNT
循环右移 ROR OPR,CNT
带进位循环左移 RCL OPR,CNT
带进位循环右移 RCR OPR,CNT
CF OPR
CFOPR
CF OPR
CFOPR
例:设 AL=1011 0100B,CF=1执行下列语句:
执行 ROL AL,1 后,AL=0110 1001,CF=1
执行 ROR AL,1后,AL=0101 1010,CF=0
执行 RCL AL,1后,AL=0110 1001,CF=1
执行 RCR AL,1后,AL=1101 1010,CF=0
3,2,4 串操作指令串操作:对存储区中连续存放的字节或一串字进行操作。
1.与 REP前缀相配合工作的指令 MOVS,LODS、和
STOS指令
( 1) REP重复串操作直到( CX) =0为止。
格式,REP STRING PRIMITIVE
其中 STRING PRIMITIVE可为 MOVS,LODS或 STOS
指令。
① 如( CX) =0则退出 REP,否则继续执行;②( CX)
← ( CX)- 1;③ 执行其后的串指令;④ 重复① ~③ 。
( 2) MOVS串传送指令格式:① MOVS DST,SRC ;② MOVSB(字节);
③ MOVSW(字)
( 3) STOS存入串指令
STOS指令的格式为:① STOS DST ; ② STOSB(字节);③ STOSW(字)。
执行的操作:字节操作:(( DI)) ← ( AL),( DI)
← ( DI) ± 1
字操作,(( DI)) ← ( AX),( DI) ← ( DI) ± 2
( 4) LODS 从串中取指令
LODS指令的格式为:① LODS SRC ; ② LODSB(字节);③ LODSW(字)。
执行的操作:字节操作:(( AL)) ← ( SI),( SI)
← ( SI) ± 1
字操作,(( AX)) ← ( SI),( SI) ← ( SI) ± 2
2,与 REPE/REPZ和 REPNE/REPNZ联合工作的 CMPS和
SCAS指令
( 1) REPE/REPZ当相等 /为零时重复串操作
REPE/REPZ指令的格式为,REPE/REPZ string
primitive
其中 string primitive可为 CMPS或 SCAS指令。
执行的操作:①如( CX) =0或 ZF=0(即某次比较的结果两个操作数不等)时退出,否则继续执行;②
( CX) ← ( CX)- 1;③执行其后的串指令;④重复
①~③。
( 2) REPNE/REPNZ当不相等 /不为零重复串操作
REPNE/REPNZ指令的格式为,REPNE/REPNZ
string primitive
其中 string primitive可为 CMPS或 SCAS指令。
执行的操作:除退出条件为( CX) =0或 ZF=1外,其他操作与 REPE指令完全相同。
( 3)、串比较指令
CMPSB ;(( SI)) -(( DI))
( SI)( SI) ± 1,( DI)( DI) ± 1
CMPSW ;(( SI)) -(( DI))
( SI)( SI) ± 2,( DI)( DI) ± 2
( 4) SCAS串扫描指令
SCAS指令的格式为:① SCAS DST; ② SCASB(字节);③ SCASW(字)。
执行的操作:字节操作:(( AL)) ← ( DI),
( DI) ← ( DI) ± 1
字操作,(( AX)) ← ( DI),( DI) ← ( DI)
± 2
3,2,5 控制转移指令控制转移指令分成 无条件转移指令 和 条件转移指令 。
1,无条件转移指令转移可以分成两类,段内转移 和 段间转移 。
段内转移 是指在同一段的范围之内进行转移,此时只需改变 IP寄存器的内容,即用新的转移目标地址代替原有的 IP的值就可达到转移的目的。
段间转移 则是要转到另一个段去执行程序,此时不仅要修改 IP寄存器的内容,还需要修改 CS寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成 。
( 1)直接短转移 JMP SHORT OPR ;
操作:( IP) ( IP) +8位位移量
( 2)段内直接转移 JMP NEAR PTR OPR;
操作:( IP) ( IP) +16位位移量
( 3)段内间接转移 JMP WORD PTR OPR;
操作:( IP) (有效地址)
( 4)段间直接(远)转移 JMP NEAR PTR OPR
操作:( IP) ← OPR的段内偏移地址
( CS) ← OPR所在段的段地址
( 5)段间间接转移 JMP DWORD PTR OPR
操作:( IP) ← ( EA)
( CS) ← ( EA+2)
2、条件转移指令状态标志作为转移的条件,当满足一定的条件时,转移到指定的地址,否则,将顺序执行下条指令。
作为判断条件的状态标志位有,CF,PF,ZF,SF和 OF。
(1) 根据单个标志位的设置情况转移这组包括 10种指令,它们一般适用于测试某一次运算的结果并根据其不同特征产生程序分支作不同处理的情况 。
结果为零 ( 或相等 ) 转移 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
奇偶位为 1转移 JP/PE OPR ; PF=1
奇偶位为 0转移 JNP/JPO OPR; PF=0
低于 /不高于或等于 /进位为 1转移 JB/JNAE/JC OPR; CF=1
不低于 /高于或等于 /进位为 0转移 JNB/JAE/JNC OPR; CF=0
( 2)比较两个无符号数,并根据比较的结果转移。
低于 /不高于或不等于 /进位为 1转移
JB/JNAE/JC OPR; CF=1且 ZF=0
不低于 /高于或等于 /进位为 0转移
JNB/JAE/JNC OPR; CF=0或 ZF=1
低于或等于 /不高于转移 JBE/JNA OPR;
CF=1或 CF=1
不低于或不等于 /高于转移 JNBE/JA OPR;
CF=0且 ZF=0
( 3)比较两个带符号数,并根据比较结果转移。
小于或者不大于或者等于转移 JL(或 JNGE) OPR
SF⊕ ZF=1
小于或者不大于或者等于转移 JNL(或 JGE) OPR
SF⊕ ZF=0
小于或等于,或者不大于转移 JLE(或 JNG) OPR
( SF⊕ ZF) ∨ ZF=1
小于或等于,或者不大于转移 JNLE(或 JG) OPR
( SF⊕ ZF) ∨ ZF=0
( 4)测试 CX的值为 0则转移指令
JCXZ OPR; ( CX) =0则转移
3、循环控制指令
( 1) LOOP( LOOP)循环指令格式,LOOP OPR
测试条件:( CX) ≠0
( 2) LOOPZ/LOOPE( Loop while zero or equal)
当为零或相等时循环指令格式,LOOPZ(或 LOOPE) OPR
测试条件,ZF=1且( CX) ≠0
( 3) LOOPNZ/LOOPNE( Loop while nonzero,or
not equal)当不为零或不相等时循环指令格式,LOOPNZ(或 LOOPNE) OPR
测试条件,ZF=0且( CX) ≠0
4、子程序
CALL调用指令
( 1)段内直接调用格式,CALL DST
执行的操作:( IP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( IP);
( IP) ← ( IP)+ D16;
(2)段内间接调用格式,CALL DST
执行的操作:( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← (IP);
( IP) ← ( EA)
(3)段间直接调用格式,CALL DST
执行的操作:( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( CS);
( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( IP);
( IP) ← 偏移地址(指令的第 2,3个字节);
( CS) ← 段地址(指令的第 4,5个字节)。
( 4)段间间接调用格式,CALL DST
执行的操作:( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( CS);
( SP) ← ( SP)- 2;
(( SP)+ 1,( SP)) ← ( IP);
( IP) ← ( EA);
( CS) ← ( EA+ 2)
RET返回指令段内返回 RET ;( IP) (( SP) +1,( SP))
( SP)( SP) +2
段内带立即数返回 RET EXP;
( IP)(( SP)) +1,( SP))
( SP)( SP) +2
( SP)( SP) +DISP16位移量段间返回 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) +2
( SP)( SP) +DISP16位移量
3,2,6 处理机控制指令
1.标志处理指令
( 1) CLC进位位置 0指令 (Clear carry) CF ←0
( 2) CMC进位位求反指令( Complement carry)
CF←CF
( 3) STC进位位置 1指令( Set carry) CF←1
( 4) CLD方向标志置 0指令 (Clear direction) DF←0
( 5) STD方向标志位置 1指令 (Set direction) DF←1
( 6) CLI中断标志置 0(关中断)指令( Clear
interrupt) IF←0
( 7) STI中断标志置 1(开中断)指令 (Set interrupt)
IF←1
2,其它处理机控制指令
( 1) NOP 空操作指令
NOP指令的语法格式为,NOP
( 2) HLT 停机指令
HLT指令的语法格式为,HLT
( 3) WAIT 等待指令
WAIT指令的语法格式为,WAIT
( 4) ESC 换码指令
ESC指令的语法格式为,ESC mem
( 5) LOCK 封锁前缀指令
LOCK指令的语法格式为,LOCK
习 题
1.判断下列指令是否正确。若不正确,指出错误原因。
( 1) MOV SP,DL ( 2) POP CS
( 3) MOV [BP][SI],[DI( 4) MOV [SP],[BP]
( 5) JLE BX ( 6) MOV ES,1000H
( 7) MOV AX,BX+2 ( 8) MOV ES,CS
( 9) AND AX,[CX] ( 10) SHR BL
2.说明指令 DEC AX与 SUB AX,1的区别。
3.IP寄存器能作为指令的操作数吗?哪类指令的执行会改变 IP的值?
4.在无符号数和带符号数比较两种情况下,分别给出下列条件成立时相关标志位的值。
( 1)相等 ( 2)不相等
( 3)小于
( 4)小于或等于 ( 5)大于
( 6)大于或等
5,说明 CALL和 RET指令要执行的操作。
6,如果过程的第一条指令是 POP AX,那么 AX的值将是什么?
7,在哪两种情况下,执行 DIV或 IDIV指令将出错?
8,给出与下列每组指令序列功能相同的一条指令。
( 1) MOV AH,AL
SAR AH,7
( 2) MOV DX,AX
SAR DX,15
( 3) TEST AX,1
JZ ISZERO
STC
JMP DONE
ISZERO,CLC
DONE
9,写出实现下列功能的指令序列。
( 1)将 AL与 BX中的两个无符号数相加,结果放入 AX。
( 2)将 AL与 BX中的两个带符号数相加,结果放入 AX。
10.分析下列指令序列完成什么功能。
MOV CL,4
SHL AX,CL
MOV BL,DL
SHR DX,CL
SHL BL,CL
OR AH,BL
11.给出下列各条指令执行后 AL以及 CF,OF,SF和 ZF的值。
XOR AL,AL
MOV AL,255
INC AL
NOT AL
SHL AL
CMP AL
SUB AL,7FH
SHL AL,1
12,写出与下列指令功能相同的指令序列。
( 1) CLD
REP MOVSB
( 2) CLD
RDP STOSD
( 3) CLD
REPE CMPSW
13.设 AX与 DX存放的均为4位十进制数对应的压缩
BCD码,给出下列代码的功能。
ADD AL,DL
DAA
XCHG AL,AH
ADC AL,DH
DAA
XCHG AL,AH
14.编写实现下列功能的指令序列。
( 1) AL的高4位与低4位分别放入 BH与 BL的低 4
位,并将 BH与 BL的高 4位清 0。
( 2) 将 CX,BX,AX中的 48位数加倍。其中,CX
与 AX分别作为最高 16位与最低 16位。
( 3) 设 AL的值为带符号数,若 AL的绝对值小于 10,
则置 CF=0,否则置 CF=1。
( 4) 若 AX和 BX中的数恰好一个是奇数、一个是偶数,则将奇数放入 AX,偶数放入 BX;否则,AX
和 BX不变。
( 5) 将 AX中的无符号数乘以 10存入 DX,AX(要求用移位、传送和加法指令实现)。
( 6) 设字节变量 X中存放着8位带符号数,计算
4X- 5+ X/ 2,将结果存入 AX中。
( 7) 求 1+ 2+ … + 100,结果放入 AX中。