微机原理课件第03章_第1页
微机原理课件第03章_第2页
微机原理课件第03章_第3页
微机原理课件第03章_第4页
微机原理课件第03章_第5页
已阅读5页,还剩455页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机原理与接口技术李宝平计算机学院通信工程系libaoping@微机原理与接口技术李宝平主要内容:指令系统的一般概念操作数的寻址方式六大类指令的操作原理

操作码的含义指令对操作数的要求指令执行的结果主要内容:指令系统的一般概念3.1概述指令——控制计算机完成指定操作的命令机器指令——指令的二进制代码形式。例如:CD21H汇编指令——助记符形式的指令。例如:INT21H指令系统——CPU所有指令及其使用规则的集合8088/8086指令系统:(1)指令向后兼容(x86系列)(2)应用广泛,资料易于寻找3.1概述指令——控制计算机完成指定操作的命令808指令按功能分为六大类(92种)参见附录18086/8088指令系统P458(1)数据传送类;(2)算术运算类;(3)逻辑运算和移位;(4)串操作;(5)控制转移类;(6)处理器控制。指令按功能分为六大类(92种)参见附录18086/83.1.1指令的基本构成操作码[操作数],[操作数]说明要执行的是什么操作操作对象,可以有0个、1个或2个目的源标号:3.1.1指令的基本构成操作码[操作数],[操作数]指令举例:ADDAX,[SI+6]MOVAX,BX操作码操作数INC[BX]HLT指令举例:ADDAX,[SI+6]MOVAX部分8088/8086常用指令指令类型助记符数据传送数据传送MOV,PUSH/POP,XCHG等地址传送LEA,LDS,LES输入输出IN,OUT算术运算加法ADD,ADC,INC减法SUB,SBB,DEC,NEG,CMP乘/除法MUL,IMUL,DIV,IDIV逻辑AND,OR,NOT,XOR,TEST移位SHL/SHR/SAR,ROL/ROR,RCL/RCR串操作MOVS,CMPS,SCAS,LODS,STOS控制转移JMP,JXX,LOOP,CALL/RET,INT/IRET部分8088/8086常用指令指令类型助记符数数据传送MOV8088/8086的操作数分为4类1、立即数(常数)源操作数就是参加操作的数据本身,它们可以是8位或16位。取值范围如下表:立即数只能用作源操作数,如8位16位无符号数00H-FFH(0-255)0000H-FFFFH(0-65535)带符号数80H-7FH(-128~127)8000H-7FFFH(-32768~32767)MOV AX,0FA00H ;正确MOV 8000H,DX ;错误操作数数据(立即数)地址:寄存器(名称)、存储器单元(地址)I/O接口的端口(地址)8088/8086的操作数分为4类1、立即数(常数)源操作数2、寄存器操作数放在8个通用寄存器或4个段寄存器中的操作数表示参加运算的数存放在指令给出的寄存器中,可以是16位或8位。2、寄存器操作数放在8个通用寄存器或4个段寄存器中的操作数表只能存放字操作数段寄存器存放当前操作数的段基地址可作为源或目的操作数(但CS不作为目的操作数),

不允许将立即数传送到段寄存器,可通过某个通用寄存器传递改变SIDIBPSPCSDSESSS只能存放字操作数段寄存器存放当前操作数的段基地址可作为源或目3、存储器操作数存储器操作数字节字双字124类型存储单元个数一般不允许两个操作数同时为存储器操作数Flags标志寄存器:仅有个别指令可用它作为操作数IP不能用指令指针寄存器:它作为操作数,顺序执行时它自动加1,跳转执行时自动会跳转表示当前参加运算的数存放在存储器的某1/2/4个单元中3、存储器操作数存储器操作数字节1类型存储单元个数一般不允许存储单元的物理地址=段基地址×16+偏移地址若指令中没有指明所涉及的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段。表3.3段寄存器使用的一些基本约定8086规定了访问存储器段的规则:此规则定义了段地址寄存器和偏移地址寄存器的组合方式,其默认规则如下表:默认段地址偏移地址用于访问CSIP指令SSSP、BP堆栈中的数据DS(可超越)BX、DI、SI、8位或16位数数据段中的数据ES串指令的DI目标串操作数存储单元的物理地址=段基地址×16+偏移地址若指令中

存储器操作数的偏移地址(也称有效地址EA)要用“[EA]”方括号括起来,它可以通过不同的寻址方式由指令给出;

存储器操作数的段基地址(也称段头地址)一般省去,按隐含规则确定它们,也可直接给出进行段超越。例如若(BX)=2000H,(SI)=0A00H,(DI)=2A00H,则以下指令的结果是一样的: MOVAL,[2A00H];隐含段头为DS,直接寻址 MOVAL,[BX+0A00H];隐含段头为DS,寄存器相对寻址 MOVAL,[BX][SI];隐含段头为DS,基址-变址寻址 MOVAL,[DI];隐含段头为DS,寄存器间接寻址但MOVAL,ES:[2A00H];段超越,段头为ES,与前4条不同存储单元的物理地址=段基地址×16+偏移地址注意:存储器数据表示形式:[]地址值或寄存器存储器操作数的偏移地址(也称有效地址EA)要用4、I/O接口操作数I/O接口操作数字节字12类型存储单元个数一般不允许两个操作数同时为I/O接口操作数I/O接口地址为16位,一般采用DX寄存器间接寻址给出;有时I/O接口地址仅用8位,这时可采用直接寻址。例如:INAL,[DX];括号习惯都省去写为INAL,DXOUT[80H],AL;括号习惯都省去写为OUT80H,AL注意:不要理解为:MOVAL,DX和MOV80H,AL,它们完全不同。表示当前参加运算的数存放在I/O接口的某1/2个端口中4、I/O接口操作数I/O接口操作数字节1类型存储单元个数一一条指令的执行时间=∑3.1.2指令的执行时间取指令取操作数执行指令传送结果单位用时钟周期数T表示常用指令执行时间P458计算偏移地址EA所需时间结论:1)尽量使用寄存器作为操作数2)若有可能,用移位代替乘除法3)尽量使用简单的寻址方式执行一条指令的执行时间=∑3.1.2指令的执行时间取指令单寻址方式——寻找操作数的方法

寻找操作数的地址(一般指源操作数)

寻找要执行的下一条指令的地址在8086指令系统中,操作数所在地址的寻址方式可分为8种:

①立即寻址⑤寄存器相对寻址

②直接寻址⑥基址-变址寻址

③寄存器寻址⑦相对的基址-变址寻址

④寄存器间接寻址⑧隐含寻址3.2

8086的寻址方式寻址方式——寻找操作数的方法3.28086的寻址方式

操作数(为一常数)直接由指令给出

(此操作数称为立即数)立即寻址只能用于源操作数例:

MOVAX,1C8FHMOVBYTEPTR[2A00H],8FH

错误例:

×

MOV2A00H,AX;错误!

3.1.2立即寻址操作数(为一常数)直接由指令给出3.1.2立即寻址立即数操作码低8位高8位存储器MOV操作码02H31HAHAL代码段代码段立即寻址指令在存储器中的存放形式AX指令操作例:MOVAX,3102H;AX3102H执行后,(AH)=31H,(AL)=02H用途:直接给出操作数据,立即数存放在内存的代码段中立即数操作码低8位高8位存储器MOV操作码02H31HAHA3.2.3寄存器寻址

操作数放在某个寄存器中源操作数与目的操作数字长要相同寄存器寻址与段地址无关例:MOVAX,BXMOV[3F00H],AXMOVCL,AL错误例:

×

MOVAX,BL;字长不同

×MOVES:AX,DX;寄存器与段无关3.2.3寄存器寻址操作数放在某个寄存器中AXSI2233H2233H指令操作例:MOVSI,AX;SI(AX)

指令执行前:(AX)=2233H指令执行后:(AX)=2233H,(SI)=2233H用途:操作数存放在寄存器中,根据寄存器名称寻找寄存器里面的数据。AXSI2233H2233H指令操作例:MOVSI,AX3.2.2直接寻址

指令中直接给出存储器操作数的16位偏移地址

或I/O接口仅8位端口地址存储器偏移地址也称为有效地址(EA,EffectiveAddress)存储器默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀存储器偏移地址也可用符号地址来表示,如ADDR、VAR

例:

MOVAX,[2A00H];段头隐含为DSMOVDX,ES:[2A00H];段超越MOVSI,TABLE_PTR;段头隐含为DS还有:INAL,[90H];括号可以省去OUT[85H],AL;括号可以省去3.2.2直接寻址指令中直接给出存储器操作数的16位例:MOVAX,[3102H];AL(3102H),AH(3103H)如果(DS)=2000H,(23102H)=CDH,(23103H)=ABH则操作数的物理地址为:20000H+3102H=23102H指令执行后:(AX)=ABCDHMOV操作码02H31HAHAL23102HCDHABH存储器代码段数据段..23103H用途:用于操作数存放在存储器单元中或I/O接口地址仅为8位的的端口中例:MOVAX,[3102H];AL(33.2.4寄存器间接寻址

操作数的偏移地址(有效地址EA)放在寄存器中

只有SI、DI、BX和BP可作间址寄存器

例:MOVAX,[BX]MOVCL,CS:[DI]INAL,[DX];括号可省去OUT[DX],AL;括号可省去

错误例:

×MOVAX,[DX]×

MOVCL,[AX]EA=(BX)(BP)(SI)(DI)3.2.4寄存器间接寻址操作数的偏移地址(有效地址E指令操作例:MOVAX,[SI]若(DS)=6000H,

(SI)=1200H,(61200H)=44H,(61201H)=33H则指令执行后,(AX)=3344H。44H33H60001200DSSI6000061200

61200HAX存储器数据段

+)120044H33H用途:操作数存放在存储器或I/O接口地址为16位的的寻址指令操作例:MOVAX,[SI]44H33H6000123.2.5寄存器相对寻址EA=间址寄存器的内容+8/16位的位移量寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)EA=(BX)(BP)(SI)(DI)+8位16位位移量

3.2.5寄存器相对寻址EA=间址寄存器的内容+例:MOVAX,[BX+8]MOVCX,TABLE[SI]MOVAX,[BP+1000H];默认段寄存器为SS指令操作例:MOVAX,DATA[BX]若(DS)=6000H,(BX)=1000H,DATA=2A00H,(63A00H)=66H,(63A01H)=55H则物理地址=60000H+1000H+2A00H=63A00H

指令执行后:(AX)=5566H(见下页图示)例:MOVAX,[BX+8]操作码00偏移量低2A偏移量高DS60000BX1000+DATA2A0063A0063A00HAHALAX代码段数据段.........66H55HMOVAX,DATA[BX]用途:操作数存放在存储器地址指定的单元中操作码00偏移量低2A偏移量高DS60000BX3.2.6基址-变址寻址若操作数的偏移地址:由基址寄存器(BX或BP)给出——基址寻址方式由变址寄存器(SI或DI)给出——变址寻址方式

由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。EA=(BX)(BP)+(SI)(DI)同一组内的寄存器不能同时出现。基址寄存器变址寄存器3.2.6基址-变址寻址若操作数的偏移地址:由一个基例:MOVAX,[BX][SI]MOVAX,[BX+SI]MOVAX,DS:[BP][DI]错误例:

×MOVAX,[BX][BP]

×

MOVAX,[DI][SI]用途:操作数存放在存储器地址指定的单元中例:用途:操作数存放在存储器地址指定的单元中83000操作码DS

80000BX

2000+SI

100083000HAHALAX代码段数据段.........YYXX指令操作例:MOVAX,[BX][SI]假定:(DS)=8000H,(BX)=2000H,SI=1000H则物理地址=80000H+2000H+1000H=83000H指令执行后:(AL)=[83000H](AH)=[83001H]83000操作码DS80000BX2000+3.2.7相对的基址-变址寻址在基址-变址寻址的基础上再加上一个相对位移量

注意事项同基址-变址寻址EA=(BX)(BP)+(SI)(DI)+8位16位位移量

例:MOVAX,BASE[SI][BX]MOVAX,[BX+BASE][SI]MOVAX,[BX+SI+BASE]MOVAX,[BX]BASE[SI]MOVAX,[BX+SI]BASE基址变址用途:操作数存放在存储器地址指定的单元中3.2.7相对的基址-变址寻址在基址-变址寻址的基础上再指令操作例:MOVAX,DATA[DI][BX]若(DS)=8000H,(BX)=2000H,(DI)=1000H,DATA=200H则指令执行后(AH)=[83021H],(AL)=[83020H]8320083200HAHALAX+DATA0200操作码代码段数据段.........YYXXDS

80000BX

2000DI

1000指令操作例:MOVAX,DATA[DI][BX]83200使用相对的基址-变址寻址方式可以很方便地访问二维数组。基址寄存器数组首地址变址寄存器数组元素行址位移量数组元素列址(偏移地址)二维数组例:内存图示(按行存储)(行位移地址)(行内元素下标)183252409A=使用相对的基址-变址寻址方式可以很方便地访问二维数组。基址寄 这种寻址方式为386以上处理器采用: 将第二个寄存器与比例因子相乘,比例因子可以是1、2、4、8。分别对应字节、字、双字、四字数组。例如: MOV[EAX+2*EDI+100H],CX MOVAL,[EBP+2*EDI-2] MOVEAX,ARRAY[4*ECX]3.2.8比例变址寻址 这种寻址方式为386以上处理器采用:3.2.8比例变3.2.9隐含寻址

指令操作数是隐含的,在指令中未显式地指明。例:MULBL

指令隐含了被乘数AL及乘积AX类似的指令还有:XLAT、DIV、CBW、MOVS等(AL)×(BL)→AX用途:操作数存放在寄存器或存储器地址指定的单元中3.2.9隐含寻址指令操作数是隐含的,在指令中未显式如何寻找指令的地址呢?(1)程序中将要执行的指令的地址由CS:IP指向;(2)程序的第一条指令的地址(首地址)由操作系统OS分配产生;(3)一般程序是一条接着一条的顺序执行的,所以CS:IP自动加1即可实现。(4)当程序跳转执行时,CS:IP采用直接方式或间接方式改为跳转到的指令地址。3.3程序转移地址寻址方式如何寻找指令的地址呢?(1)程序中将要执行的指令的地址由CS第四章80X86的寻址方式和指令系统段内转移只需改变(IP) 段内转移包括两种寻址方式:直接,间接。段间转移改变(CS)(IP) 段间转移包括两种寻址方式:直接,间接。功能: 用来确定转移指令及CALL指令的转移地址。 以转移指令为对象来分析各种转移地址寻址方式。第四章80X86的寻址方式和指令系统段内转移只需改变((一)段内直接寻址(Intrasegmentdirectaddressing)(二)段内间接寻址(Intrasegmentindirectaddressing)(三)段间直接寻址(Intersegmentdirectaddressing)(四)段间间接寻址(Intersegmentinderectaddressing)(一)段内直接寻址(Intrasegmentdirect(一)段内直接寻址(Intrasegmentdirectaddressing)

转向有效地址EA是(IP)当前和指令中指定的8位或16位位移量之和。对于近转,16位位移量可正可负,范围是-32768~+32767对于短转,8位位移量可正可负,范围是-128~+127, 这种寻址方式适用于条件转移及无条转移指令。 当用于条件转移指令时,位移量只允许8位; 用于无条件转移指令时,位移量8位时称为短跳转。(一)段内直接寻址(Intrasegmentdirect指令汇编语言格式:

JMPNEARPTRPROGIA;(IP)←(IP)当前+16位位移量

JMPSHORTQUEST; (IP)←(IP)当前+8位位移量调用指令(CALL)也适用。PROGIA、QUEST 均为转向符号地址,机器中用位移量表示。

汇编指令中16位位移量,则在符号地址前加操作符NEARPTR。

指令汇编语言格式:JMPNEARPTRPROGIA;(IP)←(IP)当前+16位位移量

段内直接寻址JMPNEARPTRPROGIAOP00H12H......OP03HPROGIA=3172AH(IP)当前=3052AH16位的位移量=3172AH-3052AH存储器跳转JMPNEARPTRPROGIA;(IP)←(IP)(二)段内间接寻址(Intrasegmentindirectaddressing)段内间接寻址: 转向有效地址是一个寄存器或一个存储单元的内容, 这内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得。得到的转向有效地址用来取代IP寄存器的内容。这种寻址方式和以下二种段间寻址方式都不能用于条件转移指令。*条件转移指令只能适用段内直接寻址的8位位移量。(二)段内间接寻址(Intrasegmentindirec汇编格式:JMPBX

JMPWORDPTR[BP+TABLE]其中:WORDPTR——操作符, (BP)+TABLE寻址所得地址,是一个字的有效地址,由有效地址形成物理地址里的内容即为转向有效地址IP。 转向物理地址的计算公式:PA=16d(CS)+(IP)汇编格式:JMPBX段内间接寻址方式的转移指令中转移的有效地址的计算方法:举例:指令执行前:设:(DS)=2000H,(BX)=1256H,(SI)=528FH, TABLE=20A1H, (232F7H)=3280H,(264E5H)=2450H例1、JMPBX指令执行后:(IP)=1256H

段内间接寻址方式的转移指令中转移的有效地址的计算方法:例2、JMPWORDPTRTABLE[BX] 指令执行后:

PA=16d(DS)+(BX)+TABLE=232F7H(IP)=3280H=(232F7H)例3、JMPWORDPTR[BX][SI] 指令执行后: PA=16d(DS)+(BX)+(SI)=264E5H(IP)=2450H=(264E5H)注意:如果指令操作数已被定义为16位的存储器,则:WORDPTR可以省去。例2、JMPWORDPTRTABLE[BX](三)段间直接寻址:(Intersegmentdirectaddressing)

指令中直接提供了转向段地址和偏移地址。

用指令中指定的偏移地址(IP)

用指令中指定的段地址(CS)

完成了从一段到另一段的转移操作

指令汇编语言格式:

JMPFARPTRNEXTROUTINT

NEXTROUTINT——转向的符号地址

FARPTR ——段间转移操作符 OFFSETNEXTROUTINT(IP) SEGNEXTROUTINT(CS)(三)段间直接寻址:(Intersegmentdirect例:JMPFARPTRCCCOP34H12H00H50H............存储器2000:1000HJMPFARCCCCCC:5000:1234H...2000H段5000H段例:JMPFARPTRCCCOP34H12H0(四)段间间接寻址(Intersegmentinderectaddressing)用存储器中二个相继字的内容取代IP、CS以达到段间转移目的。存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种寻址方式取得。指令汇编语言格式:

JMPDWORDPTR[INTERS+BX]DWORDPTR——双字操作符,转向地址双字(段间转移)[INTERS+BX]——数据寻址方式为直接变址寻址方式*段间转移必须是无条件转移。(四)段间间接寻址(Intersegmentinderec例:JMPDWORDPTR[BX]指令执行前:设: (DS)=4000H, (BX)=1212H (41212H)=1000H (41214H)=4A00H指令执行后: (IP)=1000H (CS)=4A00H例:JMPDWORDPTR[BX]小结指令由(

)和(

)构成如何取得操作数——称为(

)操作码操作数寻址方式小结指令由()和(寻址方式可分8种立即寻址直接寻址-针对M、I/O寄存器相对寻址-针对M寄存器寻址-针对R基址-变址寻址-针对M基址-变址相对寻址-针对M寄存器间接寻址-针对M、I/O隐含寻址-针对R、M寻址方式可分8种立即寻址直接寻址寄存器间接、寄存器相对、基址变址、相对基址变址4种寻址方式的比较:

寻址方式指令操作数形式

寄存器间接只有一个寄存器(BX/BP/SI/DI之一)

寄存器相对一个寄存器加上位移量基址—变址两个不同类别的寄存器相对基址-变址两个不同类别的寄存器加上位移量寄存器间接、寄存器相对、基址变址、相对基址变址4种寻址方式的为便于理解指令的形式和功能,对指令中操作符号的约定如下:

大小写字母无区别oprd:泛指各类操作数;

oprd1,oprd2:多操作数指令中,oprd1为目标操作数,oprd2为源操作数;

dest,src:目的操作数,源操作数reg:8位或16位的通用寄存器;

sreg:段寄存器;

acc:累加器al或ax3.38086/8088指令系统为便于理解指令的形式和功能,对指令中操作3.

reg8:8位通用寄存器;

reg16:16位通用寄存器;mem:8位或16位存储器;

mem8:8位存储器;mem16:16位存储器;disp:8位或16位存储器地址偏移量;

imm或data:8位或16位立即数;

imm8:8位立即数;imm16:16位立即数;

port:I/O端口地址,port端口号0~255;

[]:存储单元的内容或偏移地址。reg8:8位通用寄存器;可分成如下6类:数据传送指令算术运算指令逻辑运算和移位指令串操作指令程序控制指令处理器控制指令可分成如下6类:3.3.1数据传送指令可实现存储器寄存器I/O

数据传送指令又可分为如下四种:通用传送目标地址传送标志传送输入输出3.3.1数据传送指令可实现表4-1数据传送类指令表指令类型指令功能指令格式通用数据传送字节或字传送字压入堆栈字弹出堆栈字节或字交换字节翻译MOV目标,源PUSH源POP目标XCHG目标,源XLAT地址传送装入有效地址装入DS寄存器装入ES寄存器LEA目标,源LDS目标,源LES目标,源标志位传送将FR低字节装入AH寄存器将AH内容装入FR低字节将FR内容压入堆栈从堆栈中弹出FR内容LAHFSAHFPUSHFPOPFI/O传送输入字节或字输出字节或字IN累加器,端口OUT端口,累加器表4-1数据传送类指令表指令类型指令功能指令格式通1.通用传送指令(1)

MOVdest,src;dest←src传送的是字节还是字取决于指令中涉及的寄存器是8位还是16位。具体来说可实现:

①MOVmem/reg1,mem/reg2指令中两操作数中至少有一个为寄存器

例:MOV CL,DLMOV AX,BX MOV [SI],CX

MOV CL,[BX+5]1.通用传送指令②MOVreg,data;立即数送寄存器③MOVmem,data;立即数送存储单元④MOVacc,mem;存储单元送累加器⑤MOVmem,acc;累加器送存储单元⑥MOVsegreg,mem/reg;存储单元/寄存器送段寄存器⑦MOVmem/reg,segreg;段寄存器送存储单元/寄存器②MOVreg,data;立即数送寄存器MOV指令使用规则:1)IP不能作目的寄存器2)不允许mem←mem3)不允许segreg←segreg4)立即数不允许作为目的操作数5)不允许segreg←立即数6)源操作数与目的操作数类型要一致MOV指令使用规则:1)IP不能作目的寄存器几个不能传送的解决办法:用AX作桥梁

存储器←存储器:

MOVAX,MEM1 MOVMEM2,AX段寄存器←段寄存器:

MOVAX,DS MOVES,AX段寄存器←立即数:

MOVAX,DATA MOVDS,AX几个不能传送的解决办法:用AX作桥梁应用举例:将1000H开始的100个存储单元全部填充为ASCII码2AH(*)。程序段如下(例001)

MOVDI,1000HMOVCX,64HMOVAL,2AH;*AGAIN:MOV[SI],ALINCSI

DECCXJNZAGAINHLT应用举例:将1000H开始的100个存储单元上程序段存放在代码段中,设(CS)=109EH,则各条指令存放地址如下:

CS:IP指令109E:0100MOVDI,1000H109E:0103MOVCX,64H109E:0106MOVAL,2AH109E:0108MOV[DI],AL109E:010AINCDI109E:010BDECCX109E:010CJNZ0108109E:010EHLT 109E:0110上程序段存放在代码段中,设(CS)=109EH,则各条指令存

写入2AH(*)后,数据段中相应存储单元的内容改变如下:DS:10002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10102A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10202A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10302A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10402A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10502A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ADS:10602A2A2A2A写入2AH(*)后,数据段中相应存储单元的内容改变如下例:把内存中首地址为MEM1的200个字节送到首地址为MEM2的区域中,编程。(例002)MOVSI,OFFSETMEM1MOVDI,OFFSETMEM2MOVCX,200NEXT:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCXJNZNEXTHLT例:把内存中首地址为MEM1的200个字节送到首地址为MEM什么是堆栈?按“后进先出(LIFO)”方式工作的存储区域。堆栈以字为单位进行压入弹出操作。为什么要设置堆栈?为什么要按“后进先出”方式工作?参见下图(2)堆栈操作指令什么是堆栈?(2)堆栈操作指令主程序IP继续执行主程序执行子程序转子程序压栈弹出返回主程序主程序IPIP(下)继续执行主程序转子程序1返回主程序IP’执行子程序2转子程序2返回子程序1IP’(下)执行子程序1继续执行子程序1(a)(b)子程序调用示意图(a)主程序调子程序;(b)子程序嵌套示意图压栈弹出IP(下)主程序IP继续执行主程序执行子程序转子程序压栈弹出返回主程序规定由SS指示堆栈段的段基址,堆栈指针SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。SPSS堆栈段进栈方向退栈方向栈底栈顶规定由SS指示堆栈段的段基址,堆栈指针SP始终指向堆栈的顶部

①压栈指令

PUSHsrc ;src为16位操作数例:PUSH AX ;将AX内容压栈执行操作:(SP)-1←高字节AH(SP)-2←低字节AL(SP)←(SP)-2①压栈指令设(AX)=1020H,执行示意图如图所示低地址存储区(SS段)执行前(AX)=1020(SP)存储区(SS段)进栈方向执行后2010(AL)(AH)PUSHAX指令执行示意图(SP)-2(SP)高地址低地址高地址(SP)-1设(AX)=1020H,执行示意图如图所示低地址存储区执行前压栈指令的格式为:

PUSH regPUSH mem/regPUSH segreg例如:PUSHAXPUSH[BX]PUSHDS注意:进栈方向是高地址向低地址发展(向上生成)。压栈指令的格式为:注意:进栈方向是高地址向低地址发展

②弹出指令POP dest例:POP BX ;将栈顶内容弹至BX执行操作:(BL)←(SP)

(BH)←(SP)+1

(SP)←(SP)+2②弹出指令POPBX的执行示意图如下图所示低地址存储区(SS段)出栈方向执行前2010POPBX指令执行示意图(SP)存储区(SS段)执行后(BX)=1020(SP)(SP)+1(SP)+2BX2010高地址低地址高地址POPBX的执行示意图如下图所示低地址存储区出栈方向执行堆栈指令使用时应注意几点:①堆栈操作总是按字进行②不能从栈顶弹出一个字给CS③堆栈指针为SS:SP,SP永远指向栈顶④SP自动进行增减量(-2,+2)堆栈指令使用时应注意几点:例子(例003)movax,9000hmovss,axmovsp,0E200hmovdx,38FFhpushdxpushaxpopdxpopax例子(例003)movax,9000h格式:XCHGreg/mem,mem/reg功能:交换两操作数的内容。要求:两操作数中至少有一个在寄存器中;操作数不能为段寄存器和立即数;源和目地操作数类型要一致。举例:XCHG AX,BXXCHG [2000],CLXCHG [2000],CX(例004)(3)交换指令XCHG格式:XCHGreg/mem,mem/reg(3)交换指(4).输入输出(I/O)指令

只限于用累加器AL或AX来传送信息。功能:(累加器)←→I/O端口①输入指令IN格式:INacc,PORT;PORT端口号0~255INacc,DX;DX表示的端口范围达64K例:INAL,80H;(AL)←(80H端口)

INAL,DX;(AL)←((DX))(4).输入输出(I/O)指令只限于用累加器AL或AX来例:OUT68H,AX;(69H,68H)←(AX)OUTDX,AL;((DX))←(AL)在使用间接寻址的IN/OUT指令时,要事先用传送指令把I/O端口号设置到DX寄存器,如:

MOVDX,220HINAL,DX;将220H端口内容读入AL②输出指令OUT

格式:OUTport,acc

OUTDX,acc例:OUT68H,AX;(69H,68H)←(AX)②(5)查表指令XLAT

执行的操作:AL←[(BX)+(AL)]又叫查表转换指令,它可根据表项序号查出表中对应代码的内容。执行时先将表的首地址(偏移地址)送到BX中,表项序号存于AL中。

例:内存数据段有一张小写字母的ASCII码表,如欲查出表中第3个代码(代码序号从0开始),程序如下:(例005)(5)查表指令XLATmovbx,offsetmem1;(BX)←表首地址moval,3;(AX)←序号Xlat;查表转换movdl,almovah,2int21h执行后得到:(AL)=64H=’d’注意:转换表长度最大为256个表项(字节)。movbx,offsetmem1;(BX)←表首地址注意(5)字节-字转换指令格式:CBW;把AL的符号位复制到AH

即8位带符号数AL16位带符号数AX=AHAL,真值不变CWD;把AX的符号位复制到DX

即16位带符号数AX32位带符号数DXAX,真值不变用途:用于有符号数的除法。例如:(AL)=A7H,则执行CBW后,AH的内容为FFH。注意:

带符号数扩展与无符号数扩展的区别(5)字节-字转换指令格式:CBW;把AL的符号2.地址传送指令共有三条:格式:LEAreg,mem;将指定存储器的16位偏移地址送指定寄存器(例005)LDSreg,mem32;DS:reg←mem开始的四个内存单元)

LESreg,mem32;同上,但DS改为ES

要求源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。2.地址传送指令设:(SI)=1000H则执行该指令后,(BX)=1010H注意:以下两条指令差别:LEABX,BUFFER;将符号地址为BUFFER的存储单元的偏移地址取到

BX中;MOVBX,BUFFER;将BUFFER存储单元中的内容取到

BX中.例:LEA BX,[SI+10H]设:(SI)=1000H例:LEA BX,[SI+10H]下面两条指令等效:LEABX,BUFFERMOVBX,OFFSETBUFFER其中OFFSETBUFFER表示存储器单元BUFFER的偏移地址。二者都可用于取存储器单元的偏移地址,但LEA指令可以取动态的地址,OFFSET只能取静态的地址。下面两条指令等效:4.标志传送指令共有四条:(1)读标志指令LAHF(例006)

LAHF把标志寄存器低8位中的5个标志位传送到AH中的指定位,如下图所示:OFDFIFTFSFZFAFPFCFAHLAHF指令的功能FLAG4.标志传送指令OFDFIFTFSFZFAFPFCFAHLA(2)设置标志指令SAHF

SAHF的功能与LAHF的功能正好相反,用图来示意,只要将上图中5个箭头方向反一下即可。OFDFIFTFSFZFAFPFCFAHSAHF指令的功能FLAG(2)设置标志指令SAHFOFDFIFTFSFZFAFPFC执行的操作:(SP)-1←标志寄存器高8位(SP)-2←标志寄存器低8位(SP)←(SP)-2(4)从栈顶弹出标志寄存器指令POPF执行的操作:标志寄存器低8位←(SP)标志寄存器高8位←(SP)+1

(SP)←(SP)+2

PUSHF和POPF指令用于保护和恢复标志寄存器内容。(3)把标志寄存器推入栈顶指令PUSHF执行的操作:(SP)-1←标志寄存器高8位(3)把标志寄存例如:PUSH AXPUSH CX

PUSHF;保护标志寄存器内容;这段程序要用到AX,CX以及标志位

POPF ;恢复标志寄存器内容POP CXPOP AX...例如:...

数据传送指令中,除SAHF和POPF这两条指令外,其余所有指令均不影响标志位(即标志寄存器FLAGS的6个状态标志)。数据传送指令中,除SAHF和POPF这两条指令外,其3.3.2算术运算指令涉及两种类型数据:无符号数和有符号数。对加减法指令,无符号和有符号数可采用同一套指令,但应注意:参加的操作数必须都是无符号数或都是有符号数。需使用不同的标志位(CF,OF)来检查无符号数和有符号数的运算结果是否溢出。这类指令一般都影响标志寄存器FLAGS。3.3.2算术运算指令涉及两种类型数据:表4-2算术运算类指令表表4-2算术运算类指令表两个8位数相加时有4种情况:①无符号数和有符号数均不溢出二进制相加无符号数加有符号数加000010008+8+00011110

+30

+(+30)0010011038+38

结果38 CF=0OF=0无符号数范围0~255带符号数范围-128~127两个8位数相加时有4种情况:①无符号数和有符号数均不溢出无符②

无符号数溢出无符号数有符号数

000010008+8+11111101

+253

+(-3)100000101261+5结果5 CF=1 OF=0③

有符号数溢出

000010008+8+01111101

+125

+(+125)10000101133+133 结果-123 CF=0OF=1(补码表示)②无符号数溢出④无符号数和有符号数均溢出无符号数有符号数10001000136-120+11110111

+247

+(-9)101111111383-129结果127CF=1OF=1上面四种情况说明,CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出。有符号数的溢出是一种出错状态,在运算过程中应当避免。④无符号数和有符号数均溢出所有的算术运算指令,都会影响FLAGS标志寄存器的6个状态标志CF/OF/ZF/SF/AF/PF(3个控制标志IF/DF/TF不受影响)。总的讲,有这样一些规则:当无符号数运算产生溢出(即最高位向前有进位或借位)时,CF=1,否则为0;当有符号数运算产生溢出时,OF=1(即OF=CF⊕CF-1),否则为0;当运算结果为0时,ZF=1,否则为0;当运算结果为负数时,SF=1,否则为0;当运算一半位置有进位或借位时,AF=1,否则为0;当运算结果中有偶数个1时,PF=1,否则为0。所有的算术运算指令,都会影响FLAGS标志寄存器的6个状态标(1)不带进位的加法指令ADD 格式:ADD acc,dataADD mem/reg,dataADD

mem/reg1,mem/reg2注:1.源和目的操作数不能同时为存储器操作数

2.不能把段寄存器作为操作数例:ADD AL,30HADD AX,[BX+20H] ADD CX,SI ADD [DI],200HADD指令对标志位(指6个状态标志)都有影响。1.加法指令(共5条)(1)不带进位的加法指令ADD1.加法指令(共5条)(2)带进位位的加法指令ADCADC指令在形式上和功能上都有与ADD类似,只是相加时还要包括进位标志CF的内容。例如:ADCAL,68H;AL←(AL)+68H+(CF)

ADC

AX,CX;AX←(AX)+(CX)+(CF)ADCBX,[DI];BX←(BX)+[DI+1][DI]+(CF)(2)带进位位的加法指令ADCADC指令在形式上和例:有两个4字节的无符号数相加:2C56F8AC+309E47BE=?设被加数、加数分别存放在BUFFER1及BUFFER2开始的两个存储区内,结果放回BUFFER1存储区,如下页图所示。因CPU只能进行8位或16位的加法运算,为此可将加法分4次进行。ADC指令主要用于多字节加法运算中例:有两个4字节的无符号数相加:ADC指令主要用于多字节加法56H2CHBEH47HBUFFER1BUFFER2ACHF8H9EH30H被加数加数数据段多字节加法示意图......56H2CHBEH47HBUFFER1BUFFER2ACHF程序段如下:MOVCX,4;置循环次数MOVSI,0;置SI初值为零

CLC

;清进位标志CFLL:MOV AL,BUFFER2[SI] ADC BUFFER1[SI],AL;带进位加INC SI;(SI)+1DEC CX;(CX)-1JNZLL;若(CX)0,则转LL思考:若最高位有进位,如何改?程序段如下:ADD/ADC指令对条件标志位(CF/OF/ZF/SF)的影响:CF位表示无符号数相加的溢出。OF位表示带符号数相加的溢出。1结果为负0否则SF=1结果为00否则ZF=1和的最高有效位有向高位的进位0否则CF=1两个操作数符号相同,而结果符号与之相反0否则OF=ADD/ADC指令对条件标志位(CF/OF/ZF/SF)的影格式:INCreg/mem功能:类似于C语言中的++操作:对指定的操作数加1例:INCALINCSIINCBYTEPTR[BX+4]注意:本指令不影响CF标志,但对AF/OF/PF/SF/ZF会产生影响。3)加1指令INC(单操作数指令)格式:INCreg/mem3)加1指令INC(单操作数(1)不考虑借位的减法指令SUB

格式:SUBdest,src操作:dest←(dest)-(src)注:1.源和目的操作数不能同时为存储器操作数2.不能把段寄存器作为操作数指令例子:

SUBAL,60HSUB[BX+20H],DXSUBAX,CX2.减法指令(1)不考虑借位的减法指令SUB2.减法指令SBB指令主要用于多字节的减法。格式:SBBdest,src操作:dest←(dest)-(src)-(CF)指令例子:SBBAX,CXSBBWORDPTR[SI],2080HSBB[SI],DX(2)考虑借位的减法指令SBBSBB指令主要用于多字节的减法。(2)考虑借位的减法指令S例:x、y、z均为32位数,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列实现wx+y+24-z,结果放在W,W+2单元中。(例007)

MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0;x+y+24

SUBAX,ZSBBDX,Z+2;x+y+24-zMOVW,AXMOVW+2,DX;结果存入W,W+2单元例:x、y、z均为32位数,分别存放在地址为X,X+2;Y作用类似于C语言中的”--”操作符。格式:DECopr

操作:opr←(opr)-1指令例子:

DECCLDECBYTEPTR[DI+2]DECSI(3)减1指令DEC注:该指令与INC一样,它不影响CF标志,但对AF/OF/PF/SF/ZF会产生影响。作用类似于C语言中的”--”操作符。(3)减1指令DEC注格式:NEGopr操作:opr←0-(opr)对一个操作数取补码相当于用0减去此操作数,故利用NEG指令可得到负数的绝对值。例:若(AL)=0FCH,则执行NEGAL 后,(AL)=04H,CF=1本例中,0FCH为-4的补码,执行求补指令后,即得到4(-4的绝对值)。(4)求补指令NEG格式:NEGopr(4)求补指令NEGSUB/SBB指令对标志位(CF/OF/ZF/SF)的影响:

CF=1表示无符号数减法溢出。

OF=1表示带符号数减法溢出。NEG指令对CF/OF的影响:

CF:操作数为0时,求补的结果使CF=0,否则CF=1。

OF:字节运算对-128求补或字运算对-32768求补时OF=1,否则OF=0。1被减数的最高有效位有向高位的借位0否则CF=1两个操作数符号相反,而结果的符号与减数相同0否则OF=SUB/SBB指令对标志位(CF/OF/ZF/SF)的影响:格式:CMPdest,src操作:dest←(dest)-(src)(而SUBdest,src;dest←(dest)-(src))CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。指令例子:

CMPAL,0AHCMPCX,SICMPDI,[BX+03](5)比较指令CMP格式:CMPdest,src(5)比较指令CMP根据标志位来判断比较的结果(例008)1)根据ZF判断两个数是否相等。若ZF=1,则两数相等。2)若ZF=0,则两个数不相等,则分两种情况考虑:①比较的是两个无符号数若CF=0,则dest>src;若CF=1,则dest<src。②比较的是两个有符号数若OF⊕SF=0,则dest>src;若OF⊕SF=1,则dest<src。根据标志位来判断比较的结果(例008)1)根据ZF比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。举例:比较AL、BL、CL中带符号数的大小,将最小数放在AL中。程序:CMPAL,BL;AL和BL比较

JNGBBB

;若AL≤BL,则转XCHGAL,BL;若AL>BL,则交换BBB:CMPAL,CL;AL和CL比较

JNGCCC;若AL≤CL,则转XCHGAL,CL;若AL>CL,则交换CCC:HLT思考:

程序的结果?(AL、BL、CL中数据的大小顺序)比较指令在使用时,一般在其后紧跟一条条件转移指令,判进行乘法时:8位8位→16位乘积 (即ALmem8/reg8

→AX)16位16位→32位乘积(即AXmem16/reg16

→DXAX)(1)

无符号数的乘法指令MULmem/reg格式:MULsrc操作:字节操作数(AX)(AL)×(src)字操作数(DX,AX)(AX)×(src)指令例子:

MULBL;(AL)×(BL),乘积在AX中MULCX;(AX)×(CX),乘积在DX,AX中MULBYTEPTR[BX]3.乘法指令进行乘法时:8位8位→16位乘积 3.乘法指令格式与MUL指令类似,只是要求两操作数均为有符号数。指令例子:

IMULBL;(AX)←(AL)×(BL)

IMULWORDPTR[SI];(DX,AX)←(AX)×([SI+1][SI])

(2)

有符号数乘法指令IMUL注意:MUL/IMUL指令中

●AL(AX)为隐含的乘数寄存器;

●AX(DX,AX)为隐含的乘积寄存器;

●SRC不能为立即数;

●除CF和OF外,对其它标志位无定义。格式与MUL指令类似,只是要求两操作数均为有符号数。MUL/IMUL乘法指令对CF/OF的影响:00乘积的高一半为零11否则MUL指令:CF/OF=00乘积的高一半是低一半的符号扩展11否则

IMUL指令:CF/OF=例:(AL)=A5H(-5B),(BL)=11H(例009)

(1)IMULBL;(AX)(AL)×(BL)

;A5×11-5B×11=-060BF9F5

;

(AX)=F9F5H

CF=OF=1(2)MULBL;(AX)(AL)×(BL)

;A5×11=0AF5

;

(AX)=0AF5H

CF=OF=1

MUL/IMUL乘法指令对CF/OF的影响:00乘4.除法指令进行除法时:16位/8位→8位商及8位余数 32位/16位→16位商及16位余数对被除数、商及余数存放有如下规定:

被除数 商 余数字节除法AX AL AH字除法 DX:AX AX DX4.除法指令进行除法时:16位/8位→8位商及8位余数格式:DIVsrc操作:字节操作(AL)(AX)/(src)的商(AH)(AX)/(src)的余数字操作(AX)(DX,AX)/(src)的商(DX)(DX,AX)/(src)的余数指令例子:

DIVCLDIVWORDPTR[BX]注:若除数为零或AL中商大于FFH(或AX中商大于FFFFH),则CPU产生一个类型0的内部中断。(1)

无符号数除法指令DIV格式:DIVsrc(1)无符号数除法指令DIV(2)

有符号数除法指令IDIV格式:IDIVsrc操作与DIV类似。商及余数均为有符号数,且余数符号总是与被除数符号相同。CBW与CWD两指令主要用于被除数扩展注意:

对于D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论