资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章 16位和32位微处理器的指令系统及汇编语言编程,教学目的和要求,掌握16位微处理器的寻址方式、指令系统及汇编语言编程,了解32位微处理器的指令系统,并结合附录A能够掌握汇编语言编程的上机操作,教学重点,16,位微处理器的寻址方式、指令系统及汇编语言编程(完整段模式),32,位汇编语言编程(简化段模式),教学难点,微处理器的寻址方式与指令系统,汇编语言编程的基本概念和编程方法,4.0 入 门,指令的组成,操作码(OP)字段,标明计算机要执行什么操作,操作数(operand)字段,指出指令在执行过程中所需要的,操作数(值为多少 或者,放在什么地方),,,以及操作结果送到哪里,指令的一般格式,每条指令为字节的整数倍长(指令规整),操作数字段可以有零个、一个、二个或三个操作数,通常称为“一地址”,“二地址”或“三地址”指令。,操作码,操作数,。,操作数,示例1,无操作数指令(控制类指令),如:,HLT,LOCK,CLC,CLD,CLI,IRET,示例2,单操作数指令,如:,加1指令 INC AX,只需要指出加1的操作数,它是,“一地址”,指令。,双操作数指令,如:,ADD AX,BX,大多数运算型指令都是双操作数指令,对这种指令,有的机器(大中型)使用“三地址”指令:除给出参加运算的两个操作数外,还要指出运算结果的存放地址,操作指令,现代微型计算机中多采用二地址指令,两个操作数分别称为,“源操作数”,和,“目的操作数”,,指令执行后,把运算结果放到目的操作数的地址之中。,指令的操作码在机器中的表示比较简单,只要对每一种操作指定相应的二进制代码即可;而指令的操作数字段的情形就比较复杂。,编址方式,计算机中的编址设备:Register、系统主存和I/O设备,编址方式:,三个零地址空间:即对上述三种设备分别进行编址,并分别采用不同的寻址方式,很复杂,如:PC/XT,两个零地址空间:对通用寄存器R进行独立编址,主存和I/O统一编址,地址码的地址高端用于I/O地址,64K。,优点:简化了指令系统,缺点:指令执行过程复杂,编址方式,一个零地址空间:三种设备统一编址,寄存器、主存和I/O对应低地址到高地址,无零地址空间:指堆栈计算机,CACHE和BUFFER是否需要编址?,寻址方式,寻址方式的定义:,指令中如何提供操作数或操作数地址的方式。,规定如何对地址字段作出解释以找到操作数。,*程序转移时需提供转移地址,这跟提供操作数地址在方法上没有本质区别,因此也归入寻址方式的范畴,。,指令系统设计,包括操作码字段和操作数字段,一个指令系统能够提供哪些寻址方式,能否为编制程序提供方便,这是指令系统设计的关键。,需要说明的是,在不同的计算机系统中,寻址方式的名称和分类并不统一,但基本可以归结为以下几种方式或它们的变型或组合:,寻址方式,固定寻址,立即寻址(立即数寻址),寄存器寻址,直接寻址,间接寻址,变址寻址,4.1 8086微处理器的寻址方式与指令系统,4.1.1 寻址方式,一条指令包含操作码和操作数两部分,操作码指出该指令要进行的操作,操作数指出该指令需要的操作数或操作数的地址。指令根据一定的方式,找到操作数或操作数的地址,然后取出操作数进行处理。寻找操作数地址的方式称为寻址方式,表4-1 8086/8088的6种寻址方式,寻址方式,汇编格式,操作数位置,寄存器寻址,R,寄存器,寄存器间接寻址,R,内存,变址寻址,XR,内存,基址变址寻址,XBR+IR,内存,直接寻址,EA,内存,立即寻址,n,内存代码段,一、寄存器寻址,汇编格式:R(R是寄存器名),说明:寻找的操作数在寄存器R中,例【4-1】INC AX,二、寄存器间接寻址,汇编格式:R(R是寄存器名),说明:寄存器R的内容是操作数在内存的EA,先从寄存器R中取出操作数在内存的EA,再根据EA和某段寄存器生成PA寻找操作数,所以称为间接寻址。能用来作间接寻址的寄存器只能是BX、SI、DI或BP四者之一,例【4-2】MOV AX,SI,二、寄存器间接寻址(续),表4-2 寄存器间接寻址方式物理地址生成,段,段寄存器,EA,PA,数据段,DS,BX,(DS)左移4位+EA,SI,DI,附加数据段,ES,BX,(ES)左移4位+EA,SI,DI,堆栈段,SS,BP,(SS)左移4位+EA,三、变址寻址,汇编格式:XR(R是寄存器名,X表示位移量,其值是用8位或16位二进制补码表示的有符号数)。,说明:寄存器R内容和位移量X之和是操作数在内存的EA。先将寄存器R中的值和位移量X相加求出操作数在内存的EA,再根据EA和某段寄存器生成PA寻找操作数。能用来作变址寻址的寄存器只能是BX、SI、DI 或BP四者之一。,例【4-3】MOV BX,2BX,三、变址寻址(续),表4-3 变址寻址方式物理地址生成,段,段寄存器,EA,PA,数据段,DS,BX+X,(DS)左移4位+EA,SI+X,DI+X,附加数据段,ES,BX+X,(ES)左移4位+EA,SI+X,DI+X,堆栈段,SS,BP+X,(SS)左移4位+EA,四、基址变址寻址,汇编格式:XBR+IR或XBRIR(BR为基址寄存器,IR为变址寄存器,X表示位移量,其值是用8位或16位二进制补码表示的有符号数),说明:基址寄存器BR、变址寄存器IR的内容和位移量X三者之和是操作数在内存的EA。先将寄存器BR、IR中的值和位移量X相加求出操作数在内存的EA,再根据EA和某段寄存器生成PA寻找操作数。基址寄存器只能用BX或BP,变址寄存器只能用SI或DI,四、基址变址寻址(续),表4-3基址变址寻址方式物理地址生成,段,段寄存器,EA,PA,数据段,DS,BX+SI+X,(DS)左移4位+EA,BX+DI+X,附加数据段,ES,BX+SI+X,(ES)左移4位+EA,BX+DI+X,堆栈段,SS,BP+SI+X,(SS)左移4位+EA,BP+DI+X,五、立即寻址,汇编格式:n(n是一个常数,称为立即数),说明:指令操作码后面单元的内容为操作数(常数n),操作数在内存代码段。立即寻址所提供的操作数直接放在指令中,它是紧跟在指令操作码后面的一个可用8位或16位二进制补码表示的有符号数。立即寻址主要用来给寄存器或内存单元赋初值,例【4-6】MOV AX,2是将立即数2送到AX中,六、直接寻址,汇编格式:含有变量的地址表达式或段寄存器:EA,说明:在一条指令中直接给出某一内存单元的EA,这个EA经过汇编后放在这条指令的下一个字单元。,例【4-7】MOV AX,2000是将数据段中EA为2000的内存单元中的内容送到AX中。,4.1.3,8086指令系统,一、数据传送指令,表4-6数据传送指令,类别,操作码,格式,一般数据传送指令,MOV,MOV OPD,OPS,XCHG,XCHG OPD,OPS,XLAT,XLAT OPS或XLAT,4.1.3,8086指令系统,一、数据传送指令(续1),表4-6数据传送指令,类别,操作码,格式,堆栈操作指令,PUSH,PUSH OPS,POP,POP OPD,4.1.3,8086指令系统,一、数据传送指令(续2),表4-6数据传送指令,类别,操作码,格式,标志寄存器传送指令,PUSHF,PUSHF,POPF,POPF,LAHF,LAHF,SAHF,SAHF,4.1.3,8086指令系统,一、数据传送指令(续3),表4-6数据传送指令,类别,操作码,格式,地址传送指令,LEA,LEA OPD,OPS,LDS,LDS OPD,OPS,LES,LES OPD,OPS,输入输出指令,IN,IN OPD,OPS,OUT,OUT OPD,OPS,4.1.3,8086指令系统,二、算术运算指令,表4-7 算术运算指令,类别,操作码,格式,加法指令,ADD,ADD OPD,OPS,ADC,ADC OPD,OPS,INC,INC OPD,4.1.3,8086指令系统,二、算术运算指令(续1),表4-7 算术运算指令,类别,操作码,格式,减法指令,SUB,SUB OPD,OPS,SBB,SBB OPD,OPS,DEC,DEC OPD,NEG,NEG OPD,CMP,CMP OPD,OPS,4.1.3,8086指令系统,二、算术运算指令(续2),表4-7 算术运算指令,类别,操作码,格式,乘法指令,MUL,MUL OPS,IMUL,IMUL OPS,除法指令,DIV,DIV OPS,IDIV,IDIV OPS,4.1.3,8086指令系统,三、位操作指令,表4-8 位操作指令,类别,操作码,格式,逻辑运算指令,NOT,NOT OPD,AND,AND OPD,OPS,TEST,TEST OPD,OPS,OR,OR OPD,OPS,XOR,XOR OPD,OPS,4.1.3,8086指令系统,三、位操作指令(续1),表4-8 位操作指令,类别,操作码,格式,算术移位指令,SAL,SAL OPD,1或SAL OPD,CL,SAR,SAR OPD,1或SAR OPD,CL,逻辑移位指令,SHL,SHL OPD,1或SHL OPD,CL,SHR,SHR OPD,1或SHR OPD,CL,4.1.3,8086指令系统,三、位操作指令(续2),表4-8 位操作指令,类别,操作码,格式,不带进位的循环移位指令,ROL,ROL OPD,1或ROL OPD,CL,ROR,ROR OPD,1或ROROPD,CL,带进位的循环移位指令,RCL,RCL OPD,1或RCL OPD,CL,RCR,RCR OPD,1或RCR OPD,CL,4.1.3,8086指令系统,四、转移指令,转移指令分条件转移指令和无条件转移指令两大类,其特点是改变程序的执行顺序(即改变指令指针IP的值),但不改变状态标志位的状态。条件转移指令根据条件标志的状态判断是否转移。无条件转移指令则不作任何判断,无条件地转移到指令中指明的目的地址处执行。转移指令共有19条,具体见表4-9,4.1.3,8086指令系统,四、转移指令,表4-9 转移指令,类别,指令名称,操作码,转移条件,简单条件转移,相等/等于0转,JE/JZ,ZF=1,不相等/不等于0转,JNE/JNZ,ZF=0,为负转,JS,SF=1,为正转,JNS,SF=0,溢出转,JO,OF=1,未溢出转,JNO,OF=0,4.1.3,8086指令系统,四、转移指令(续1),表4-9 转移指令,类别,指令名称,操作码,转移条件,简单条件转移,进位位为1转,JC,CF=1,进位位为0转,JNC,CF=0,偶转移,JP/JPE,PF=1,奇转移,JNP/JPO,PF=0,4.1.3,8086指令系统,四、转移指令(续2),表4-9 转移指令,类别,指令名称,操作码,转移条件,无符号数条件转移,高于转移,JA/JNBE,CF=0且ZF=0,高于或等于转移,JAE/JNB,CF=0或ZF=1,低于转移,JB/JNAE,CF=1且ZF=0,低于或等于转移,JBE/JNA,CF=1或ZF=1,4.1.3,8086指令系统,四、转移指令(续3),表4-9 转移指令,类别,指令名称,操作码,转移条件,带符号数条件转移,大于转移,JG/JNLE,SF=OF且ZF=0,大于或等于转移,JGE/JNL,SF=OF且ZF=1,小于转移,JL/JNGE,SFOF且ZF=0,小于或等于转移,JLE/JNG,SFOF且ZF=1,4.1.3,8086指令系统,四、转移指令(续4),表4-9 转移指令,类别,操作码,转移条件,无条件转移,JMP,无,4.1.3,8086指令系统,五、字符串操作指令,为了方便地实现字符串操作,8086/8088提供了字符串操作指令。只要按规定设置好初始条件,选用正确的字符串操作指令,就可完成规定的操作,这些指令的前面可加重复前缀,能在条件满足的情况下反复执行,而不用考虑指针如何移动、循环次数如何控制等问题,从而简化了程序设计。字符串操作指令在使用格式和使用方法上有许多类似的地方,它们隐含使用的寄存器、标志位和符号见表4-10,4.1.3,8086指令系统,五、字符串操作指令(续1),表4-10 字符串操作指令使用中的一些隐含约定,源串指示器,DS:SI,目的串指示器,ES:DI,重复次数计数器,CX,SCAS指令的搜索值,在AL/AX中,LODS指令的目的地址,AL/AX,4.1.3,8086指令系统,五、字符串操作指令(续2),表4-10 字符串操作指令使用中的一些隐含约定,STOS指令的源地址,AL/AX,传送方向,DF=0,SI、DI自动增量(用CLD指令实现),DF=1,SI、DI自动减量(用STD指令实现),SB,不带操作数的字节操作指令,SW,不带操作数的字操作指令,4.1.3,8086指令系统,五、字符串操作指令(续3),系统规定:源串一定要在当前数据段中,目的串只允许在当前附加数据段中。所有的串操作指令均以寄存器间接方式访问源串或目的串中的各元素,并自动修改SI和DI的内容。若DF=0,则每次操作后,SI、DI自动增量(字节操作加1、字操作加2);若DF=1,则每次操作后,SI、DI自动减量(字节操作减1、字操作减2),使之指向下一个元素,4.1.3,8086指令系统,五、字符串操作指令(续4),当指令带有重复前缀时,则指令重复执行,每执行一次,就检查一次重复条件是否成立,如成立,则继续重复;否则终止重复,执行后续指令,REP:重复,即无条件重复CX寄存器中指定的次数,REPE/REPZ:相等/为0时重复,即(CX)0(重复次数还未为0)同时ZF=1(比较时相等)时重复,否则,重复终止。,REPNE/REPNZ:不相等/不为0时重复,即(CX)0(重复次数还未为0)同时ZF=0时重复,否则,重复终止,4.1.3,8086指令系统,五、字符串操作指令(续5),表4-11字符串操作指令,类别,操作码,格式,字符串传送,MOVS,MOVS OPD,OPS,MOVSB,MOVSB,OVSW,MOVSW,4.1.3,8086指令系统,五、字符串操作指令(续6),表4-11字符串操作指令,类别,操作码,格式,字符串比较,CMPS,CMPS OPD,OPS,CMPSB,CMPSB,CMPSW,CMPSW,4.1.3,8086指令系统,五、字符串操作指令(续7),表4-11字符串操作指令,类别,操作码,格式,字符串搜索,SCAS,SCAS OPD,SCASB,SCASB,SCASW,SCASW,4.1.3,8086指令系统,五、字符串操作指令(续8),表4-11字符串操作指令,类别,操作码,格式,字符串装入,LODS,LODS OPS,LODSB,LODSB,LODSW,LODSW,4.1.3,8086指令系统,五、字符串操作指令(续9),表4-11字符串操作指令,类别,操作码,格式,字符串存储,STOS,STOS OPD,STOSB,STOSB,STOSW,STOSW,4.1.3,8086指令系统,五、字符串操作指令(续10),表4-11字符串操作指令,类别,操作码,功能,重复前缀,REP,用于字符串传送和字符串装入指令前,REPE/REPZ,用于字符串比较指令、字符串搜索指令前,REPNE/REPNZ,用于字符串比较指令、字符串搜索指令前,4.1.3,8086指令系统,六、处理机控制指令,表4-12处理机控制指令-标志位控制指令,格式,功能,STC,置进位标志,1CF,CLC,清除进位标志,0CF,CMC,进位标志取反,CF求反CF,STD,置方向标志,1DF,CLD,清除方向标志,0DF,4.1.3,8086指令系统,六、处理机控制指令(续1),表4-12处理机控制指令-标志位控制指令(,续1,),格式,功能,STI,置中断标志,1IF,CLI,清除中断标志,0IF,4.1.3,8086指令系统,六、处理机控制指令(续2),表4-12处理机控制指令,CPU状态控制指令,格式,功能,HLT,处理器暂停,ESC OPD,OPS,交权指令,将浮点指令交给浮点处理器执行,WAIT,等待指令,8086进入等待状态,LOCK,使CPU在执行该指令期间封锁总线,禁止其他的总线主设备占用总线,NOP,空操作,4.2,16位汇编语言编程,4.2.1 伪指令,在汇编源程序中使用一些固定格式的约定符号,这些符号主要用来告诉汇编程序如何工作,这就是汇编控制命令,也称伪指令。伪指令和机器指令(在4.1.3中所讲的指令)最大的区别有2点,伪指令是在汇编源程序汇编期间,被汇编程序识别并解释。主要是为变量申请内存空间、建立堆栈、告诉汇编程序从何处开始汇编以及到何处结束等。而可执行指令是在程序执行期间被CPU译码并执行的,4.2.1 伪指令,汇编结束后伪指令就完成任务,在程序执行期间不再考虑它,因此伪指令不翻译成目标码。而可执行指令经汇编程序汇编后,变成机器可以识别并执行的目标码,一、数据定义伪指令,数据定义伪指令见表4-13,格式:变量名 数据定义伪指令 表达式,,功能:定义数据存储区,其类型由所使用的数据定义伪指令指定,4.2.1 伪指令,表4-13 数据定义伪指令,伪指令,所申请的字节数,DB,1,DW,2,DD,4,DF,6,DQ,8,DT,10,4.2.1 伪指令,二、符号定义伪指令,等价伪指令,格式,:,符号名 EQU 表达式,功能:用来为常量、表达式及其他各种符号定义一个等价的符号名,但它并不申请分配存储单元。,如果一个常量在程序中使用非常频繁可以用一个符号来表示它,这就是符号常量。如假定学生成绩处理程序中经常使用某班的人数用等价伪指令定义为:N EQU 40。指令MOV AX,N在汇编时用40代替N变成MOV AX,40,4.2.1 伪指令,等号伪指令,格式:符号名=表达式,功能:该语句的功能和EQU相似,不同的是等号伪指令能对所定义的符号名再重新定义,当使用等号语句连续定义同一符号名时,以最后一次定义的值为准,4.2.1 伪指令,三、段定义伪指令,格式:,段名 SEGMENT 定位方式组合方式 类别,段名 ENDS,功能:定义了一个以SEGMENT伪指令开始,以ENDS伪指令结束,以段名命名的存储段,4.2.1 伪指令,说明:,段名是程序员为该段所起的名字,用来指出为该段分配的存储区起始位置。一个程序模块可以定义为若干段,段名可以各不相同,也可以重复,汇编程序将一个程序中的同名段处理成一个段。段的定义可以嵌套,但不能交叉。定位方式、组合方式和类别是可选项,可省略。数据段(或附加数据段)中一般定义常量和变量,是为程序的代码段提供数据和保存计算结果的。它的一般格式如下:,DATA SEGMENT,常量或变量定义,DATA ENDS,4.2.1 伪指令,堆栈段为程序定义堆栈,堆栈的大小依赖于你所编写的程序对堆栈的使用程度。如果你省略堆栈段定义,当你的程序使用堆栈时,系统会自动建立堆栈。并且在汇编时会出现一个警告:“LINK:warning L4021:no stack segment”。对于一般的小程序可省略堆栈段定义,堆栈段的一般格式如下:,STACK SEGMENT STACK,DB n DUP(0),STACK ENDS,其中n是堆栈的长度,由程序员根据需要自定,4.2.1 伪指令,代码段是程序对数据进行处理的部分。在一个程序中,数据段、堆栈段和附加数据段都可以省略,代码段不能省略,代码段的一般格式如下:,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,SS:STACK,ES:EDATA,假定伪指令,START:,可执行语句,MOV AH,4CH,INT 21H,CODE ENDS,END START,程序结束伪指令,五、置汇编地址计数器伪指令ORG,汇编地址计数器用符号“$”表示,它用来记录正在被汇编程序汇编的语句地址,也就是说其内容标出了汇编程序当前的工作位置。在一个源程序中,往往包含了多个段,汇编程序在将该源程序汇编成目标程序时,每遇到一个新段,就为该段分配一个初值为0的汇编地址计数器,然后,再对该段中的语句汇编。在汇编过程中,对凡是需要申请分配存储单元的语句和产生目标代码的语句,汇编地址计数器则按该语句目标代码的长度增值。因此,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。汇编地址计数器符号“$”可出现在表达式中,4.2.1 伪指令,汇编地址计数器的值可以用伪指令ORG进行设置。,格式:ORG 数值表达式,功能:将汇编地址计数器设置成数值表达式的值。其中,数值表达式的值应为非负的整数,其值在065535之间,例【4-15】汇编地址计数器和伪指令ORG举例,DATA SEGMENT,ORG 4,BUF DB readme,ORG$+5,NUM DB-2,DATA ENDS,4.2.2 汇编语言中的常量、变量及标号,一、常量,常量是指在程序执行期间不变的量。在8086/8088宏汇编语言中可使用的常量见表4-14。常量主要用于伪指令中给变量赋初值,或者用作机器指令语句中的立即操作数、变址寻址和基址变址寻址中的位移量。常量一般可以直接以数值形式出现在汇编语句中,这种常量称数值常量。但对经常使用的数值常量,可以事先为它定义一个名字,然后在语句中用名字来表示该常量,这种常量称符号常量。伪指令EQU和等号“=”可用来实现将数值常量定义成符号常量,4.2.2 汇编语言中的常量、变量及标号,表4-14 8086/8088宏汇编语言中所使用的常量,常量分类,格式,X的取值,举例,二进制常量,XXXB,0或1,01000001B,八进制常量,XXXO,XXXQ,07,1234Q,十进制常量,XXX,XXXD,09,123,123D,十六进制常量,XXXH,09 AF,1234H,0A12FH,字符常量,XXX,XXX,ASCII字符,0123,readme,4.2.2 汇编语言中的常量、变量及标号,二、变量,在汇编语言中,变量是一个数据单元的名字,即数据存放地址的符号表示。它有3个属性:,变量的段属性。指变量所在段的首地址,当需要访问该变量时,它所在段的首地址一定要在某一段寄存器中,变量的偏移属性。指变量所在段的首地址到变量所在的存储单元之间的距离,用字节数表示。它表示变量在某段的相对位置,也就是我们所说的偏移地址(或有效地址)EA,变量的类型。指存取某变量所需要的字节数,变量的定义格式如下:,变量名 数据定义伪指令 表达式,,汇编语言中的符号常量名、变量名、段名、过程名、标号都称为标识符。标识符是由字母、数字(09)、特殊字符(?、.、_、$)等组成的字符串,但该字符串不能以数字或下划线_作为开始字符。标识符最大长度不能超过31个字符,并且汇编语言对字母的大写和小写没有统一要求,也就是说,汇编语言对标识符中字母的大写和小写不作区分,如ABC、aBc、Abc和aBC都认为是同一个标识符。注意不能使用汇编语言的保留字如算术运算指令名ADD、SUB等做标识符,:,数值表达式,ASCII字符串(只有用DB定义变量时,才允许字符串长度超过2个字符),地址表达式。如果该地址表达式为一变量(或标号)名,用DW伪指令是取它的偏移地址来初始化变量,用DD伪指令是取它的段首址和偏移地址来初始化变量,表达式的几种方式,?(表示所定义的变量初值不确定),重复子句 格式:n DUP(表达式),其中,n是重复因子,只能取正整数,它表示定义了n个存储单元,其类型由它前面的数据定义伪指令确定。而每个存储单元中的初值由DUP后面圆括号中的表达式给定,如果是“?”,则表示变量的初值不确定,可以是以上表达式组成的序列,各表达式之间用逗号隔开,例【4-16】有下面的数据段,画出其内存分配图,DATA SEGMENT,TABLE DB 1,2,3,2 DUP(6,-2),COUNTER EQU$-TABLE,VARY DW 1234H,CHAR DB 123,3 DUP(1),POINTER1 DW VARY,POINTER2 DD CHAR,DATA ENDS,标号是机器指令语句存放地址的符号表示,也可以是过程名。过程名实际上是过程入口地址的符号表示,即过程第一条机器指令语句的存放地址,标号的用法有两种:,在代码段某一指令的前面,是当前一条指令语句地址的符号表示,用来提供一个转移地址,让其他的指令向此指令转移,一般的机器指令语句前不需要标号,用来表示过程入口地址,三、标号,4.2.3 汇编语言中的运算符号和表达式,数值表达式是利用算术、逻辑、移位或关系运算符将常量连结在一起构成的表达式,它的运算结果是一个数值,算术运算符共有+、-、*、/、MOD 5个,其中*、/、MOD优先级相同,+、-优先级相同,并且*、/、MOD优先级高于+、-。可利用括号改变一个表达式某一部分的优先级。MOD是取余数,如7 MOD 3的值是1,逻辑运算符有AND、OR、XOR、NOT 4个,分别是逻辑与、逻辑或、逻辑异或、逻辑非。逻辑运算是按位进行的,所以运算的结果仍是整数常量,一、数值表达式,移位运算符有左移SHL和右移SHR 2个运算符。SHL表示将常量左移运算符右边常量规定的次数,SHR表示将常量右移运算符右边常量规定的次数,所空的位补0,关系运算符有EQ、NE、GT、LT、GE、LE共6个运算符,分别是等于、不等于、大于、小于、大于或等于、小于或等于。关系运算的结果是两个特殊的量,若关系不成立,则结果为0;否则为0FFFFH,地址表达式的值是段内偏移地址,它具有段、偏移地址及类型三个属性。地址表达式是由变量、常量、标号、寄存器和运算符组成的有意义的式子,地址表达式除可使用数值表达式的运算符外,还可根据需要使用一些特殊运算符,二、地址表达式,用来指明某个变量、标号或地址表达式的类型属性,或者使它临时兼有与原定义所不同的类型属性,但保持它们原来的段属性和偏移地址属性不变。其格式是:,类型 PTR 地址表达式,根据地址表达式的不同值,类型可以是BYTE、WORD、DWORD、NEAR、FAR,1类型运算符PTR,为了将源程序中的指令正确地翻译成目标代码,汇编程序要求每个语句中操作数的类型要明确,如果是双操作数指令,还要求源操作数和目的操作数类型一致,既同时为字节类型或同时为字类型。下面分4种情况说明:,对于单操作数指令,操作数的类型必须明确,对于双操作数指令,只要有一个操作数类型明确就可以了,如果两个操作数类型都明确,则它们的类型必须一致,如果两个操作数类型都不明确,就要用PTR来指定类型了,跨段前缀“:”用于临时给变量、标号或地址表达式指定一个段属性,且只能在所出现的语句中有效,它并不改变地址表达式的偏移地址和类型属性,它的格式是:,段寄存器名:地址表达式,段名:地址表达式,MOV AX,SI等价于MOV AX,DS:SI,默认从数据段中取数据。若改为MOV AX,ES:SI,则从附加数据段中取数据,2跨段前缀“:”,属性分离运算符可分离出变量、标号的段、偏移地址及类型的属性值。其格式是:分离运算符 变量或标号,运算结果是一个数值常量,3.属性分离运算符,段属性分离运算符,SEG,。该运算符分离出其后变量或标号所在段的首地址,偏移属性分离运算符,OFFSET,。该运算符分离出其后变量或标号的偏移地址,类型分离运算符,TYPE,该运算符取其后变量或标号的类型。如果是变量,其类型值由变量的类型确定,某一变量类型的类型值和该变量在内存中所占的字节数相同,取变量所含的数据存储单元个数运算符,LENGTH,,,格式:LENGTH 变量,。它的取值根据定义该变量时,数据定义伪指令后面第一个表达式的形式而定,如果第一个表达式为重复子句“n DUP(表达式)”,则取值为前面的重复因子n,如果为其他形式的表达式,则取值为1,取变量所含的数据存储区大小运算符,SIZE,,,格式:SIZE 变量,。它的取值为:,LENGTH变量*TYPE 变量,,也就是说,它的取值是一个变量所占内存的实际字节数,4.其他运算符,字节分离运算符HIGH和LOW,格式:HIGH 常量或地址表达式;LOW 常量或地址表达式,其中,HIGH分离出其后常量或地址表达式的高8位,LOW分离出其后常量或地址表达式的低8位。,汇编语言中的常用的运算符的优先级见表4-17。,4.2.4 顺序与分支程序的设计,顺序型结构程序的特征是在程序的指令中无转移指令,计算机从程序的第一条指令开始顺序执行,直到程序的最后一条指令为止,例【4-29】在一个表中存放着0到9十个数字的立方值,编程从键盘输入0到9之间的任意一个数,查表找出这个数的立方值,4.2.4 顺序与分支程序的设计,有分支控制的程序结构称为分支型结构(或称选择结构)。分支型结构可分为二分支型结构和多分支型结构。在分支程序中,不同的条件往往是通过标志寄存器中条件标志的不同状态反映的。因此分支程序设计中一个至关重要的问题是根据各标志的不同状态选用合适的转移指令。转移指令分条件转移指令和无条件转移指令两大类,一、条件转移,语句格式:标号:操作符 短标号,功能:如果条件满足,则(IP)+位移量IP,4.2.4 顺序与分支程序的设计,在转移指令中,位移量为当前(IP)到转移目的地址处的字节距离。如果当前(IP)到某标号(即转移的目的地址)的位移量在-128127之间,则该标号称为短标号。当位移量为正时,表示向前转;当位移量为负时,表示向后转,条件转移指令的目的地址均是短标号,条件转移指令共有18条,分成以下三类,1简单条件转移指令,共有10条,根据单个标志的状态决定是否转移,2.无符号数条件转移指令,共有4条,根据多个标志的状态决定是否转移,这类指令将比较对象视为无符号数,3.带符号数条件转移指令,共有4条,根据多个标志的状态决定是否转移,这类指令将比较对象视为带符号数,4.2.4 顺序与分支程序的设计,二、无条件转移,无条件转移指令使CPU无条件地转移到指令中指明的目的地址处执行,在程序中用它将各分支的出口重新汇集到一起构成多分支结构,特别是当条件转移指令的转移范围超过-128127个字节时,往往要借助无条件转移指令实现,4.2.4 顺序与分支程序的设计,无条件转移指令和要转移的目的地址可以在同一段,也可以在另一段。前者称为段内转移,后者称为段间转移。段内转移指令只改变指令指针IP的内容,而段间转移指令则要同时改变指令指针IP和代码段寄存器的内容。无条件转移指令可通过各种寻址方式得到要转移的目的地址,常用的有直接寻址和间接寻址两种,表4-18列出了无条件转移指令的格式和功能说明,无条件转移指令和条件转移指令有两点重要区别:一是前者的转移是无条件的,不做任何判断便转向目的单元;二是前者的转移范围不受限制,而后者只能在-128127个字节范围内转移,4.2.4 顺序与分支程序的设计,例【4-30】编程实现符号函数,4.2.4 顺序与分支程序的设计,对于多路分支的程序,如果直接用条件转移指令实现,那么N路分支,就需要N-1条条件转移指令,程序显得冗长繁琐,可用跳转表来实现多路分支,例【4-31】对学生的成绩分类,分类标准见表4-19。下面的程序是由入口地址组成跳转表的多路分支程序,4.2.5 循环程序设计,循环型结构有REPEAT-UNTIL模式(见图4-8)和WHILE模式(见图4-9)。,4.2.5 循环程序设计,REPEAT-UNTIL和WHILE两种模式的共同点是都有初始化部分、工作部分、调整部分和控制部分。这四部分的作用是:,初始化部分,又称循环的预置部分。在循环体工作之前,把工作变量(保存中间结果或最后结果)、控制变量(控制循环是否结束)、地址单元、工作寄存器等置初值,为循环做好准备,初始化工作可保征循环程序在正确的初始状态下工作,工作部分,这是整个循环程序的核心部分,它由需要重复操作的指令序列组成,工作部分随求解问题所采用的算法不同而异,调整部分,为了保证工作部分每次在新的意义下工作,每执行一次工作部分,必须对操作数或操作数地址进行修改,为下一次循环作准备,同时控制变量也作相应的调整,为控制部分的条件判定作准备。例如利用计数来控制的循环,每循环一次,计数值都要调整(增加或减少),控制部分根据计数器的值来决定是否退出循环。通常的循环结构是调整和工作部分同步工作,工作部分和调整部分合在一起,统称为循环体。,控制部分:为了能在正确的时机退出循环,要有出口测试,控制部分是用来控制循环程序是继续执行还是终止。控制部分是对修改过的控制变量进行测试,若达到预定要求,则循环结束,否则循环继续执行。控制部分根据实际情况可分为计数控制(又分为正计数和倒计数)和条件控制两种,4.2.5 循环程序设计,REPEAT-UNTIL和WHILE两种模式的区别是,REPEAT-UNTIL模式是先执行循环体,再判断条件是否成立,因此对于REPEAT-UNTIL模式不管条件是否成立循环体至少执行一次;WHILE模式是先判断条件是否成立再执行循环体,因此对于WHILE模式循环体可能一次也得不到执行,4.2.5 循环程序设计,例【4-32】已知有N个数据存放在以BUF为首地址的字节存储区中,编程统计其中负数的个数。,在本例中,用到了三个寄存器,这三个寄存器的功能分别是:,AX:累加器,用来累加BUF中负数的个数,初值为0,BX:地址寄存器,用来指示BUF的地址,初值为BUF的首地址,CX:计数器,用计数方式控制循环何时结束,初值为BUF的长度N,4.2.5 循环程序设计,如何控制循环是循环程序设计中的一个重要环节,下面介绍最常见的两种循环控制方法:计数控制和条件控制,一、计数控制,当循环次数已知时,通常使用计数控制,计数控制又有正计数和倒计数两种形式,倒计数,先将循环次数N送入循环计数器中,每循环1次,计数器减1,直到循环计数器中的内容为0时结束循环,下面以例【4-32】的代码段为例说明这个问题。,LEA BX,BUF,MOV CX,N;,初始化部分,MOV AX,0,CYCLE:CMP BYTE PTRBX,0,JGE NEXT;,工作部分,INC AX,NEXT:INC BX,DEC CX;,修改部分,JNZ CYCLE ;,控制部分,4.2.5 循环程序设计,正计数,先将0送入循环计数器中,每循环1次,计数器加1,直到循环计数器中的内容与循环次数N相等时结束循环,下面将例【4-32】的代码段改写为用CX进行正计数来说明这个问题,LEA BX,BUF,MOV CX,0,;,初始化部分,MOV AX,0,CYCLE:CMP BYTE PTRBX,0,JGE NEXT,;,工作部分,INC AX,NEXT:INC BX,INC CX,;,修改部分,CMP CX,N,;,控制部分,JNZ CYCLE,4.2.5 循环程序设计,二、条件控制,有些情况下,循环次数无法事先确定,但它与问题中的某些条件有关,这些条件可以通过指令来测试,如果测试的结果满足循环条件,则继续循环,否则结束循环,例【4-33】编程统计AX中1的个数。,【分析】,每次判断AX的最低位,如果最低位为1则BL加1;否则BL不加1。然后AX逻辑右移1位,左边补0,在某一时刻AX必然为0。因此,可以将AX是否为0作为条件控制循环,4.2.6 子程序设计,子程序设计是使程序模块化的一种重要手段。当设计一个比较复杂的程序时,将程序划分为若干个相对独立的模块,确定各模块的入口及出口参数,为各模块分配不同的名字,对每一个模块编制独立的程序段(即子程序),最后将这些子程序根据调用关系连成一个整体。这样既便于分工合作,又可避免重复劳动,节省存储空间,提高程序设计的效率和质量,使程序简洁、清晰、易读,便于修改和扩充,4.2.6 子程序设计,一、定义子程序,子程序的定义格式是:,子程序名 PROC NEAR/FAR,子程序名 ENDP,子程序也称为过程,PROC、ENDP是定义子程序时必须使用的保留字,PROC和ENDP相当于一对括号,将子程序的指令包括在内。如果主程序和子程序位于同一代码段,则称为段内调用,此时在PROC后可加NEAR说明此子程序是近过程。如果主程序和子程序不在同一代码段,则称为段间调用
展开阅读全文