资源描述
IBM-PC,汇编语言程序设计,浙江财经学院信息学院,相关概念,一、什么是指令系统?,计算机的指令系统就是指该计算机能够执行的全部指令的集合。,每种计算机都有它支持的指令集合。,16,位,8086,指令系统是整个,Intel 80 x86,系列微处理器指令系统的基础。,二、指令格式,指令由操作码和操作数两部分组成。,操作码,说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分。,操作数,是指令执行的参与者,即各种操作的对象。,有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有,3,个甚至,4,个操作数,通常成为一地址指令、二地址指令、三,操作码,操作数,操作数,三、学习指令的注意事项,指令的功能,该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式。,指令支持的寻址方式,该指令中的操作数可以采用何种寻址方式。,指令对标志的影响,该指令执行后是否对各个标志位有影响,以及如何影响。,其他方面,该指令其他需要特别注意的地方,如指令执行时的约定设置、,必须预置的参数、隐含使用的寄存器,等。,3.1 80 x86,寻址方式,寻址、寻址方式的概念,指令中操作数字段实质上是指出操作数存放于何处。一般来说,,操作数可以跟随在指令操作码之后,,称为,立即数,;,操作数也可以存放在,CPU,内部的寄存器中,,称为,寄存器操作数,。,绝大多数的操作数存放在内存储器中,,称为,存储器操作数,。指令指定操作数的位置,即给出地址信息,在执行时需要根据这个地址信息找到需要的操作数。这种,寻找操作数的过程,称为,寻址,,而寻找操作数的方法称为,寻址方式,。,指令的助记符格式:,指令助忆符,操作数,1 ,操作数,2 ,操作数,3 ,;,注释,指令助忆符体现该指令的功能,它,对应一条二进制编码的机器指令,。指令的操作数个数由该指令确定,,可以没有操作数,也可以有一个、二个或三个操作数。,绝大多数指令的操作数要显式的写出来,但也有指令的操作数是隐含的,不需要在指令中写出。,注:,当指令含有操作数,则在书写时必须遵守:,指令助记符和操作数之间要有分隔符,分隔符可以是若干个空格或,TAB,键;,如果指令含有多个操作数,那么,操作数之间要用逗号,,,分开,。,指令后面还可以书写注释内容,不过,要在注释之前书写分号“;”。,3.1.1,与数据有关的寻址方式,以,MOV,指令为例:,立即寻址,MOV AX,3069H,寄存器寻址,MOV AL,BH,直接寻址,MOV AX,2000H,寄存器间接寻址,MOV AX,BX,寄存器相对寻址,MOV AX,COUNT SI,基址变址寻址,MOV AX,BP DI,相对基址变址寻址,MOV AX,MASK BX SI,1.,立即寻址方式,定义:,操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为,立即数,寻址方式。,汇编格式:,n,(,n,为立即操作数,是,用,8,位或,16,位二进制补码表示的有符号数,),功能:,操作数存放在存储器,指令下一单元的内容为立即操作数,n,。,图形表示:,操作数,n,指令,【,例,3.1】MOV AX,,,4576H,执行后(,AX,),=,?,该例中源操作数为立即寻址方式,立即数为,4576H,,存放在指令的下一单元。,执行:,4576HAX,执行后:(,AX,),=4576H,76H,OP,45H,DS,MOV AX,,,4576H,指令的存储形式,45 76,AX,2.,寄存器寻址方式,定义:,指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器,。把在指令中指出所使用寄存器(即:寄存器的助记符)的寻址方式称为寄存器寻址方式。,汇编格式:,R,其中,R,表示寄存器名。,功能:,操作数直接存放在寄存器,R,中。,图形表示:,寄存器,R,指令,操作数,寄存器,指令中可以引用的寄存器及其符号名称如下:,8,位寄存器有:,AH,、,AL,、,BH,、,BL,、,CH,、,CL,、,DH,和,DL,等;,16,位寄存器:,AX,、,BX,、,CX,、,DX,、,SI,、,DI,、,SP,、,BP,和段寄存器,等;,源操作数是寄存器寻址方式,如:,ADD VARW,AX,MOV VARB,BH,等。,其中:,VARW,和,VARB,是字和字节类型的内存变量。,目的操作数是寄存器寻址方式,如:,ADD,BH,78h,ADD,AX,1234h,源和目的操作数都是寄存器寻址方式,如:,MOV,AX,BX,MOV,DH,BL,等。,注:,由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读,/,写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度,。通常情况下,提倡在编写,汇,编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。,【,例,3.2】,下列程序执行后,(,AX,),=,?,(,BX,),=,?,MOV AX,,,1234H,MOV BX,,,5678H,ADD AX,,,BX,解释:该程序中,MOV,指令为数据传送指令操作符,,ADD,指令为加法指令操作符,三条指令皆为双操作数指令。第一、二条指令,AX,、,BX,皆为目的操作数地址,为寄存器寻址方式。第三条指令中,,AX,为目的操作数地址,,BX,为源操作数地址。源地址和目的地址皆为寄存器寻址方式。,执行:,1234HAX,5678HBX,(,AX,),+,(,BX,),AX,执行后:(,AX,),=68ACH,,(,BX,),=5678H,3.,直接寻址方式,定义:,指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,,这种寻址方式为直接寻址方式。,汇编格式:,含有变量的地址表达式,。,功能:,指令下一字单元的内容是操作数的偏移地址,EA,。,图形表示:,EA,指令,操作数,存储器,段基地址,【,例,3.3】,执行指令:,MOV BX,,,1234H,设(,DS,),=2000H,。,执行后:(,AX,),=?,图示:,执行:(,21234H,),BX,执行后:(,BX,),=5312H,在通常情况下,操作数存放在数据段中,所以,,其物理地址将由数据段寄存器,DS,和指令中给出的有效地址直接形成,,但如果使用段超越前缀,那么,操作数可存放在其它段。,例如:,MOV,ES,:1000H,,,AX,注意:,立即寻址方式和直接寻址方式的书写格式不同,,直接寻址的地址要写在括号,“,”,,,“,”,内。在程序中,,直接地址通常用内存变量名来表示,,如:,MOV BX,VARW,,其中,,VARW,是内存字变量。,试比较下列指令中源操作数的寻址方式(,VARW,是内存字变量):,MOV,AX,1234H,MOV,AX,1234H,前者是立即寻址,后者是直接寻址,MOV,AX,VARW,MOV,AX,VARW,两者是等效的,均为直接寻址,4.,寄存器间接寻址方式,定 义:,操作数在存储器中,,,操作数的有效地址,用,SI,、,DI,、,BX,和,BP,等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。,汇编格式:,R,功 能:,操作数存放在存储器,寄存器,R,存放操作数的偏移地址,EA,。,图形表示:,EA,寄存器,操作数,存储器,段基地址,基址或变址寄存器,指令,【,例,3.4】,假设有指令:,MOV BX,DI,,在执行时,(,DS,),=1000H,,(,DI,),=2345H,,存储单元,12345H,的内容是,4354H,。问执行指令后,,BX,的值是什么?,解:寄存器,DI,的值不是操作数,而是操作数的地址。,该操作数的物理地址应由,DS,和,DI,的值形成,即:,PA=,(,DS,)*,16+DI=1000H*16+2345H=12345H,。,所以,该指令的执行效果是:,把从物理地址为,12345H,开始的,一个字的值传送给,BX,。,OP,CS,DS,54H,43H,10000H,12345H,DS,:,1000H,DI,:,2345H,12345H,43 54,BX,在不使用段超越前缀的情况下,有下列规定:,若有效地址用,SI,、,DI,和,BX,等之一来指定,则其缺省的段寄存器为,DS,;,若有效地址用,BP,来指定,则其缺省的段寄存器为,SS,(即:堆栈段)。,该寻址方式物理地址的计算方法如下:,BX,物理地址,PA=16DS+SI,DI,或,物理地址,PA=16SS+BP,5.,寄存器相对寻址方式,定 义:,操作数在存储器中,其有效地址是一个基址寄存器,(,BX,、,BP,),或变址寄存器,(,SI,、,DI,),的内容和指令中的,8,位,/16,位偏移量之和。,汇编格式:,XR,(,X,表示位移量,是,8,位或,16,位二进制补码表示的有符号数),功 能:,操作数存放在存储器,寄存器,R,的内容加位移量,X,为操作数的偏移地址,EA,。,图形表示如下:,地址,寄存器,操作数,存储器,段基地址,基址或变址寄存器 位移量,指令,EA,【,例,3.5】,假设指令:,MOV BX,SI+100H,,在执行它时,(,DS,),=1000H,,(,SI,),=2345H,,内存单元,12445H,的内容为,2715H,,问该指令执行后,,BX,的值是什么?,解:,EA,=,(,SI,),+100H=2345H+100H=2445H,PA,=,(,DS,)*,16+EA=1000H*16+2445H=12445H,。,所以,该指令的执行效果是:,把从物理地址为,12445H,开始,的一个字的值传送给,BX,。,OP,CS,DS,15H,27H,10000H,12445H,SI,:,2345H,100H,EA,:,2445H,DS,:,1000H,12445H,27 15,BX,6.,基址变址寻址方式,定 义:,操作数在存储器中,其有效地址是一个基址寄存器,(,BX,、,BP,),和一个变址寄存器,(,SI,、,DI,),的内容之和。,汇编格式:,BR+IR,功 能:,操作数存放在存储器,,BR,的内容加,IR,的内容是操作数的偏移地址,EA,。,图形表示:,操作数,存储器,段基地址,基址寄存器 变址寄存器,指令,基址值,基址寄存器,变址值,变址寄存器,EA,【,例,3.6】,假设指令:,MOV BX,BX+SI,,在执行时,(,DS,),=1000H,,(,BX,),=2100H,,(,SI,),=0011H,,内存单元,12111H,的内容为,1234H,。问该指令执行后,,BX,的值是什么?,解:操作数的物理地址,PA,为:,PA,=,(,DS,)*,16+,(,BX,),+,(,SI,),=1000H*16+2100H+0011H=12111H,所以,该指令的执行效果是:,把从物理地址为,12111H,开始,的一个字的值传送给,BX,。,OP,CS,DS,34H,12H,10000H,12111H,BX,:,2100H,SI,:,0011H,EA,:,2111H,DS,:,1000H,12111H,12 34,BX,7.,相对基址变址寻址方式,定 义:,操作数在存储器中,其有效地址是一个基址寄存器,(,BX,、,BP,),的值、一个变址寄存器,(,SI,、,DI,),的值和指令中的,8,位,/16,位偏移量之和。,汇编格式:,X BR+IR,功 能:,操作数存放在存储器,,BR,内容加,IR,内容加位移量,X,是操作数的偏移地址,EA,。,图形表示:,存储器,基址值,基址寄存器,操作数,段基地址,基址寄存器 变址寄存器 位移量,指令,变址值,变址寄存器,EA,【,例,3.7】,假设指令:,MOV AX,BX+SI+200H,,在执行时,(,DS,),=1000H,,(,BX,),=2100H,,(,SI,),=0010H,,内存单元,12310H,的内容为,1234H,。问该指令执行后,,AX,的值是什么?,解:该操作数的物理地址应由,DS,和,EA,的值形成,即:,PA,=12310H,所以,该指令的执行效果是:,把从物理地址为,12310H,开始,的一个字的值传送给,AX,。,OP,CS,DS,34H,12H,10000H,12310H,BX,:,2100H,SI,:,0010H,0200H,EA,:,2310H,DS,:,1000H,12310H,12 34,AX,跨段越问题,凡是使用寄存器为,BX,、,SI,、,DI,时,其默认段为,DS,,使用,BP,时,默认段为,SS,。该规定为系统默认状态。当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。,汇编格式:,段寄存器名:操作数地址。,功能:,冒号,“,:,”,之前的段寄存器名指明操作数所在的段。,【,例,3.8】,MOV AX,,,DS,:,BP,MOV CX,,,SS,:,SI,该例中,,DS,:,,SS,:均为跨段前缀,此时默认状态无效,操作数的物理地址,PA,由段寄存器内容左移,4,位加偏移,EA,形成。上述,2,条指令的源操作数物理地址分别为:,PA1 =,(,DS,)左移,4,位,+BP,PA2 =,(,SS,)左移,4,位,+SI,3.1.2,与转移地址有关的寻址方式,用来确定转移指令及转子(,call,)指令的转向地址。转移地址是由各种寻址方式得到的有效地址和段地址相加而成的,有效地址存入,IP,寄存器中,段地址指定为,CS,段寄存器内容。,段内寻址,段内直接寻址,JMP NEAR PTR NEXT,段内间接寻址,JMP TABLE BX,段间寻址,段间直接寻址,JMP FAR PTR NEXT,段间间接寻址,JMP DWORD PTR BX,(,1,)段内直接寻址,转向的有效地址,=,当前(,IP,),+,位移量(,8bit/16bit),位移量,IP,寄存器,EA,【,例,3.8】,(,1,),JMP,SHORT,QUEST,其中,QUEST,表示转移的符号地址,操作符,SHORT,表示是个,8,位带符号数,数的范围是,80H 7FH,,即,-128 +127,。它只能相对于当前,IP,(转移指令的下一条指令的首地址)所指的位置作,-128 +127,范围内跳转,所以称为,短跳转,。,(,2,),JMP,NEAR PTR,PROGA,其中,PROGA,表示转移的符号地址,操作符,NEAR PRT,表示是个,16,位带符号数,数的范围是,8000H 7FFFH,,即,-32768 +32767,。它只能相对于当前,IP,所指的位置作,-32768 +32767,范围内跳转,所以称为,近跳转,。,(,2,)段内间接寻址,转向的有效地址是一个寄存器或存储单元的内容。可用除立即数以外的任何一种数据寻址方式得到,所得到的转向的有效地址取代,IP,寄存器的内容。,转向的有效地址,指令,数据寻址方式,或,根据数据寻址,方式计算出,EA,值,转向的有效地址,存储单元,【,例,3.9】,已知,TABLE=20A2H,,(,BX,),=1256H,,(,SI,),=528EH,,,(,DS,),=2000H,,(,232F8H,),=3280H,,(,264E4H,),=2450H,JMP BX ;,(,IP,),=1256H,JMP,WORD PTR,TABLEBX ;,(,IP,),=3280H,JMP,WORD PTR,BXSI ;,(,IP,),=2450H,(,3,)段间直接寻址,用指令中提供的转向段地址和偏移地址取代,CS,和,IP,。,指令,偏移地址,IP,寄存器,段地址,CS,寄存器,【,例,3.9】,JMP,FAR PTR,NEXTROUNT,32,EA,01,00,10,10,CS=0000H,CS,00000,02000,IP,IP=2000H,CS,CS=1000H,NEXTROUNT,IP=0132H,10132,10000,新,IP,新,CS,(,4,)段间间接寻址,用存储器中的两个相继字的内容取代,CS,和,IP,,存储单元的地址可用存储器寻址方式得到。,指令,数据寻址方式,根据数据寻址,方式计算出,EA,值,转向的有效地址,转向的有效地址,存储器中的两个相继字,IP,CS,【,例,3.10】JMP,DWORD PTR,INTERS+BX,如,DS=3000H,,,BX=1200H,,,INTERS=0020H,,,则存储单元的物理地址,PA=30000+0020+1200=31200H,指令执行前,,CS=0000H,,,IP=1000H,,(,31220H,),=40H,,,(,31221,),=01H,,(,31222H,),=00H,,(,31223,),=10H,。,指令执行后,,CS=1000H,,,IP=0140H,,(,31220H,),=40H,,,(,31221,),=01H,,(,31222H,),=00H,,(,31223,),=10H,。,指令存储和执行情况:,JMP,DWORD,PTR,INTER,BX,CS=0000H,CS,00000,01000,IP,IP=1000H,CS,CS=1000H,IP,IP=0140H,10140,10000,代码段,01,40,00,10,DS=3000H,DS,30000,31220,INTER+BX,数据段,新,IP,新,CS,31221,31222,31223,3.2,程序占有的空间和执行时间,3.,80 x86,的指令系统,80X86,指令系统分为以下,6,组:,数据传送指令 串处理指令,算术指令 控制转移指令,逻辑指令 处理机控制与杂项操作指令,在学习汇编指令时,指令的功能是我们学习和掌握的重点,但要准确、有效地运用这些指令,我们还要熟悉系统对每条指令的一些规定或约束。因此,对指令要掌握以下几个方面内容:,指令操作数的寻址方式;,指令对标志位的影响、标志位对指令的影响;,指令的执行时间,对可完成同样功能的指令,要选用执行时间短的指令,。,3.,.,数据传送指令,数据传送指令,负责把数据、地址或立即数传送到寄存器、存储器或端口号寄存器,。,它相对于高级语言里的赋值语句。,通用数据传送,:,MOV PUSH POP,累加器专用传送(输入输出),:,IN OUT XLAT,地址传送,:,LEA LDS LES,标志寄存器传送,:,LAHF SAHF PUSHF POPF,类型转换指令,:,CBW CWD,MOV,传送指令,格 式:,MOV Reg/Mem,,,Reg/Mem/Imm,其中:,Reg,Register,(寄存器),,Mem,Memory,(存储器),,Imm,Immediate,(立即数),它们,可以是,8,位、,16,位。,功 能:,指令的功能是,把源操作数(第二操作数)的值传给目的操作数(第一操作数)。,指令执行后,目的操作数的值被改变,而源操作数的值不变。在存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。,段寄存器,CS,、,DS,、,SS,、,ES,通用寄存器,8,位或者,16,位,存储器,立即数,8,位或者,16,位,在汇编语言中,主要的数据传送方式如下图所示。虽然一条,MOV,指令能实现其中大多数的数据传送方式,但也存在,MOV,指令不能实现的传送方式。,对,MOV,指令有以下几条具体规定,其中有些规定对其它指令也同样有效。,(,1,),两个操作数的数据类型要相同,,要同为,8,位、,16,位,,如:,MOV BL,,,AX,等是不正确的;,(,2,),两个操作数不能同时为段寄存器,,如:,MOV ES,,,DS,等;,(,3,),代码段寄存器,CS,不能为目的操作数,但可作为源操作数,,,如:指令,MOV CS,AX,等不正确,但指令,MOV AX,,,CS,等是正确的;,(,4,),立即数不能直接传给段寄存器,,如:,MOV DS,,,100H,等;,(,5,),立即数不能作为目的操作数,,如:,MOV,100H,,,AX,等;,(,6,),指令指针,IP,,不能作为,MOV,指令的操作数,;,(,7,),两个操作数不能同时为存储单元,,,如:,MOV,VARA,,,VARB,等,其中,VARA,和,VARB,是同数据类型的内存变量。,PUSH,进栈指令,堆栈是一个重要的数据结构,它具有,“,先进后出,”,的特点,,通常用来保存程序的返回地址,。它主要有两大类操作:,进栈操作和出栈操作,。,指令格式:,PUSH,Reg/Mem,一个字进栈,系统自动完成两步操作:,SPSP-2,,(,SP,)操作数,;,功 能:,将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减,2,。,【,例,】PUSH AX,28,16,A7,SS=5000H,SS,50000,堆栈段,52500,52501,52502,SP=2500H,SP,31 25,AX,28,31,16,A7,SS=5000H,SS,50000,堆栈段,52500,52501,52502,SP=24FEH,SP,25,31 25,AX,525FF,525FE,(,1,)执行前,(,2,)执行后,POP,进栈指令,指令格式,:,POP,Reg/Mem,弹出一个字,系统自动完成两步操作:,操作数(,SP),,,SPSP+2,;,功 能,:,将栈顶元素弹出送至某一寄存器、段寄存器(除,CS,外)或存储器,堆栈指针加,2,。,【,例,】POP BX,(,1,)执行前,(,2,)执行后,48,6B,9A,28,SS,50000,堆栈段,51001,51002,51003,SP=1000H,SP,75 C1,BX,51000,48,6B,9A,28,SS,50000,堆栈段,51001,51002,51003,SP=1002H,SP,48 6B,BX,51000,IN,输入指令,输入指令用来,从指定的外设寄存器取信息送入累加器,。它有几种形式:,长格式:,IN AL,PORT,(字节),IN AX,PORT,(字),执行操作:(,AL,),(,PORT,)(字节),(,AX,),(,PORT+1,PORT,)(字),短格式:,IN AL,DX,(字节),IN AX,DX,(字),执行操作:(,AL,),(,DX,)(字节),(,AX,),(,DX,),+1,(,DX,)(字),注意:,该指令的作用是从端口中读入一个字节或字,并保存在寄存器,AL,或,AX,中。,如果某输入设备的端口地址在,0255,范围之内,那么,可在指令,IN,中直接给出,否则,要把该端口地址先存入寄存器,DX,中,然后在指令中由,DX,来给出其端口地址。,例如:,IN AL,,,60H,;从端口,60H,读入一个字节到,AL,中,IN AX,,,20H,;把端口,20H,、,21H,按“高高低低”组成的,字读入,AX,MOV DX,,,2F8H,IN AL,,,DX,;从端口,2F8H,读入一个字节到,AL,中,IN AX,,,DX,;把端口,2F8H,、,2F9H,按“高高低低”组成,的字读入,AX,OUT,输出指令,输出指令用来,把累加器的内容送往指定的外设存储器,,它有几种形式:,长格式:,OUT PORT,AL,(字节),OUT PORT,AX,(字),执行操作:,(,PORT,),(,AL,),(字节),(,PORT+1,PORT,),(,AX,)(,字),短格式:,OUT DX,AL,(字节),OUT DX,AX,(字),执行操作:,(,DX,),(,AL,),(字节),(,DX,),+1,(,DX,),(,AX,)(,字),注意:,该指令的作用是把寄存器,AL,或,AX,的内容输出到指定端口。如果某输出设备的端口地址在,0255,范围之内,那么,可在指令,OUT,中直接给出,否则,要把该端口地址先存入寄存器,DX,中,然后在指令中由,DX,来给出其端口地址。,例如:,OUT 61H,,,AL,;把,AL,的内容输出到端口,61H,中,OUT 20H,,,AX,;把,AX,的内容输出到端口,20H,、,21H,中,MOV DX,,,3C0H,OUT DX,,,AL,;把,AL,的内容输出到端口,3C0H,中,OUT DX,,,AX,;把,AX,的内容输出到端口,3C0H,、,3C1H,中,XLAT,换码指令,转换指令有,两个隐含操作数,BX,和,AL,。,格 式,:,XLAT OPR,或,XLAT,执行操作,:,(,AL,),(,BX,),+,(,AL,),功 能,:其功能是,把,BX,的值作为内存字节数组首地址、下标为,AL,的数组元素的值传送给,AL,。,例:,MOV BX,,,offset table,;,(,BX,),=0040H,MOV AL,,,3,XLAT,指令执行后(,AL,),=33H,32H,31H,33H,DS=F000H,DS,数据段,F0040,F0041,(,AL,),=3,table,30H,(,BX,),F0042,F0043,把,BX,的值作为内存字节数组首地址、下标为,AL,的数组元素的值传送给,AL,。,地址传送指令,取有效地址指令,LEA,:,指令,LEA,是,把一个内存变量的,有效地址,送给指定的寄存器,。其指令格式如下:,LEA,Reg,,,Mem,该指令,通常用来对,指针或变址寄存器,BX,、,DI,或,SI,等置初值之用,。,取,段寄存器指令:,该组指令的功能是,把内存单元的一个“,低字,”传送给,指令中指定的,16,位寄存器,,把随后的一个“,高字,”传给,相应的段寄存器,(,DS,、,ES,),。其指令格式如下:,LDS/LES,Reg,Mem,例:,LEA BX,,,BX+SI+0F62H,LDS SI,,,10H,LES DI,,,BX,MOV BX,,,TABLE,;,(,BX,),=0040H,MOV BX,,,OFFSET TABLE,;,(,BX,),=1000H,LEA BX,,,TABLE,;,(,BX,),=1000H,LDS BX,,,TABLE,;,(,BX,),=0040H,;,(,DS,),=3000H,LES BX,,,TABLE,;,(,BX,),=0040H,;,(,ES,),=3000H,40 H,00 H,00 H,30 H,TABLE,3000H:1000H,标志寄存器传送指令,标志送,AH,指令:,LAHF,执行操作:(,AH,),(,FLAGS,的低字节,),AH,送标志寄存器指令:,SAHF,执行操作:(,FLAGS,的低字节,),(,AH,),标志进栈指令:,PUSHF,执行操作:(,SP,),(,SP,),-2,(,SP,),+1,(,SP,),(,FLAGS,),标志出栈,指令:,POPF,执行操作:(,FLAGS,),(,SP,),+1,(,SP,),(,SP,),(,SP,),+2,类型转换指令指令,CBW,AL,AX,执行操作:,若(,AL,)的最高有效位为,0,,则(,AH)=00H,若(,AL,)的最高有效位为,1,,则(,AH)=FFH,CWD,AX,(,DX,AX,),执行操作:,若(,AX,)的最高有效位为,0,,则(,DX)=0000H,若(,AX,)的最高有效位为,1,,则(,DX)=FFFFH,例,:,(,A,X,),=0BA45H,CBW,;,(,AX,),=0045H,CWD,;,(,DX,),=0FFFFH,(,AX,),=0BA45H,3.,.,算术指令,算术运算指令是反映,CPU,计算能力的一组指令,也是编程时常使用的一组指令。它包括:加、减、乘、除及其相关的辅助指令。,该组指令的操作数可以是,8,位、,16,位。当存储单元是该类指令的操作数时,,该操作数的寻址方式可以是任意一种存储单元寻址方式,。,加法指令,ADD,、,ADC,、,INC,减法指令,SUB,、,SBB,、,DEC,、,NEG,、,CMP,乘法指令,MUL,、,IMUL,除法指令,DIV,、,IDIV,十进制调整指令,DAA,、,DAS,、,AAA,、,AAS,、,AAM,、,AAD,1,.,加法指令,加法指令:,ADD DST,,,SRC,功能:将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。,执行操作:,(,DST,),(,SRC,),+,(,DST,),带进位加法指令:,ADC DST,,,SRC,功能:将目的操作数加源操作数再加低位进位,结果送目的地址。执行操作:,(,DST,),(,SRC,),+,(,DST,),+CF,加,1,指令:,INC OPR,功能:将目的操作数加,1,,结果送目的地址。,执行操作:,(,OPR,),(,OPR,),+1,注意,:,除,INC,指令,不影响,CF,标志外,均对条件标志位有影响。,标志寄存器,FLAGS,的介绍,指令的执行与标志有很大关系。,标志分成两类:,状态标志,用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它。它们分别是:,CF ZF SF PF OF AF,控制标志,可由程序根据需要用指令设置,用于控制处理器执行指令的方式。它们分别是:,DF IF TF,15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,OF,DF IF TF,SF ZF AF PF CF,进位标志,CF,(,Carry Flag,),当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置,1,,即,CF=1,;否则,CF=0,。,例如:,3AH+7CH,B6H,,没有进位:,CF=0,AAH+7CH,(,1,),26H,,有进位:,CF=1,零标志,ZF,(,Zero Flag,),若运算结果为,0,,则,ZF=1,,否则,ZF=0,。,例如:,3AH+7CH,B6H,,结果不是零:,ZF=0,86H+7CH,(,1,),00H,,结果是零:,ZF=1,注意:,ZF,为,1,表示的结果是,0,。,符号标志,SF,(,Sign Flag,),运算结果最高位为,1,,则,SF=1,;否则,SF=0,。,例如:,3AH+7CH,B6H,,最高位,D7,1,:,SF=1,86H+7CH,(,1,),00H,,最高位,D7,0,:,SF=0,注意:有符号数据利用最高有效位表示数据的符号。所以,最高有效位就是符号标志的状态。,奇偶标志,PF,(,Parity Flag,),当运算结果最低字节中“,1”,的个数为零或偶数时,,PF=1,;否则,PF=0,。,例如:,3AH+7CH,B6H,10110110B,,,结果中有,5,个,1,,是奇数:,PF=0,注意:,PF,标志仅反映最低,8,位中“,1”,的个数是偶或奇,即使是进行,16,位字操作。,辅助进位标志,AF,(,Auxiliary Carry Flag,),运算时,D3,位(低半字节)有进位或借位时,,AF=1,;否则,AF=0,。,例如:,3AH+7CH,B6H,,,D3,有进位:,AF=1,注意:这个标志主要由处理器内部使用,用于十进制算术运算指令中,用户一般不必关心。,溢出标志,OF,(,Overflow Flag,),若算术运算的结果有溢出,则,OF=1,;否则,OF,0,。,例如:,3AH+7CH,B6H,,没有溢出:,OF=0,AAH+7CH,(,1,),26H,,产生溢出:,OF=1,问题:,什么是溢出?,溢出和进位有什么区别?,如何判断是否溢出?,举例,:n=8 bit,带符号数,(,-128127,),无符号数(,0255,),0 0 0 0 0 1 0 0,+0 0 0 0 1 0 1 1,0 0 0 0 1 1 1 1,带:,(+4)+(+11)=+15 OF=0,无:,4+11=15 CF=0,带符号数和无符号数都不溢出,0 0 0 0 1 0 0 1,+0 1 1 1 1 1 0 0,1 0 0 0 0 1 0 1,带,:(+9)+(+124)=-133 OF=1,无,:9+124=133 CF=0,带符号数溢出,无符号数溢出,0 0 0 0 0 1 1 1,+1 1 1 1 1 0 1 1,1,0 0 0 0 0 0 1 0,带:,(+7)+(-5)=+2 OF=0,无:,7+251=258 CF=1,带符号数和无符号数都溢出,1 0 0 0 0 1 1 1,+1 1 1 1 0 1 0 1,1,0 1 1 1 1 1 0 0,带:,(-121)+(-11)=+134 OF=1,无:,135+245=124 CF=1,CF,位表示无符号数相加的溢出。,OF,位表示带符号数相加的溢出。,【,例,1】,加,1,指令。,INC BX,;(,BX,),+1BX,。,【,例,2】,双字加法运算,设目的操作数存放在,DX,和,AX,寄存器中,其中,DX,放高位字,源操作数存放在,BX,和,CX,寄存器中,其中,BX,放高位字,指令执行前:(,DX,),=0020H,,(,AX,),=0F365H,,(,BX,),=0005H,,(,CX,),=0E024H,。,ADDAX,,,CX,;(,AX,),=0D389H,,,CF=1,ADCDX,,,BX,;(,DX,),=0008H,,,CF=0,2,.,减法指令,减法指令:,SUB DST,,,SRC,功能:目的操作数减去源操作数,结果存于目的地址,源地址的内容不变。,执行操作:,(,DST,),(,DST,),-,(,SRC,),带借位减法指令:,SBB DST,,,SRC,功能:目的操作数减源操作数再减低位借位,CF,,结果送目的地址,执行操作:,(,DST,),(,DST,),-,(,SRC,),-CF,减,1,指令:,DEC OPR,功能:将目的操作数减,1,,结果送目的地址。,执行操作:,(,OPR,),(,OPR,),-1,减法指令对条件标志位的影响:,CF,位表示无符号数减法的溢出。,OF,位表示带符号数减法的溢出。,1,被减数的最高有效位有向高位的借位,0,否则,CF=,1,两个操作数符号相反,而结果的符号与减数相同,0,否则,OF=,2,.,减法指令,求补指令:,NEG OPR,功能:将目的操作数的每一位求反(包括符号位)后加,1,,结果送目的地址。,执行操作:,(,OPR,),-,(,OPR,),比较指令:,CMP OPR1,OPR2,功能:目的操作数减源操作数,结果只影响标志位,不送入目的地址。,执行操作:,(,OPR1,),-,(,OPR2,),注意,:,除,DEC,指令,不影响,CF,标志外,均对条件标志位有影响。,【,例,1】,求补运算。,MOVDX,,,6780H,NEGDX,;(,DX,),=9880H,【,例,2】,比较,AL,的内容数值大小。,CMPAL,,,50,;(,AL,),-50,JBBellow,;(,AL,),=50,,(,AL,),50AL,INCAH,;(,AH,),+1AH,Bellow,:,0 0 0 0H,-)6 7 8 0 H,CF 1 9 8 8 0 H,3,.,乘法指令,无符号数乘法指令:,MUL SRC,带符号数乘法指令:,IMUL SRC,功 能:,若是字节数据相乘,(,AL,)与,SRC,相乘得到字数据存入,AX,中;若是字数据相乘,则(,AX,)与,SRC,相乘得到双字数据,高字存入,DX,、低字存入,AX,中,。,执行操作:,字节操作数 (,AX,),(,AL,),(,SRC,),字操作数 (,DX,,,AX,),(,AX,),(,SRC,),注:,IMUL,指令除计算对象是带符号二进制数外,其他都与,MUL,一样,但计算结果不同。,乘法指令如下影响,OF,和,CF,标志:,MUL,指令,若乘积的高一半(,AH,或,DX,)为,0,,则,OF=CF=0,;否则,OF=CF=1,。(用来检查字节相乘的结果是字节还是字,或字相乘的结果是字还是双字),IMUL,指令,若乘积的高一半是低一半的符号扩展,则,OF=CF=0,;否则均为,1,。,乘法指令对其他状态标志没有定义:,指令执行后这些标
展开阅读全文