1、第二章 指令系统及汇编语言程序设计,2.1 8086/8088寻址方式 80868088的操作数可位于寄存器、存储器或IO端口中。对位于存储器的操作数可采用多种不同方式进行寻址。80868088不仅包含80808085的寻址方式,而且还有许多扩展。下面对80868088的寻址方式给予简要介绍.(一) 固定寻址有些单字节指令其操作是规定CPU对某个固定的寄存器进行的,如加法的ASCII调整指令AAA,规定被调整的数总是位于AL中。(二) 立即数寻址操作数就在指令中,当执行指令时,CPU直接从指令队列中取得该立即数,而不必执行总线周期。立即数可以是8位,也可以是16位;并规定只能是整数类型的源操作
2、数。这种寻址主要用来给寄存器赋初值,指令执行速度快。,(三)寄存器寻址操作数就放在CPU的寄存器(如AX、BX、CX和DX等)中,而寄存器名在指令中指出。这种寻址的指令长度短,操作数就在CPU内部进行,不需要使用总线周期,所以,执行速度也快。 例如 INC reg 它将指令的寄存器的内容加1。,对16位操作数来说,寄存器可以为8个16位通用寄存器,而对8位操作数来说,寄存器只能为AH、AL、BH、BL、CH、CL、DH、DL。在一条指令中,源操作数或/和目的操作数都可以采用寄存器寻址方式。,(四) 存储器寻址指令系统中采用的复杂的“寻址方式”主要是针对存储器操作数而言。CPU寻找存储器操作数,
3、必须经总线控制逻辑电路进行存取。当执行单元EU需要读/写位于存储器的操作数时,应根据指令的B2字节给出的寻址方式,由EU先计算出操作数地址的偏移量(即有效地址EA),并将它送给总线接口单元BIU,同时请求BIU执行一个总线周期,BIU将某个段寄存器的内容左移4位,加上由EU送来的偏移量形成一个20位的实际地址(即物理地址),然后执行总线周期,读/写指令所需的操作数。8086/8088 CPU所寻址的操作数地址的偏移量即有效地址EA,它是一个不带符号的16位地址码,表示操作数所在段的首地址与操作数地址之间的字节距离。所以,它实际上是一个相对地址。EA的值由汇编程序根据指令所采用的寻址方式自动计算
4、得出。计算EA的通式为:,EA=基址值 +变址值 +位移量,BXBP,SIDI,8016,1.直接寻址方式 直接寻址方式最简单、最直观,其含义是指令中以位移量方式直接给出操作数的有效地址EA,即EA=DISP。这种寻址方式的指令执行速度快,主要用于存取位于存储器中的简单变量。 采用直接寻址方式时,MOD和R/M字段必须分别为00和110,由DISP-L和DISP-H直接给出操作数的有效地址。 所以,在直接寻址方式时,指令中的位移量即有效地址。例如: MOV AX,1680H;将1680H和1681H两单元的字内容取入AX中,OP,MOD,REG,R/M,DISP-L,DISP-H,00,110
5、,EA,31,24,23,22,21,19,18,16,15,8,7,0,2.间接寻址方式 间接寻址方式是指寄存器间接寻址方式,其操作数一定在存储器中,而存储单元的有效地址EA则由寄存器指出,这些寄存器是基址寄存器BX、基址指针寄存器BP、变址寄存器SI和DI之一或它们的某种组合。具体使用哪个寄存器或哪种组合,由指令中的MOD(11)和R/M字段配合来确定。书写指令时,这些寄存器带有方括号 。(1) 基址寻址方式 基址寻址是指操作数的有效地址由基址寄存器(BX或BP)的内容和指令中给出的地址位移量(0位、8位或16位)之和来确定。 有效地址EA的具体计算方法取决于指令中MOD(11)和R/M字
6、段的不同取值。,(2)变址寻址方式变址寻址是指操作数的有效地址由变址寄存器(SI或DI)的内容与指令中给出的地址位移量(0位、8位或16位)之和来确定。有效地址EA的具体计算方法取决于指令中MOD(11)和R/M字段的不同取值。,(3)基址加变址寻址方式基址加变址寻址是指操作数的有效地址EA由基址寄存器(BX或BP)的内容与变址寄存器(SI或DI)的内容以及指令中的地址位移量(0位、8位或16位)三者之和来确定。 有效地址EA的具体计算方法取决于指令中MOD(11)和R/M字段的不同取值,见图3.15。注意,由于指令中的位移量也可以看成是一个相对值,因此,有时又把带位移量的寄存器间接寻址叫做寄
7、存器相对间接寻址。,(五)其他寻址方式1.串操作指令寻址方式 数据串(或称字符串)指令不能使用正常的存储器寻址方式来存取数据串指令中使用的操作数。执行数据串指令时,源串操作数第1个字节或字的有效地址应存放在源变址寄存器SI中(不允许修改),目标串操作数第1个字节或字的有效地址应存放在目标变址寄存器DI中(不允许修改)。在重复串操作时,8086/8088能自动修改SI和DI的内容,以使它们能指向后面的字节或字。因指令中不必给出SI或DI的编码,故串操作指令采用的是隐含寻址方式。,2.I/O端口寻址方式 在8086/8088指令系统中,输入/输出指令对I/O端口的寻址可采用直接或间接两种方式。 (
8、1) 直接端口寻址: I/O端口地址以8位立即数方式在指令中直接给出。例如IN AL,n。所寻址的端口号只能在0255范围内。 (2) 间接端口寻址: 这类似于寄存器间接寻址,16位的I/O端口地址在DX寄存器中,即通过DX间接寻址,故可寻址的端口号为065535。例如OUT DX,AL。它是将AL的内容输出到由(DX)指出的端口中去。,3.转移类指令的寻址方式 在8086/8088系统中,由于存储器采用分段结构,所以转移类指令有段内转移和段间转移之分。所有的条件转移指令只允许实现段内转移,而且是段内短转移,即只允许转移的地址范围在-128+127字节内,由指令中直接给出8位地址位移量。,2.
9、2 80868088指令系统,一、80868088指令系统的特点8086与8088的指令系统由8位的80808085指令系统扩展而来的,同时又能在其后续的80x86系列的CPU上正确运行。其主要特点是: (1) 采用可变长指令,指令格式比较复杂。(2) 寻址方式多样灵活,处理数据的能力比较强,可处理字 节或字、带符号或无符号的二进制数据以及压缩型/非 压缩型的十进制数据。,二、80868088的指令格式80868088采用可变长指令,指令长度为16个字节。其指令编码格式有以下几种基本格式。(一) 无操作数指令这类指令一般属于控制类指令,指令中只包含1个字节的操作码OP,故又称为单字节指令。 (
10、二) 单操作数指令 这类指令只有1个操作数(字节或字),也只给出1个操作数地址。该操作数可以在寄存器或在存储器中,也可以是指令中直接给出的立即数。,一类是单字节指令,格式指令位7位3为操作码,位2位0的 REG字段(寄存器编码)有8种编码,对应8个16位通用寄存器:000AX,001CX,010DX,011BX,100SP,101BP,110SI,111DI。 格式指令的SEG字段(段寄存器编码)有4种编码,对应4个段寄存器:00ES,01CS,10SS,11DS。,格式的指令中,W字段(1位)用来表示操作数是字节还是字,W=1表示是字,W=0表示是字节;MOD字段(寻址方式编码)在此必须为1
11、1,表示操作数在寄存器中;RM字段(寄存器/存储器选择编码)在此对应8位或16 位的寄存器:000ALAX,001CLCX,010DLDX,011BLBX,100AHSP,101CHBP,110DHSI,111BHDI。 格式的指令中,两个字节均为操作码,而单操作数被约定总是固定存放在AX或AL中,它是一种隐含寻址的单操作数指令。,另一类是双字节指令,双操作数指令 双操作数指令常常是有一个操作数在寄存器中,由指令中的REG字段和W字段给定所在的寄存器;而另一个操作数可以在寄存器中,也可以在存储器中,或者是指令中给出的立即数,但不允许两个操作数均在存储器中。两个操作数均在寄存器中 。两个操作数中
12、有一个在寄存器中,另一个在存储器中。由REG和W字段给定一个操作数所在寄存器;由MOD和RM字段给定另一操作数在存储器中的有效地址,但MOD11。 两个操作数中有一个在寄存器中,另一个是指令中给出的立即数。两个操作数中,一个在存储器中,其有效地址由MOD(11)和RM字段给定,另一个操作数是指令中给出的立即数。,三、8086/8088指令的分类8086/8088的指令按功能可分为6类:数据传送、算术运算、逻辑运算、串操作、程序控制和CPU控制。(一) 数据传送类指令数据传送类指令可完成寄存器与寄存器之间、寄存器与存储器之间以及寄存器与I/O端口之间的字节或字传送,它们所具有的共同特点是不影响标
13、志寄存器的内容。这类指令又可分成4种类型。,1. 通用数据传送指令(1) MOV d,s;ds,即将由源s指定的源操作数送到目标d其中,s表示源,d表示目标。由s与d可分别指定源操作数与目标操作数。源操作数可以是8/16位寄存器、存储器中的某个字节/字或者是8/16位立即数;目标操作数不允许为立即数,其他同源操作数。且两者不能同时为存储器操作数。(2) PUSH s;将源操作数(16位)压入堆栈 POP d; 将堆栈中当前栈顶两相邻单元的数据字弹出到d这是两条进栈与出栈指令,其中,s和d可以是16位寄存器或存储器两相邻单元,以保证堆栈按字操作。,(3)XCHG d,s该指令功能是将源操作数与目
14、标操作数(字节或字)相互对应交换位置。交换可以在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存储器之间进行。但不能在两个存储单元之间交换,段寄存器与IP也不能作为一个源或目的操作数。(4)XLAT这是一条用于实现字节翻译功能的指令,又称为代码转换指令。具体地说,它可以将AL寄存器中设定的的一个字节数值变换为内存一段连续表格中的另一个相应的代码,以实现编码制的转换。,a g f e d c b a f g b buffer+0 0 1 0 0 0 0 0 0 e c +1 0 1 1 1 1 0 0 1 d +2 0 0 1 0 0 1 0 0 +3 0 0 1 1 0 0 0 0 +4
15、 0 0 0 1 1 0 0 1LEA BX,BUFFER +5 0 0 0 1 0 0 1 0MOV AL,4 +6 0 0 0 0 0 0 0 1 XLAT ;AL=19H +7 0 1 1 1 1 0 0 0OUT DX,AL +8 0 0 0 0 0 0 0 0 +9 0 0 0 1 0 0 0 0,2.目标地址传送指令这是一类专用于8086/8088中传送地址码的指令,可传送存储器的逻辑地址(即存储器操作数的段地址或偏移地址)至指定寄存器中,共包含3条指令:LEA、LDS和LES。(1) LEA d,s这是取有效地址指令,其功能是把用于指定源操作数(它必须是存储器操作数)的16位偏移
16、地址(即有效地址)传送到一个指定的16位通用寄存器中。这条指令常用来建立串操作指令所需要的寄存器指针。(2) LDS d,s这是取某变量的32位地址指针的指令,其功能是从由指令的源s所指定的存储单元开始,由4个连续存储单元中取出某变量的地址指针(共4个字节),将其前两个字节(即变量的偏移地址)传送到由指令的目标d所指定的某16位通用寄存器,后两字节(即变量的段地址)传送到DS段寄存器中,(3) LES d,s 这条指令与LDS d,s指令的操作基本相同,其区别仅在于将把由源所指定的某变量的地址指针中后2个字节(段地址)传送到ES段寄存器,而不是DS段寄存器。 上述3条指令都是装入地址,但使用时
17、要准确理解它们的不同含义。LEA指令是将16位有效地址装入任何一个16位通用寄存器;而LDS和LES是将32位地址指针装入任何一个16位通用寄存器及DS或ES段寄存器。,3.标志位传送指令 这类指令用于传送标志位,共有4条。(1) LAHF指令功能:将标志寄存器F的低字节(共包含5个状态标志位)传送到AH寄存器中。(2)SAHF指令功能:将AH寄存器内容传送到标志寄存器F的低字节。(3)PUSHF指令功能:将16位标志寄存器F内容入栈保护。其操作过程与前述的PUSH指令类似。(4)POPF指令功能:将当前栈顶和次栈顶中的数据字弹出送回到标志寄存器F中。,4.I/O数据传送指令(1)IN 累加器
18、,端口号 端口号可以用8位立即数直接给出;也可以将端口号事先安排在DX寄存器中,间接寻址16位长端口号(可寻址的端口号为065535)。IN指令是将指定端口中的内容输入到累加器AL/AX中。 其指令如下: IN AL,PORT ;AL(端口PORT)IN AX,PORT ;AX(端口PORT) IN AL,DX ;AL(端口(DX) IN AX,DX ;AX(端口(DX),(2)OUT 端口号,累加器 与IN指令相同,端口号可以由8位立即数给出,也可由DX寄存器间接给出。OUT指令是将累加器AL/AX中的内容输出到指定的端口。 OUT PORT,AL ;端口PORTAL OUT PORT,AX
19、 ;端口PORTAX OUT DX,AL ;端口(DX)AL OUT DX,AX ;端口(DX)AX 注意:I/O指令只能用累加器作为执行I/O数据传送的机构,而不能用其他寄存器代替。另,当用直接I/O指令时,寻址范围仅为0255,这适用于较小规模的微机系统;当需要寻址大于255的端口地址时,则必须用间接寻址的I/O指令。例如,在IBM PC/XT微机系统中,既用了0255范围的端口地址,也用了25565535范围的端口地址。,(二)算术运算类指令 算术运算类指令能对无符号或有符号的8/16位二进制数以及无符号的压缩型/非压缩型(又称为装配型拆开型或组合型未组合型)十进制数进行运算,有加、减、
20、乘、除以及十进制调整5类指令。1. 加法指令(1) ADD d,s ;dd+s指令功能:将源操作数与目标操作数相加,结果保留在目标中。并根据结果置标志位。源操作数可以是8/16位通用寄存器、存储器操作数或立即数;目标操作数不允许是立即数,其他同源操作数。且不允许两者同时为存储器操作数。,(2)ADC d,s;dd+s+CF 带进位加法(ADC)指令的操作过程与ADD指令基本相同,惟一的不同是进位标志位CF的原状态也将一起参与加法运算,待运算结束,CF将重新根据结果置成新的状态。(3)INC d;dd+1 指令功能:将目标操作数当作无符号数,完成加1操作后,结果仍保留在目标中。 目标操作数可以是
21、8/16位通用寄存器或存储器操作数,但不允许是立即数。,2.减法指令(1)SUB d,s;dd-s指令功能:将目标操作数减去源操作数,其结果送回目标,并根据运算结果置标志位。操作数可以是8/16位通用寄存器、存储器操作数或立即数;目标操作数只允许是通用寄存器或存储器操作数。并且,不允许两个操作数同时为存储器操作数,也不允许做段寄存器的减法。(2)SBB d,s;dd-s-CF本指令与SUB指令的功能、执行过程基本相同,唯一不同的是完成减法运算时还要再减去进位标志CF的原状态。运算结束时,CF将被置成新状态。,(3)DEC d; dd-1减1指令功能:将目标操作数的内容减1后送回目标。目标操作数
22、可以是8/16位通用寄存器和存储器操作数,但不允许是立即数。(4)NEG d; dd+1 (0-(d) d)NEG是一条求补码的指令,简称求补指令。指令功能:将目标操作数取负后送回目标。目标操作数可以是8/16位通用寄存器或存储器操作数。NEG指令是把目标操作数当成一个带符号数,如果原操作数是正数,则NEG指令执行后将其变成绝对值相等的负数(用补码表示);如果原操作数是负数(用补码表示),则NEG指令执行后将其变成绝对值相等的正数。,(5)CMP d,s;d-s,只置标志位指令功能:将目标操作数与源操作数相减但不送回结果,只根据运算结果置标志位。源操作数可以是8/16位通用寄存器、存储器操作数
23、或立即数;目标操作数只可以是8/16位通用寄存器或存储器操作数。但不允许两个操作数同时为存储器操作数,也不允许做段寄存器比较。比较指令使用的寻址方式与前面介绍过的加法和减法指令相同。当判断两比较数的大小时,应区分无符号数与有符号数的不同判断条件:对于两无符号数比较,只需根据借位标志CF即可判断;而对于两有符号数比较,则要根据溢出标志OF和符号标志SF两者的异或运算结果来判断。,3.乘法指令乘法指令用来实现两个二进制操作数的相乘运算,包括两条指令:无符号数乘法指令MUL和有符号数乘法指令IMUL。(1) MUL s MUL s是无符号乘法指令,它完成两个无符号的8/16位二进制数相乘的功能。被乘
24、数隐含在累加器AL/AX中; 指令中由s指定的源操作数作乘数,它可以是8/16位通用寄存器或存储器操作数。相乘所得双倍位长的积,按其高8/16位与低8/16位两部分分别存放到AH与AL或DX与AX中去,即对8位二进制数乘法,其16位积的高8位存于AH,低8位存于AL;而对16位二进制数乘法,其32位积的高16位存于DX,低16位存于AX。,(2)IMUL sIMUL s是有符号乘法指令,它完成两个带符号的8/16位二进制相乘的功能。对于两个带符号的数相乘,如果简单采用与无符号数乘法相同的操作过程,那么会产生完全错误的结果。为此,专门设置了IMUL指令。IMUL指令除计算对象是带符号二进制数以外
25、,其他都与MUL是一样的,但结果不同。IMUL指令对OF和CF的影响是:若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1。它仍然可用来判断相乘的结果中高一半是否含有有效数值。另外,IMUL指令对其他标志位没有定义。,4.除法指令除法指令执行两个二进制数的除法运算,包括无符号二进制数除法指令DIV和有符号二进制数除法指令IDIV两条指令。(1) DIV s 指令完成两个不带符号的二进制相除的功能。被除数隐含在累加器AX(字节除)或DX、AX(字除)中。指令中由s给出的源操作数作除数,可以是8/16位通用寄存器或存储器操作数。对于字节除法,所得的商存于AL,余数存于AH。对于字除法,
26、所得的商存于AX,余数存于DX。根据8086的约定,余数的符号应与被除数的符号一致。,若除法运算所得的商数超出累加器的容量,则系统将其当作除数为0处理,自动产生类型0中断,CPU将转去执行类型0中断服务程序作适当处理,此时所得商数和余数均无效。 在进行类型0中断处理时,先是将标志位进堆栈,IF和TF清0,接着是CS和IP的内容进堆栈;然后,将0、1两单元的内容填入IP,而将2、3两单元的内容填入CS;最后,再进入0号中断的处理程序。,(2) IDIV s该指令完成将两个带符号的二进制数相除的功能。它与DIV指令的主要区别在于对符号位处理的约定,其他约定相同。具体地说,如果源操作数是字节/字数据
27、,被除数应为字/双字数据并隐含存放于AX/DX、A X中。如果被除数也是字节/字数据在AL/AX中,应将AL/AX的符号位(AL7)/(AX15)扩展到AH/DX寄存器后,才能开始字节/字除法运算,运算结果商数在AL/AX寄存器中,AL7AX15是商数的符号位;余数在AH/DX中,AH7DX15 是余数的符号位,它应与被除数的符号一致。允许的最大商数为+127/+32767,最小商数为-127/-32767。,(三)逻辑运算和移位循环类指令 这类指令可分为3种类型。,1.逻辑运算指令(1)AND d,s;dds,按位“与”操作 源操作数可以是8/16位通用寄存器、存储器操作数或立 即数;目标操
28、作数只允许是通用寄存器或存储器操作数。 (2) OR d,s;dds,按位“或”操作 源操作数与目标操作数的约定同AND指令。(3) XOR d,s;dds,按位“异或”操作 源操作数与目标操作数的约定同AND指令。(4) NOT d;dd,按位取反操作。,(4) NOT d;dd,按位取反操作。(5) TEST d,s;ds,按位“与”操作,不送回结果有关的约定和操作过程与AND指令相同,只是TEST指令不传送结果。2.移位指令与循环移位指令移位指令分为算术移位和逻辑移位。算术移位是对带符号数进行移位,在移位过程中必须保持符号不变;而逻辑移位是对无符号数移位,总是用“0”来填补已空出的位。根
29、据移位操作的结果置标志寄存器中的状态标志(AF标志除外)。若移位位数是1位,移位结果使最高位(符号位)发生变化,则将溢出标志OF置“1”;若移多位,则OF标志将无效。,循环移位指令是将操作数首尾相接进行移位,它分为不带进位位与带进位位循环移位。这类指令只影响CF和OF标志。CF标志总是保持移出的最后一位的状态。若只循环移1位,且使最高位发生变化,则OF标志置“1”;若循环移多位,则OF标志无效。 所有移位与循环移位指令的目标操作数只允许是8/16位通用寄存器或存储器操作数,指令中的count(计数值)可以是1,也可以是n(n255)。若移1位,指令的count字段直接写1;若移n位时,则必须将
30、n事先装入CL寄存器中,故count字段只能书写CL而不能用立即数n。,(五)程序控制指令 一般情况下,指令是按顺序逐条执行的。但在实际运行中,也经常会根据微处理器的状态和工作要求等不同情况而随时改变程序的流向。程序控制指令就是用来控制程序流向的一类指令。本节介绍无条件转移、条件转移、循环控制和中断共4种类型的程序控制指令。1. 无条件转移指令 在无条件转移类指令中,除介绍无条件转移指令JMP外,也一并介绍无条件调用过程指令CALL与从过程返回指令RET,因为,后两条指令在实质上也是无条件地控制程序流向的转移的,但它们在使用上与JMP有所不同。,(1)JMP 目标标号 JMP指令允许程序流无条
31、件地转移到由目标标号指定的地址,去继续执行从该地址开始的程序。 转移可分为段内转移和段间转移两类。 段内转移是指在同一代码段的范围之内进行转,此时,只需要改变指令指针IP寄存器的内容,即用新的转移目标地址(指偏移地址)代替原有的IP值就可实现转移。 段间转移则是要转移到一个新的代码段去执行指令,此时不仅要修改IP的内容,还要修改段寄存器CS的内容才能实现转移。此时的转移目标地址应由新的段地址和偏移地址两部分组成。,段间间接转移 段间间接转移是指以间接寻址方式来实现由当前代码段转移到其他代码段。这时,应将目标地址的段地址和偏移地址先存放于存储器的4个连续地址中,其中前2个字节为偏移地址,后2个字
32、节为段地址,指令中只需给出存放目标地址的4个连续地址首字节的偏移地址值。 段间转移和段内间接转移都必须用无条件转移指令,换句话说,下面将要讨论的条件转移指令则只能用段内直接寻址方式,并且,其转移范围只能是自所在位置前后的128127个字节。,(2) CALL 过程名 这是无条件调用过程指令。 为便于模块化设计,往往把程序中某些具有独立功能的部分编写成独立的程序模块,一般称之为子程序。子程序结构相当于高级语言中的过程,所以,“过程”即“子程序”; 调用过程也即调用子程序。CALL指令将迫使CPU暂停执行当前程序(或称为主程序)后续的下一条指令(即断点),转去执行指定的过程;待过程执行完毕,再用返
33、回指令RET将程序返回到断点处继续执行。 8086/8088 指令系统中把处于当前代码段的过程称为近过程,用NEAR表示,而把其他代码段的过程称为远过程,用FAR表示。调用过程时,是近过程,只需将当前IP值入栈;如果是远过程,则必须将当前CS和IP的值一起入栈。,CALL指令也有4种不同的寻址方式和4种基本格式。 CALL NEAR PROC NEAR PROC是一个近过程名,采用段内直接寻址方式。 执行段内直接调用指令CALL时,第1步操作是把过程的返回地址(即调用程序中CALL指令的下一条指令的地址)压入堆栈中,以便过程返回调用程序(主程序)时使用。第2步操作则是转移到过程的入口地址去继续
34、执行。指令中的近过程名将给出目标(转向)地址(即过程的入口地址)。,2.条件转移指令 条件转移指令共有18条,这些指令将根据CPU执行上一条指令时,某一个或某几个标志位的状态而决定是否控制程序转移。如果满足指令中所要求的条件,则产生转移;否则,将继续往下执行紧接着条件转移指令后面的一条指令。 为缩短指令长度,所有的条件转移指令都被设计成短转移,即转移目标与本指令之间的字节距离在-128+127范围以内。,3.循环控制指令 在设计循环程序时,可以用循环控制指令来实现.循环控制指令实际上是一组增强型的条件转移指令, 它也是根据测试状态标志判定是否满足条件而控制转移。所不同的是,前述的条件转移指令只
35、能测试由执行前面指令所设置的标志,而循环控制指令是自己进行某种运算后来设置状态标志的。 循环控制指令共有4条,都与CX寄存器配合使用,CX中存放着循环次数。另外,这些指令所控制的目标地址的范围都在128127字节之内。,(1) LOOP 目标标号 LOOP指令的功能是先将CX寄存器内容减1后送回CX,再判断CX是否为0,若CX0,则转移到目标标号所给定的地址继续循环,否则,结束循环顺序执行下一条指令。这是一条常用的循环控制指令,使用LOOP指令前,应将循环次数送入CX寄存器。其操作过程与条件转移指令类似,只是它的位移量应为负值。(2)LOOPE/LOOPZ 目标标号 LOOPE和LOOPZ是同
36、一条指令的两种不同的助记符,其指令功能是先将CX减1送CX,若ZF=1且CX0时则循环,否则顺序执行下一条指令。,4.中断指令 中断指令只有3条。 (1)INT 中断类型 8086/8088系统中允许有256种中断类型(0255),各种类型的中断在中断入口地址表中占4个字节,前2个字节用来存放中断入口的偏移地址,后2个字节用来存放中断入口的段地址(即段值)。 CPU执行INT指令时,首先将标志寄存器F内容入栈,然后清除中断标志IF和单步标志TF,以禁止可屏蔽中断和单步中断进入,并将当前程序断点的段地址和偏移地址入栈保护,于是,从中断入口地址表中获得的中断入口的段地址和偏移地址,可分别置入段寄存
37、器CS和指令指针IP中,CPU将转向中断入口去执行相应的中断服务程序。,(2)INTO 为了判断有符号数的加减运算是否产生溢出,专门设计了1个字节的INTO指令用于对溢出标志OF进行测试;当OF=1,立即向CPU发出溢出中断请求,并根据系统对溢出中断类型的定义,可从中断入口地址表中得到类型4的中断服务程序入口地址.该指令一般安排在带符号的算术运算指令之后,用于处理溢出中断。(3)IRET IRET指令总是安排在中断服务程序的出口处,由它控制从堆栈中弹出程序断点送回CS和IP中,弹出标志寄存器内容送回F中,迫使CPU返回到断点继续执行后续程序。IRET也是一条1字节指令。,例:设X,Y分别存于存
38、储器变量X1和Y1中 试编写一段小程序满足下试: x+100 (x10) LEA SI,X1 W3: MOV DI,AX LEA DI,Y1 HLT MOV AX,SI W1: ADD AX,100 CMP AX,10 JMP W3 JL W1 W2: NOT AX JE W2 JMP W3 SUB AX,100,一个完整程序的例子: 对两个16位的数相加,这两个数分别存放在数组NUB1,NUB2的第一个元素中,结果存NUB3数组的第一个元素中:,NAME example.asmDATA SEGMENT PARADATA NUB1 DW 10 DUP(1234h) NUB2 DW 10 DUP
39、(1000h) NUB3 DW 5 DUP(?)DATA ENDSSTACK SEGMENT PARA STACK STAN DW 100 DUP(?)STACK ENDS,MYCODE SEGMENT PARA MYCODE ASSUME CS:MYCODE,DS:DATA,ES:STACK START PROC PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX LEA SI,NUB1 MOV DI,OFFSET NUB2 MOV BX,OFFSET NUB3 CLC,MOV AX,DI ADC AX
40、,SI MOV BX,AX RET START ENDPMYCODE ENDS END START,作业:1、读下面程序段,请问:在什么情况下,本程序的执行结果是AH=0? BEGIN: INAL,5FH TEST AL,80H JZBRCH1 MOV AH,0 JMP STOP BRCH1: MOV AH,0FFH STOP: HLT2、读程序:START: IN AL,20H MOV BL,AL IN AL,30H MOV CL,AL MOV AX,0ADLOP: ADD AL,BL ADC AH,0 DEC CL JNZ ADLOP HLT,请问:(1)本程序实现什么功能? (2)结果放
41、在哪里?,作业:3、编一程序段,完成符号函数: 1 X 0 ( -128 = X = 127 )Y = 0 X = 0 -1 X 0假设X的值存放在DATA1中,Y的值存放在DATA2中。,第4章 8086/8088汇编语言程序设计,汇编语言程序设计是开发微机系统软件的基本功,在程序设计中占有十分重要的地位。,由于汇编语言具有执行速度快和易于实现对硬件的控制等独特的优点,所以至今它仍然是用户使用得较多的程序设计语言。特别是在对于程序的空间和时间要求很高的场合,以及需要直接控制设备的应用场合,汇编语言更是必不可少了。 由于汇编语言本身的特点,本章将选择目前国内广泛使用的IBM PC机作为基础机型
42、,着重讨论8086/8088汇编语言的基本语法规则和程序设计的基本方法,以掌握一般汇编语言程序设计的初步技术。,4.1 程序设计语言概述,程序设计语言是专门为计算机编程所配置的语言。它们按照形式与功能的不同可分为3种,即 :机器语言汇编语言高级语言,目录,一、机器语言(Machine Language),机器语言是由0、1二进制代码书写和存储的指令与数据。特点:能为机器直接识别与执行;程序所占内存空间较少。缺点:难认、难记、难编写、易出错。,二、汇编语言(Assembly Language),汇编语言是用指令的助记符、符号地址、标号等书写程序的语言,简称符号语言。特点:易读、易写、易记。缺点:
43、不能像机器语言那样为计算机所直接识别,也不如高级语言那样具有很好的通用性和可移植性。,三、高级语言(High Level Language),高级语言是脱离具体机器(即独立于机器),面向用户的通用语言,不依赖于特定计算机的结构与指令系统。用同一种高级语言编写的源程序,一般可以在不同计算机上运行而获得同一结果。由于高级语言的通用性特点,对于高级语言程序员来说,不必熟悉计算机内部具体结构和机器指令,而只需要把主要精力放在程序结构和算法描述上面。 所以,高级语言具有更广泛的领域。,汇编语言程序的上机与处理过程,图中,椭圆表示系统软件及其操作,方框表示磁盘文件。椭圆中横线上部是系统软件的名称,横线下部
44、是软件所作的操作。首先,用户编写汇编语言源文件;再经过汇编程序进行汇编,产生属性为 OBJ的以二进制代码表示的目标程序并存盘。然后通过连接程序(LINK)把目标文件与库文件以及其他目标文件连接在一起,形成可执行文件, 才能在DOS环境下在机器上执行之。,4.2 8086/8088汇编语言的基本语法,各种机器的汇编语言其语法规则不尽相同,但基本语法结构形式类似。现以8086/8088汇编语言为例加以具体讨论。,目录,一、8086/8088汇编源程序实例,在具体讨论8086/8088汇编语言的繁琐语法规则之前,下面先举一个具有完整段定义格式的汇编源程序(即MASM程序)实例, 以便对汇编语言的有关
45、规定和格式有个初步了解。例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。,例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。,段,汇编源程序一般由若干段组成,每个段都有一个名字(叫段名),以SEGMENT作为段的开始,以ENDS作为段的结束,这两者(伪指令)前面都要冠以相同的名字。,段,段可以从性质上分为代码段、堆栈段、数据段和附加段4种,但代码段与堆栈段是不可少的,数据段与附加段可根据需要设置。 在上面这个例子中,一共定义了3个段: 1个数据段1个堆栈段1个代码段,NOTE,每一行只有一条语句且不能超过128个字符(从MASM 6.0开始可以是512个字符)但一条语句允许有后续行,最后均以回车作结束。,NOTE,整个源程序必须以END语句来结束,它通知汇编程序停止汇编。END后面的标号START表示该程序执行时的起始地址。每一条汇编语句最多由4个字段组成,它们均按照一定的规则分别写在一个语句的4个区域内 ,各区域之间用空格或制表符(TAB键)隔开。,