《指令系统与汇编语言程序设计-n.ppt》由会员分享,可在线阅读,更多相关《指令系统与汇编语言程序设计-n.ppt(114页珍藏版)》请在三一办公上搜索。
1、1,本章主要教学内容指令格式及寻址的有关概念8086CPU指令系统的寻址方式及其应用8086CPU各类指令的表示、功能、特点及其应用Pentium微处理器新增指令和寻址方式介绍汇编语言的基本表达方式和内容汇编语言程序设计的基本步骤和基本方法顺序、分支、循环、子程序基本结构和设计方法常用的DOS和BIOS中断调用简介,第3章,指令系统与汇编语言程序设计,2,本章教学目的及要求 通过学习,使学生掌握指令的寻址方式、指令系统及其应用;学会程序设计的基本方法;掌握程序设计的技巧,保证程序设计的质量。,第3章,指令系统与汇编语言程序设计,3,第3章,3.1 指令格式及寻址1.指令系统与指令格式 在计算机
2、中要执行的各种操作命令称为指令。计算机所能执行的全部命令的集合即为该计算机的指令系统。计算机指令以二进制编码的形式存放在存储器中,用二进制编码形式表示的指令称为机器指令,CPU可以直接识别机器指令。人们采用一些助记符通常是指令功能的英文单词的缩写,如数据传送指令用助记符MOV(MOVE的缩写),这样表示的指令称为符号指令,也称为汇编指令。汇编指令具有直观、易理解、好记忆的特点。,指令系统与汇编语言程序设计,4,第3章,指令系统与汇编语言程序设计,计算机中的汇编指令由操作码字段和操作数字段两部分组成。(1)操作码字段:操作码表示计算机要执行的某种指令功能,由它来规定指令的操作类型,说明计算机要执
3、行的具体操作,例如传送、运算、移位、跳转等操作。同时还指出操作数的类型、操作数的传送方向、寄存器编码或符号扩展等,是指令中必不可少的组成部分。(2)操作数字段:操作数表示计算机在操作中所需要的数据,或者所需数据的存放位置(也称为地址码),还可以是指向操作数的地址指针或其它有关操作数据的信息。,5,8086的指令格式如图3-1所示,指令的长度范围是16个字节。其中,操作码字段为12个字节(B1、B2),操作数字段为04个字节(B3B6)。每条具体指令的长度将根据指令的操作功能和操作数的形式而定。图3-1 8086的指令格式,第3章,指令系统与汇编语言程序设计,6,第3章,指令系统与汇编语言程序设
4、计,2.寻址及寻址方式的概念 计算机的指令中通常要指定操作数的位置,即给出操作数的地址信息,在执行时需要根据这个地址信息找到需要的操作数,这种寻找操作数的过程称为寻址。寻址方式就是寻找操作数或操作数地址的方式。不同机器的指令系统都规定了一些寻址方式以供编程时选择使用,根据给定的寻址方式,就可以方便地访问各类操作数。,7,第3章,指令系统与汇编语言程序设计,8086指令中的操作数有三种可能的存放位置:(1)操作数直接在指令中,即跟随在指令操作码之后,指令的操作数部分就是操作数本身,这种操作数叫立即操作数。(2)操作数存放在CPU的某个内部寄存器中,这时指令的操作数部分是CPU内部寄存器的一个编码
5、,称为寄存器操作数。(3)操作数存放在内存储器的数据区中,这时指令的操作数部分包含此操作数所在的内存地址,称为存储器操作数。,8,第3章,指令系统与汇编语言程序设计,3.2 8086 CPU的寻址方式3.2.1 立即数寻址立即数寻址方式是指操作数直接存放在给定的指令中,紧跟在操作码之后。立即数可以是8位或16位二进制数。例如,给定如下指令,采用立即数寻址:MOV AL,10;十进制数()MOV AL,00100101B;二进制数()MOV AX,263AH;十六进制数(),9,第3章,指令系统与汇编语言程序设计,3.2.2 寄存器寻址 寄存器寻址方式是在指令中直接给出寄存器名,寄存器中的内容即
6、为所需操作数。在寄存器寻址方式下,操作数存在于指令规定的8位、16位寄存器中。寄存器可用来存放源操作数,也可用来存放目的操作数。寄存器寻址方式是CPU内部的操作,不需要访问总线周期,因此指令的执行速度比较快。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP等。对于8位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH、DL等。,10,第3章,指令系统与汇编语言程序设计,3.2.3 存储器寻址 计算机中访问内存的寻址方式有多种,不管哪一种寻址方式,最终都将得到存放操作数的物理地址。采用存储器寻址时,指令中需要给出操作数的地址信息。存储器操作数的有效地址EA的
7、计算方法和寻址方式有着密切地联系,而操作数物理地址PA的计算则和操作数的具体存放位置有关。,11,第3章,指令系统与汇编语言程序设计,1直接寻址方式 直接寻址方式是一种针对内存的寻址方式。在这种寻址方式下,指令中给出的地址码即为操作数的有效地址EA,它是一个8位或16位的位移量。在默认方式下,操作数存放在数据段DS中,如果要对除DS段之外的其他段如CS、ES、SS中的数据寻址,应在指令中增加前缀,指出段寄存器名,这称为段跨越。在直接寻址方式的指令中,操作数的有效地址EA已经给出,那么操作数的物理地址为:PA(DS)10HEA。,12,第3章,指令系统与汇编语言程序设计,2寄存器间接寻址方式 寄
8、存器间接寻址方式是指操作数的有效地址EA在指定的寄存器中,这种寻址方式是在指令中给出寄存器,寄存器中的内容为操作数的有效地址。16位操作数寻址时,EA放在基址寄存器BX、BP或变址寄存器SI、DI中,所以该方式下操作数的物理地址计算公式有以下几个:物理地址PA(DS)10H(BX)物理地址PA(DS)10H(DI)物理地址PA(DS)10H(SI)物理地址PA(SS)10H(BP),13,第3章,指令系统与汇编语言程序设计,3寄存器相对寻址方式 这种寻址方式是在指令中给定一个基址寄存器或变址寄存器和一个8位或16位的相对偏移量,两者之和作为操作数的有效地址。当选择间址寄存器BX、SI、DI时,
9、指示的是数据段中的数据,选择BP作间址寄存器时,指示的是堆栈段中的数据。有效地址计算为:EA(reg)8位或16位偏移量;其中reg为给定寄存器。物理地址计算为:PA(DS)10HEA(使用BX、SI、DI间址寄存器)PA(SS)10HEA(使用BP作为间址寄存器),14,第3章,指令系统与汇编语言程序设计,4基址变址寻址方式 在基址变址寻址方式中,有效地址EA是基址寄存器加变址寄存器,即两个寄存器的内容之和为操作数的有效地址。在该寻址方式中,当基址寄存器和变址寄存器的默认段寄存器不同时,一般由基址寄存器来决定默认用哪一个段寄存器作为段基址指针。若在指令中规定了段跨越,则可以用其他寄存器作为段
10、基地址。基址变址寻址方式的物理地址计算公式为:物理地址PA(DS)10H(BX)(SI)物理地址PA(SS)10H(BP)(DI),15,第3章,指令系统与汇编语言程序设计,5相对基址变址寻址方式 这种寻址方式是在指令中给出一个基址寄存器、一个变址寄存器和8位或16位的偏移量,三者之和作为操作数的有效地址。基址寄存器可取BX或BP,变址寄存器可取SI或DI。如果基址寄存器采用BX,则段寄存器使用DS;如果基址寄存器采用BP,则段寄存器使用SS。其物理地址计算为:PA(DS)10H(BX)(SI)或(DI)偏移量 PA(SS)10H(BP)(SI)或(DI)偏移量,16,第3章,指令系统与汇编语
11、言程序设计,3.2.4 I/O端口寻址 由于8086CPU的I/O端口采用独立编址方式,可有64K个字节端口或32K个字端口。指令系统中设有专门的输入指令IN和输出指令OUT来进行访问,I/O端口的寻址方式有直接端口寻址和寄存器间接端口寻址两种。,17,第3章,指令系统与汇编语言程序设计,1直接端口寻址 直接端口寻址是在指令中直接给出要访问的端口地址,一般采用2位十六进制数表示,可访问的端口数为0255个。例如:IN例如:IN AL,30H;表示从I/O端口地址为30H的端口中取出字节数据送到8位寄存器AL中。IN AX,50H;表示从I/O端口地址为50H和51H的两个相邻端口中取出字数据送
12、到16位寄存器AX中。,18,第3章,指令系统与汇编语言程序设计,2寄存器间接端口寻址 当访问的端口地址数256时,直接端口寻址不能满足要求,要采用I/O端口的间接寻址方式。它是把I/O端口的地址先送到寄存器DX中,用16位的DX作为间接寻址寄存器。此种方式可访问的端口数为065535个。例如:MOV DX,283H;将端口地址283H送到DX寄存器。OUT DX,AL;将AL中的内容输出到DX所指定的端口中。,19,第3章,指令系统与汇编语言程序设计,3.3 8086 CPU的指令系统 8086指令系统是80X86/Pentium微处理器的基本指令集。指令的操作数可以是8位或16位,偏移地址
13、是16位。按功能可将指令分成六大类,即:数据传送类指令、算术运算类指令、逻辑运算与移位类指令、串操作类指令、控制转移类指令和处理器控制类指令。,20,第3章,指令系统与汇编语言程序设计,3.3.1 数据传送类指令 数据传送类指令的基本功能是把操作数或操作数的地址传送到指定的寄存器或存储单元中。数据传送类指令共有14条,根据传送的内容可分成以下4组:(1)通用数据传送指令;(2)累加器专用传送指令;(3)地址传送指令;(4)标志寄存器传送指令。,21,第3章,指令系统与汇编语言程序设计,1.通用数据传送指令(1)传送指令MOV格式:MOV dst,srcMOV 指令的功能是把源操作数src传送至
14、目的操作数dst,执行后源操作数内容不变,目的操作数内容与源操作数内容相同。源操作数可以是通用寄存器、段寄存器、存储器以及立即数,目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。,22,数据之间的传送关系如图3-5所示。,图3-5 数据之间的传送关系,23,第3章,指令系统与汇编语言程序设计,使用MOV指令进行数据传送时要注意以下几点:(1)段寄存器CS及立即数不能作为目标操作数;(2)两个存储单元之间不允许直接传送数据;(3)立即数不能直接传送到段寄存器;(4)两个段寄存器之间不能直接传送数据;(5)传送数据的类型必须匹配;(6)MOV指令不影响标志位。,24,第3章,指令系统与汇
15、编语言程序设计,(2)堆栈操作指令PUSH/POP进栈指令:PUSH opr;SPSP2,将源操作数opr压入堆栈出栈指令:POP opr;栈顶弹出字数据到目标操作数opr,SPSP+2 堆栈是存储器中的一个特殊区域,主要用于存入和取出数据,堆栈是以“先进后出”的方式进行数据操作的。在8086的堆栈组织中,堆栈从高地址向低地址方向生长,它只有一个出入口,堆栈指针寄存器SP始终指向堆栈的栈顶单元,25,第3章,指令系统与汇编语言程序设计,(3)XCHG 交换指令 XCHG指令用来将源操作数和目的操作数的内容进行交换。它可以实现字节数据交换,也可以实现字数据交换。该指令的操作数必须有一个是在寄存器
16、中,即可以在两个通用寄存器之间或寄存器与存储器之间交换数据,但不能在两个存储器之间交换数据。指令执行结果不影响标志位。,26,第3章,指令系统与汇编语言程序设计,2.累加器专用传送指令 8086指令系统中将累加器AX作为数据传输的核心,系统的输入/输出指令IN/OUT和换码指令XLAT就是专门通过累加器来执行的,称之为累加器专用传送指令。,27,第3章,指令系统与汇编语言程序设计,3.地址传送指令 8086的地址传送指令用于控制寻址机构,它可将存储器操作数的地址传送到16位目标寄存器中。这类指令有以下3种形式:(1)有效地址送寄存器指令:LEA reg,srcLEA指令功能是将存储器操作数sr
17、c的有效地址传送到16位的通用寄存器reg。(2)地址指针送寄存器和DS指令:LDS reg,src 该指令完成一个32位的地址指针传送,地址指针包括段地址和偏移地址两部分。(3)地址指针送寄存器和ES指令:LES reg,src LES指令执行的操作与LDS指令相似,不同之处是以ES代替DS。,28,第3章,指令系统与汇编语言程序设计,4.标志寄存器传送指令 8086可通过这类指令读出当前标志寄存器中各标志位的内容,也可以重新设置各标志位的值。标志寄存器的传送指令共有4条,均位单字节指令,指令的操作数以隐含形式出现,隐含为AH寄存器。(1)取标志指令LAHF(2)置标志位指令SAHF(3)标
18、志寄存器入栈指令PUSHF(4)标志寄存器出栈指令POPF,29,第3章,指令系统与汇编语言程序设计,3.3.2 算术运算类指令 8086的算术运算类指令包括加、减、乘、除4种基本运算指令,以及为进行BCD码十进制数运算而设置的各种较正指令。8086的基本算术运算指令中,除加1和减1指令外,其余均为双操作数指令,两个操作数中除了源操作数可为立即数外,必须有一个操作数在寄存器中,而单操作数指令则不允许采用立即数方式。,30,第3章,指令系统与汇编语言程序设计,加减法运算在执行过程中会产生溢出,无符号数运算时,如果加法运算最高位向前产生进位或减法运算最高位向前有借位,则表示出现溢出,采用标志位CF
19、=1来表示;带符号数采用补码运算时,符号位也参与运算,出现溢出则表示运算结果发生了错误,采用标志位OF=1来表示。,31,第3章,指令系统与汇编语言程序设计,算术运算指令除加1指令INC不影响CF标志外,其余指令对CF、OF、ZF、SF、PF、AF等6个标志位均可产生影响,其规则如下:无符号数运算产生溢出时,CF1;带符号数运算产生溢出时,OF1;当运算结果为0时,ZF1;当运算结果为负数时,SF1;当运算结果中有偶数个1时,PF1;当操作数为BCD码,低4位出现进位1时,AF1。,32,第3章,指令系统与汇编语言程序设计,1.加法指令(1)不带进位加法指令:ADD dst,src 指令功能为
20、:(dst)(dst)+(src)(2)带进位的加法指令:ADC dst,src 指令功能为:(dst)(dst)+(src)+CF(3)加1指令:INC opr 指令功能为:(opr)(opr)+1,33,第3章,指令系统与汇编语言程序设计,2.减法指令(1)不带借位减法指令:SUB dst,src 指令功能为:(dst)(dst)(src)(2)带借位的减法指令:SBB dst,src 指令功能为:(dst)(dst)(src)CF(3)减1指令:DEC opr 指令功能为:(opr)(opr)1(4)求补指令:NEG opr 该指令将 opr中的内容取2的补码,相当于将opr中的内容按位
21、取反后末位加1。(5)比较指令:CMP opr1,opr2 指令功能为:(opr1)(opr2),34,第3章,指令系统与汇编语言程序设计,3.乘法运算指令 乘法指令包括无符号数和带符号数相乘的指令,指令中只给出乘数,被乘数隐含给出。两个8位数相乘时被乘数放入AL中,16位数的乘积存放到AX中;两个16位数相乘时被乘数先放入AX寄存器中,32位数的乘积放到DX和AX两个寄存器中,规定DX中存放高16位,AX中存放低16位。,35,第3章,指令系统与汇编语言程序设计,(1)无符号数乘法指令:MUL src若src为字节数据,执行AX(AL)(src);若src为字数据,执行DX、AX(AX)(s
22、rc)(2)带符号数乘法指令:IMUL src 该指令的执行功能与MUL相同。,36,第3章,指令系统与汇编语言程序设计,4.除法运算指令 除法指令可用来实现两个无符号数或带符号数的除法运算,包括字和字节两种操作,该指令隐含使用AX和DX作为一个操作数,指令中给出的源操作数为除数。(1)无符号数除法指令:DIV src DIV指令的被除数、除数、商和余数全部为无符号数。(2)带符号数除法指令:IDIV srcIDIV指令的被除数、除数、商和余数均为带符号数,且余数的符号位同被除数。两条指令执行的操作功能如下:当除数src为字节数据时,用AX除以src,得到的8位商保存在AL中,8位余数保存在A
23、H中;当除数src为字数据时,用DX、AX除以src,得到的16位商保存在AX中,16位余数保存在DX中。,37,第3章,指令系统与汇编语言程序设计,5.符号扩展指令 符号扩展指令是指用一个操作数的符号位形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数),符号扩展指令虽然使数据位数加长,但数据的大小并没有改变。该指令的执行不影响标志位。(1)字节转换为字指令CBW该指令的功能是将AL中的符号位D7扩展到AH中。(2)字转换为双字指令CWD 该指令的功能是将AX中的符号位扩展到DX中。,38,第3章,指令系统与汇编语言程序设计,6.十进制调整指令 十进制数在计算机中是采用二进制数来
24、表示的,这就是BCD码,要对十进制的BCD码进行算术运算,必须对得到的结果进行调整,否则结果无意义。8086指令系统提供了以下两类十进制调整指令。(1)组合BCD码加法、减法调整指令 DAA;组合BCD码加法调整指令,将AL中的和调整为组合BCD码 DAS;组合BCD码减法调整指令,将AL中的差调整为组合BCD码,39,第3章,指令系统与汇编语言程序设计,(2)非组合BCD加法、减法调整指令AAA;非组合BCD加法调整指令,将AL中的和调整为非组合BCD码AAS;非组合BCD减法调整指令,将AL中的差调整为非组合BCD码 AAA和AAS分别用于加法指令(ADD、ADC)或减法指令(SUB、SB
25、B)之后,执行时对AL进行测试,若AL中的低四位09H,或AF1,则进行AL(AL)06H修正;AL的高4位为0,同时AH(AH)1;CFAF1。调整后的结果放在AX中,40,第3章,指令系统与汇编语言程序设计,3.3.3 逻辑运算与移位类指令1.逻辑运算指令有以下5条逻辑运算指令,它们可对8位或16位操作数按位进行逻辑运算。(1)逻辑与指令:AND dst,src(2)逻辑或指令:OR dst,src(3)逻辑异或指令:XOR dst,src(4)逻辑非指令:NOT dst(5)测试指令:TEST dst,src。,41,第3章,指令系统与汇编语言程序设计,2.移位指令 移位操作类指令可以对
26、字节或字数据中的各位进行算术移位、逻辑移位或循环移位。移位指令的格式为:SHL/SAL/SHR/SAR dst,1/CL循环移位指令的格式为:ROL/ROR/RCL/RCR dst,1/CL 上述指令分别对操作数进行逻辑左移SHL、算术左移SAL、逻辑右移SHR、算术右移SAR;循环左移ROL、循环右移ROR、带进位的循环左移RCL、带进位的循环右移RCR等操作。操作数可以是字节或字操作。图3-7为各种移位操作的功能示意。,42,图3-7 移位指令的操作功能示意,43,第3章,指令系统与汇编语言程序设计,3.3.4 串操作类指令 数据串是存储器中的一串字节或字的数据序列。8086指令系统中设置
27、了串操作指令,其操作对象是内存中地址连续的字节串或字串。在每次操作后能够自动修改地址指针,为下一次操作作准备。基本串操作指令有串传送(MOVS)、串比较(CMPS)、串扫描(SCAS)、串存取(LODS、STOS)等。任何一个基本串操作指令的前面都可以加一个重复操作前缀,使指令操作重复,这样在处理长数据串时要比用循环程序速度快得多。,44,第3章,指令系统与汇编语言程序设计,3.3.5 控制转移类指令 程序的执行一般是按指令顺序逐条执行的,但有时需要改变程序的执行流程。控制转移类指令就是用来改变程序执行的方向,也就是修改IP和CS的值。通过控制转移指令可实现各种结构化程序设计,如分支结构程序、
28、循环结构程序等。(1)如果指令给出改变IP中内容的信息,转移的目标位置和转移指令在同一个代码段,则称为段内转移;(2)如果指令给出改变IP中内容的信息,又给出改变CS中内容的信息,转移的目标位置和转移指令不在同一个代码段,则称为段间转移。根据转移指令的功能,可分为无条件转移指令、条件转移指令、循环控制指令、子程序调用和返回指令4类。,45,第3章,指令系统与汇编语言程序设计,1.无条件转移指令 无条件转移指令JMP用来控制程序转移到指定的位置去执行,指令中要给出转移位置的目标地址,通常有以下5种形式:JMP SHORT opr;段内直接短转移JMP NEAR PTR opr;段内直接近转移JM
29、P WORD PTR opr;段内间接转移JMP FAR PTR opr;段间直接转移JMP DWORD PTR opr;段间间接转移,46,第3章,指令系统与汇编语言程序设计,2.条件转移指令 条件转移指令是根据上一条指令所设置的条件码来测试,被测试的内容为状态标志位。满足测试条件则转移到指令中指定的位置去执行,如果不满足条件则顺序执行下一条指令。条件转移指令根据判断的标志位不同,通常可以归纳为3类:即判断单个标志位状态、比较无符号数高低和比较带符号数大小。这3类指令在使用之前,应该有比较CMP、测试TEST、加减或逻辑运算等指令。,47,第3章,指令系统与汇编语言程序设计,3.循环控制指令
30、 将一段代码程序执行多次操作即为循环,采用循环控制指令实现。循环控制转向的目的地址是在以当前IP内容为中心的128127的范围内,指令采用CX作为计数器,每执行一次循环,CX内容减1,直到为零后循环结束。(1)循环控制指令LOOP(2)为零或相等时循环控制指令LOOPZ/LOOPE(3)不为零或不相等时循环控制指令LOOPNZ/LOOPNE,48,第3章,指令系统与汇编语言程序设计,4.子程序调用和返回指令(1)子程序调用指令 指令格式为:CALL NEAR PTR opr;段内调用 CALL FAR PTR opr;段间调用(2)子程序返回指令RET 指令格式:RET 或 RET 表达式,4
31、9,第3章,指令系统与汇编语言程序设计,3.3.6 处理器控制类指令 这类指令主要用于修改状态标志位、控制CPU的功能如使CPU暂停、等待、空操作等。,50,第3章,指令系统与汇编语言程序设计,3.4 Pentium微处理器新增指令和寻址方式3.4.1 Pentium微处理器寻址方式1.Pentium微处理器的内部寄存器和指令格式由于Pentium微处理器采用32位指令,它的内部寄存器和指令格式与16位微处理器存在不同,主要有以下几方面:(1)指令的操作数可以是8位、16位或32位;(2)根据指令的不同操作数字段可以是03个;(3)在部分不存放结果的单操作数指令中,可以采用立即数作为操作数;,
32、51,第3章,指令系统与汇编语言程序设计,(4)部分指令对操作数的数据类型不是简单地要求一致,而是要有不同的匹配关系;(5)立即数寻址方式中,操作数可以是32位的立即数,寄存器寻址方式中,操作数可以是32位通用寄存器;(6)存储器操作数寻址方式中,操作数可达32位,寻址方式既可采用16位的地址寻址方式也可采用32位的扩展地址寻址方式。(7)16位微处理器原有的4个通用数据寄存器扩展为32位,更名为EAX、EBX、ECX和EDX;(8)原有的4个用于内存寻址的通用地址寄存器同样扩展为32位,更名为ESI、EDI、EBP、ESP;,52,第3章,指令系统与汇编语言程序设计,(9)指令指针寄存器扩展
33、为32位,更名为EIP;(10)在原有的4个段寄存器基础上,增加了2个新的段寄存器FS和GS;(11)32位微处理器增加了4个系统地址寄存器;(12)标志寄存器也扩展为32位,更名为EFLAGS,除了原有的状态、控制标志外,还增加了2位;(13)新增加了5个32位的控制寄存器,命名为CR0CR4;(14)新增了8个用于调试的寄存器DR0DR7,2个用于测试的寄存器TR6TR7。,53,第3章,指令系统与汇编语言程序设计,2.Pentium微处理器的新增寻址方式 如前所述,8086微处理器有固定寻址、立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址
34、等8种寻址方式,而Pentium微处理器有11种寻址方式。与8086相比新增加的3种寻址方式分别是比例变址寻址方式、基址加比例变址寻址方式和带位移量的比例变址寻址方式。,54,第3章,指令系统与汇编语言程序设计,3.4.2 Pentium系列微处理器专用指令 Pentium系列处理器的指令集是向上兼容的,它保留了8086和80X86微处理器系列的所有指令,因此,所有早期的软件可直接在奔腾机上运行。Pentium处理器指令集中新增加了以下3条专用指令。1.比较和交换8字节数据指令CMPXCHG8B2.CPU标识指令CPUID3.读时间标记计数器指令RDTSC,55,第3章,指令系统与汇编语言程序
35、设计,3.4.3 Pentium系列微处理器控制指令Pentium处理器指令集中新增加了3条系统控制指令。1.读专用模式寄存器指令RDMSR2.写专用模式寄存器指令WRMSR3.恢复系统管理模式指令RSM,56,第3章,指令系统与汇编语言程序设计,3.5 汇编语言简述 计算机可直接识别的是机器指令,用机器指令编写的程序称为机器语言程序。由于机器指令是用二进制编码来表示的,既不直观又难以记忆,所以使得机器指令编写的程序在使用上受到了限制。为了解决机器语言使用上的不便,人们开始使用容易记忆和识别的符号指令来编写程序。汇编语言就是用与操作功能含义相应的缩写英文字符组成的符号指令作为编程用的语言。,5
36、7,第3章,指令系统与汇编语言程序设计,使用汇编语言编写的程序计算机是不能够直接地识别和执行的,必须经过“翻译”,将汇编语言程序“翻译”成机器语言程序,这个“翻译”是由汇编程序来完成的。汇编程序是系统预先提供的系统软件之一,它把源文件转换成二进制编码表示的目标文件(.OBJ),这个过程称为汇编。在汇编过程中对源程序进行语法检查(又称扫描),得到无语法错误的结果后,还要经过连接程序,使目标程序成为计算机的可执行文件(.EXE)。,58,汇编语言程序转换成为计算机可运行的程序的过程如图3-8所示。,图3-8汇编语言程序的执行过程,59,第3章,指令系统与汇编语言程序设计,3.5.1 汇编语言语句的
37、类型和格式 汇编语言源程序是由指令、伪指令及宏指令组成的。每条指令又可称为一条语句,汇编语言程序中一条完整的语句格式由以下4项内容组成:name operation operand;comment(1)名字项name:名字通常为一符号序列,表示本条语句的符号地址。名字项可用作标号和变量,作为标号表示的是符号地址,其后跟冒号“:”;作为变量表示的是一个数据,其后不跟冒号“:”。,60,第3章,指令系统与汇编语言程序设计,标号和变量具备以下3种属性:段属性:该属性定义了标号和变量的段起始地址,其值必须在一个段寄存器中。标号的段是它所出现的对应代码段,由CS指示。变量的段通常由DS或者ES指示。偏移
38、属性:该属性表示标号和变量相距段起始地址的字节数,该数是一个16位无符号数。类型属性:该属性对于标号而言,用于指出该标号是在本段内引用还是在其他段中引用。标号的类型有NEAR(段内引用)和FAR(段间引用)。对于变量,其类型属性说明变量有几个字节长度,这一属性由定义变量的伪指令确定。,61,第3章,指令系统与汇编语言程序设计,(2)操作码项operation:为操作码助记符,可以是指令、伪指令及宏指令名。汇编程序可以将指令翻译成对应的机器码;伪指令是在汇编过程中完成相应的控制操作,又称为汇编控制指令;宏指令是采用有限的一组指令来定义的代号,汇编时将展开成相应的具体操作指令。(3)操作数项ope
39、rand:为操作码提供数据及操作信息,操作数项可以是常数、变量、表达式等数据,也可以是操作数的地址或地址表达式。当有两个或两个以上的操作数时,各操作数之间要用逗号隔开。,62,第3章,指令系统与汇编语言程序设计,(4)注释项comment:为语句注释,说明所在语句行的功能,以“;”开头,是语句的非执行部分。通常,注释用来说明一段程序或几条语句的功能,一段完整的程序注释是很重要的,它可使程序思路显得更清楚,特别是在模块化程序设计中可通过注释将各模块的功能描述出来,大大增强了程序的可读性。此外,语句格式中带方括号“”的部分表示任选项,可根据需要加以选择,汇编语言要求上面的4项内容之间必须留有空格,
40、否则会被认为是错误的命令。,63,第3章,指令系统与汇编语言程序设计,汇编语言的标识符、表达式和运算符(1)标识符:如前所述,汇编语言语句格式第一个字段是它的名字项,名字可以是标号或变量,这两者又称为标识符。标号和变量可以用LABLE和EQU伪指令来定义,相同的标号或变量的定义在同一程序中只能允许出现一次。(2)表达式和运算符:表达式中的运算符充当着重要的角色。8086宏汇编有算术运算符、逻辑运算符、关系运算符、分析运算符和综合运算符共5种。,64,第3章,指令系统与汇编语言程序设计,算术运算符用于完成算术运算,加、减、乘、除运算都是整数运算,除法运算得到的是商的整数部分,求余运算是指两数整除
41、后所得到的余数。逻辑运算符对操作数进行按位操作,运算后产生一个逻辑运算值,供给指令操作数使用,不影响标志位。NOT是单操作数运算符,其它3个为双操作数运算符。关系运算符的运算对象是两个性质相同的项目,其结果只能是两种情况:关系成立或不成立。当关系成立时,运算结果为1,否则为0。分析运算符用于对存储器地址进行运算,它可以将存储器地址的段、偏移量和类型属性分离出来,返回到所在的位置作操作数使用。故又称为数值返回运算符。综合运算符用来建立和临时改变变量或标号的类型以及存储器操作数的存储单元类型,也称为属性修改运算符。,65,第3章,指令系统与汇编语言程序设计,3.5.2 汇编语言的源程序结构 一个汇
42、编语言源程序包含了以下几个结构形式:(1)汇编源程序一般应该由3个逻辑段组成,即数据段、堆栈段和代码段。数据段用来在内存中建立一个适当容量的工作区,以存放常数、变量等程序需要对其进行操作的数据;堆栈段用来在内存中建立一个适当的堆栈区,以便在中断、子程序调用时使用;代码段包括了许多以符号表示的指令,以完成程序规定的操作。(2)每个逻辑段以SEGMENT语句开始,以ENDS语句结束,整个源程序以END语句结束,每个逻辑段内有若干条语句以完成某种特定操作功能。,66,第3章,指令系统与汇编语言程序设计,(3)汇编源程序的主模块要用ASSUME伪指令告诉汇编程序,各个段地址与段寄存器之间的对应关系,以
43、便对源程序模块进行汇编时确定段中各项的偏移量;DOS的装入程序在执行时,将把CS初始化为正确的代码段地址,把SS初始化为正确的堆栈段地址,在源程序中不需要再对它们进行初始化。由于装入程序已经将DS寄存器留作它用,所以在源程序中要对DS进行初始化。(4)汇编语言源程序存放在存储器中,无论是取指令还是存取操作数,都要访问内存。所以,程序的编写必须分段进行,以满足存储器分段管理的要求。,67,第3章,指令系统与汇编语言程序设计,3.5.3 伪指令 我们前面所分析的大都是机器指令,这是CPU指令系统中提供的命令,在运行时由CPU执行,每条指令对应CPU的一种特定的操作,例如传送、加、减法等,经汇编以后
44、,每条CPU指令产生一一对应的目标代码。而伪指令是用来对相关语句进行定义和说明的,它不产生目标代码,所以又称伪操作。宏汇编程序MASM提供了约几十种伪指令,主要有数据定义、符号定义、段定义、过程定义、模块定义、结构等。,68,第3章,指令系统与汇编语言程序设计,1.数据定义伪指令 数据定义伪指令用来定义变量的类型,给变量分配存储单元。数据定义伪指令的一般格式为:变量名 伪指令 数据项;注释数据定义伪指令有以下5种形式:(1)DB(Define Byte):定义字节变量,每个数据占1个字节。(2)DW(Define Word):定义字变量,每个数据占1个字,即2个字节。(3)DD(Define
45、Double word):定义双字变量,每个数据占2个字,即4个字节。(4)DQ(Define Quadruple word):定义4字变量,每个数据占4个字,即8个字节。(5)DT(Define Ten byte):定义10字节变量,每个数据占10个字节。,69,第3章,指令系统与汇编语言程序设计,2.符号定义伪指令 符号定义伪指令主要是为程序中的表达式赋予一个符号名,或定义新的类型属性等。它为程序的编写和使用带来了许多方便。(1)EQU(等值)伪指令:将表达式的值或符号赋予EQU前面的一个名字,可以用这个名字来代替给定的表达式。需要注意的是,一个符号一经EQU伪指令赋值后,在整个程序中不允
46、许再对同一符号重新赋值。(2)(等号)伪指令:其功能与EQU伪指令基本相同,主要区别在于它可以对同一个名字重复定义。(3)LABLE(标号)伪指令:其用途是在原来标号或变量的基础上定义一个类型不同的新的标号或变量。(4)PTR(属性修改)伪指令:用于临时指定或修改操作数的类型属性。,70,第3章,指令系统与汇编语言程序设计,3.段定义伪指令 段定义伪指令可对代码段、数据段、堆栈段及附加段进行定义和赋名,并指明段的定位类型、组合类型及类别。代码段的内容主要是指令及伪指令,数据段、堆栈段及附加段主要是定义数据、分配存储单元等。有以下两种段定义伪指令:(1)SEGMENT/ENDS伪指令 格式:段名
47、 定位类型 组合类型 类别(段内语句系列)段名 ENDS,71,第3章,指令系统与汇编语言程序设计,(2)ASSUME伪指令 格式:ASSUME 段寄存器名:段名,段寄存器名:段名,ASSUME段寻址伪指令放置在代码段的开始处,可以设定多个段与段寄存器之间的对应关系,中间用逗号分开。当汇编程序汇编一个逻辑段时,可利用相应的段寄存器寻址该逻辑段中的指令或数据。,72,第3章,指令系统与汇编语言程序设计,4.过程定义伪指令 汇编语言中的子程序是以过程的形式出现的,过程的调用和返回采用CALL和RET指令来完成。过程定义伪指令的格式如下:格式:过程名 PROC NEAR/FAR(过程中的语句系列)R
48、ET(过程中的语句系列)过程名 ENDP,73,第3章,指令系统与汇编语言程序设计,5.结构定义伪指令 结构是将逻辑上相互关联的一组数据以某种形式组合在一起,形成一个整体以便进行数据处理。结构的使用需要经过结构定义、结构预置和结构引用等过程。结构采用伪指令STRUC和ENDS进行定义,把相关数据定义语句组合起来,便构成一个完整的结构。其格式如下:结构名 STRUC(数据定义语句序列)结构名 ENDS,74,第3章,指令系统与汇编语言程序设计,6.模块定义伪指令 一个较大的汇编语言源程序,按任务分配可以由多个模块组成,每个模块都是具有独立功能的逻辑单位。为了实现模块之间的连接、调用、相互访问、变
49、量传送等功能,通常使用以下几个伪指令。(1)NAME伪指令:用于给源程序汇编以后得到的目标程序指定模块名,在汇编连接时使用。(2)END伪指令:表示源程序结束,指示汇编程序停止汇编,END后面的语句可以不予理会。(3)PUBLIC伪指令:用于定义本模块中的某些符号是全局符号名,允许程序中的其它模块直接引用。(4)EXTRN伪指令:指明本模块中所用的某些符号在程序的其它模块中已经定义,且出现在其它模块的PUBLIC伪指令中。,75,第3章,指令系统与汇编语言程序设计,7.定位伪指令ORG和程序计数器$(1)ORG伪指令:ORG是起始位置设定伪指令,用来指定某条语句或某个变量的偏移地址。在程序设计
50、中,如果需要将存储单元分配在指定位置,可以使用ORG伪指令来改变位置计数器的值。(2)程序计数器$:字符“$”出现在在程序中的表达式里,它的值为程序下一个所能分配的存储单元的偏移地址,称为程序计数器。“$”用来表示位置计数器的当前值。,76,第3章,指令系统与汇编语言程序设计,3.5.4 宏指令与高级汇编技术 在汇编语言中,有的程序段需要多次重复使用,为了减少编程的工作量,可将它们定义为一条宏指令。需要时,直接在程序中将宏指令当作一条指令一样来引用。汇编程序在源程序的汇编过程中,将宏指令对应的程序段目标代码嵌入到该宏指令处。宏指令实际上也是一种伪指令,比起前面介绍的伪指令功能更强,使用更灵活,