第三章指令系统教材_第1页
第三章指令系统教材_第2页
第三章指令系统教材_第3页
第三章指令系统教材_第4页
第三章指令系统教材_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

第3章教学重点1.8086寻址方式2.重点掌握常用指令功能及应用常用传送指令算术运算指令(主要是加减法)逻辑运算和移位指令控制转移指令字符(串)输入输出功能调用3.18086的寻址方式从8086的机器代码格式入手,论述:立即数寻址方式寄存器寻址方式存储器寻址方式进而熟悉8086汇编语言指令格式,尤其是其中操作数的表达方法;为展开8086指令系统做好准备建议采用调试程序DEBUG进行实践调试程序DEBUGDEBUG是常用的汇编语言级调试工具,为汇编语言程序员提供了分析指令、跟踪程序的有效手段常用命令:-A汇编 -U反汇编-T单步执行 -G断点执行-D数据显示 -R寄存器感性认识因深刻而显重要指令的组成指令由操作码和操作数两部分组成操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分操作数是指令执行的参与者,即各种操作的对象有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数操作码操作数指令的操作码和操作数每种指令的操作码:用一个唯一的助记符表示(指令功能的英文缩写)对应着机器指令的一个二进制编码指令中的操作数:可以是一个具体的数值可以是存放数据的寄存器或指明数据在主存位置的存储器地址如何指明操作数呢?寻址方式指令系统设计了多种操作数的来源寻址就是寻找操作数的过程操作数采取哪一种寻址方式,会影响机器运行的速度和效率如何寻址一个操作数对程序设计很重要给出立即寻址方式需要的数值本身给出某些寻址方式需要的对基地址的偏移量3.1.18086的机器代码格式表明采用的寻址方式(表1.7)1/2字节0/1字节0/1/2字节0/1/2字节操作码modregr/m位移量立即数操作数要求:了解标准机器代码示例

mov

ax,[BP+0]

;机器代码是8B4600前一个字节8B是操作码(含w=1表示字操作)中间一个字节46(01000110)是“modregr/m”字节reg=000表示目的操作数为AXmod=01和r/m=110表示源操作数为[BP+D8]最后一个字节就是8位位移量〔D8=〕001/2字节0/1字节0/1/2字节0/1/2字节操作码modregr/m位移量立即数其它机器代码形式moval,05;机器代码是B005前一个字节B0是操作码(隐含一个操作数AL),后一个字节05是立即数movax,0102H;机器代码是B80201前一个字节B8是操作码(隐含一个操作数AX),后两个字节0201是16位立即数(低字节02在低地址)操作码操作数指令格式

操作码操作数1,操作数2

;注释操作数2,称为源操作数src,它表示参与指令操作的一个对象操作数1,称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果分号后的内容是对指令的解释示例传送指令MOV的格式MOV

dest,src

;dest←src

MOV指令的功能是将源操作数src传送至目的操作数dest,例如:MOVAL,05H ;AL←05HMOVBX,AX ;BX←AXMOVAX,[SI] ;AX←DS:[SI]MOVAX,[BP+06H] ;AX←SS:[BP+06H]MOVAX,[BX+SI] ;AX←DS:[BX+SI]演示传送指令MOV的功能源操作数src目的操作数dest30H30H被传送的数据3.1.2立即数寻址方式指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中)这种操作数被称为立即数imm它可以是8位数值i8(00H~FFH)也可以是16位数值i16(0000H~FFFFH)立即数寻址方式常用来给寄存器赋值立即数寻址指令MOVAL,05H ;AL←05HMOVAX,0102H ;AX←0102H立即寻址立即数寻址的特点:1)取指令时,操作码与操作数同时被取出,不需再访问存储器,可提高执行速度2)缺点是操作数在程序中是固定的,灵活性差,只适用于操作数固定的情况,如给寄存器或存储器变量赋初值等。例如mov

cx,1movax,0movx,50h3.1.3寄存器寻址方式操作数存放在CPU的内部寄存器reg中,可以是:8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP4个段寄存器seg:CS、DS、SS、ES寄存器寻址指令MOVAX,1234H ;AX←1234HMOVBX,AX ;BX←AX寄存器寻址设DH=78H,则执行

DECDH的结果是:DH=?寄存器寻址的特点:地址码短、速度快,适用于存放程序中频繁使用的操作数缺点是寄存器数量有限3.1.4存储器寻址方式指令中给出操作数的主存地址信息(偏移地址,称之为有效地址EA),而段地址在默认的或用段超越前缀指定的段寄存器中8086设计了多种存储器寻址方式1、直接寻址方式2、寄存器间接寻址方式3、寄存器相对寻址方式(即变址寻址)4、基址变址寻址方式5、相对基址变址寻址方式直接寻址方式指令中直接给出操作数在存储器中的偏移地址默认的段地址在DS段寄存器例如:

MOVAX,[2000H];指令代码:A10020功能:AX←DS:[2000H]MOVAX,ES:[2000H];AX←ES:[2000H]指令代码:26A10020直接寻址直接寻址方式另一种格式:用含有变量的表达式表示操作数的偏移地址,例如MOVAX,BUFA;将变量BUFA的内容送AXMOVDX,A3+2;将数据段中偏移地址为A3+2的单元的内容送DX举例:假设执行该指令前(DS)=1000H,变量A3在数据段中的定义如下,分析以上两指令的执行结果:

.DATAA1DB0BUFADB12,13,90A3DB20,30,40直接寻址方式直接寻址的特点:可以直接计算有效地址,只需访问一次存储器即可取得操作数,速度较快特别适合处理单个变量但直接寻址的存储器范围有限寄存器间接寻址方式寄存器中存放的是操作数的偏移地址EA可用寄存器有:BX、SI、DI、BP提示:当寄存器为BX、SI、DI时,默认的段地址在DS段寄存器中;当寄存器为BP时,默认的段寄存器是SS;也可使用段超越前缀改变。例如:MOVAX,[SI]

;AX←DS:[SI]间接寻址寄存器间接寻址方式例1:MOVAX,[SI][分析源操作数的有效地址的计算]设执行前,(AX)=0050H,(SI)=200H,(DS)=1000H,(10200H)=F000H,则指令的执行过程如下:首先计算有效地址PA=10000H+200H=10200H然后执行:(10200H)->AX例2:MOVAX,[BP]设执行前,(AX)=50H,(BP)=100H,(SS)=3000H,(30100H)00FCH,分析执行过程寄存器间接寻址方式特点:地址码中的寄存器中的内容位操作数的偏移地址用于存取存储器中的数据,方便灵活可以有效的缩短指令长度很常用阶段综合练习练习分析前面的几种寻址方式例题:见寻址综合练习1寄存器相对寻址方式

(即变址寻址)操作数的偏移地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP、SI、DI偏移地址=BX/BP/SI/DI+8/16位位移量BX/SI/DI寄存器对应的默认段寄存器是DS,即PA=(DS)左移4位+(EA)BP寄存器对应的默认段寄存器是SS也可用段超越前缀改变寄存器相对寻址指令MOVAX,[DI+06H]

;AX←DS:[DI+06H]MOVAX,[BP+06H]

;AX←SS:[BP+06H]MOVCX,[SI-6H]MOVDX,[BX+8H]分析有效地址的计算相对寻址寄存器相对寻址指令应用:常用于访问数组例如:求数组BUF的前10个元素之和的程序段MOVAX,0MOVBX,0MOVCX,10LOOPA:ADDAX,[BX+BUF]INCBXDECCXJNZLOOPA基址变址寻址方式偏移地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:偏移地址=BX/BP+SI/DI段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变基址变址寻址指令MOVAX,[BX+SI]

;AX←DS:[BX+SI]MOVAX,[BP+DI] ;AX←SS:[BP+DI]MOVAX,DS:[BP+DI] ;AX←DS:[BP+DI]基址变址相对基址变址寻址方式偏移地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:偏移地址=BX/BP+SI/DI+8/16位位移量段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变相对基址变址寻址指令MOVAX,[BX+SI+06H] ;AX←DS:[BX+SI+06H]

位移量可用符号表示

同一寻址方式有多种表达形式相对基址变址用符号表示位移量在寄存器相对寻址或相对基址变址寻址方式中,位移量可用符号表示:MOVAX,[SI+COUNT];COUNT是事先定义的变量或常量(就是数值)MOVAX,[BX+SI+WNUM];WNUM也是变量或常量多种表达形式同一寻址方式可以写成不同的形式:MOVAX,[BX][SI]

;等同于MOVAX,[BX+SI]MOVAX,COUNT[SI]

;等同于MOVAX,[SI+COUNT]MOVAX,WNUM[BX][SI]

;等同于MOVAX,WNUM[BX+SI]

;等同于MOVAX,[BX+SI+WNUM]指令操作数的表达-寄存器r8——任意一个8位通用寄存器AHALBHBLCHCLDHDLr16——任意一个16位通用寄存器AXBXCXDXSIDIBPSPreg——代表r8或r16seg——段寄存器CS/DS/ES/SS一定要熟悉噢!指令操作数的表达-存储器m8——一个8位存储器操作数单元(所有主存寻址方式)m16——一个16位存储器操作数单元(所有主存寻址方式)mem——代表m8或m16一定要熟悉噢!指令操作数的表达-立即数i8——一个8位立即数i16——一个16位立即数imm——代表i8或i16dest——目的操作数src——源操作数一定要熟悉噢!寻址方式综合练习2见寻址综合练习2什么是指令系统计算机的指令系统就是指该计算机能够执行的全部指令的集合每种计算机都有它支持的指令集合

16位8086指令系统是Intel80x86系列微处理器指令系统的基础8086指令系统概述Intel8086指令系统共有117条基本指令,可分成6个功能组①数据传送类指令②算术运算类指令③位操作类指令(含逻辑运算指令)④串操作类指令⑤控制转移类指令⑥处理机控制类指令说明:重点掌握①~④,其他以后逐渐掌握如何学习学习指令的要点指令的功能——该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等汇编语言指令格式由4部分组成:标号:指令助记符目的操作数,源操作数 ;注释

标号表示该指令在主存中的逻辑地址

每个指令助记符就代表一种指令

目的和源操作数表示参与操作的对象

注释是对该指令或程序段功能的说明其中,标号、操作数、注释根据指令的功能可选教学提示全面而准确地理解每条指令的功能和应用,是编写汇编语言程序的关键逐个展开指令2.1数据传送类指令数据传送指令是计算机中最基本、最重要、最常使用的一类指令传送指令把数据从一个位置传送到另一个位置除标志寄存器传送指令外,均不影响标志位重点掌握MOVXCHGXLATPUSHPOPLEA2.1.1通用数据传送指令3条指令MOVXCHGXLATMOVXCHGXLAT1.传送指令MOV(move)把一个字节或字的操作数从源地址传送至目的地址MOVreg/mem,imm;立即数送寄存器或主存MOV例题2.1MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存例题2.2MOVreg/seg,mem;主存送(段)寄存器例题2.3MOVreg/mem,seg;段寄存器送寄存器或主存例题2.5重点例3.1:立即数传送moval,4 ;al←4,字节传送movcx,0ffh ;cx←00ffh,字传送movsi,200h ;si←0200h,字传送mov

byteptr[si],0ah;byteptr

说明是字节操作mov

wordptr[si+2],0bh;wordptr

说明是字操作注意立即数是字节量还是字量明确指令是字节操作还是字操作MOV例3.2:寄存器传送mov

ax,bx

;ax←bx,字传送movah,al ;ah←al,字节传送mov

ds,ax

;ds←ax,字传送mov[bx],al

;[bx]←al,字节传送MOV例3.3:存储器传送mov

al,[bx]mov

dx,[bp] ;dx←ss:[bp]mov

es,[si] ;es←ds:[si]不存在存储器向存储器的传送指令MOV例3.5:段寄存器传送mov[si],dsmov

ax,es

;ax←esmov

ds,ax

;ds←ax←es对段寄存器的操作有一些限制MOVMOV指令传送功能MOV也并非任意传送立即数段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存储器非法传送:两个操作数的类型不一致例如源操作数是字节,而目的操作数是字;或相反两个操作数不能都是存储器传送指令很灵活,但主存之间的直接传送却不允许段寄存器的操作有一些限制段寄存器属专用寄存器,对他们的操作能力有限示例示例示例两个操作数的类型要一致绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令MOVAL,050AH;非法指令:050Ah为字,而AL为字节寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byteptr指示字节类型,wordptr指示字类型两个操作数不能都是存储器8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种传送,可通过寄存器间接实现movax,buffer1;ax←buffer1(将buffer1内容送ax)movbuffer2,ax;buffer2←ax;这里buffer1和buffer2是两个字变量;实际表示直接寻址方式要小心段寄存器的操作不允许立即数传送给段寄存器MOVDS,100H;非法指令:立即数不能传送段寄存器不允许直接改变CS值MOVCS,[SI]

;不允许使用的指令不允许段寄存器之间的直接数据传送MOVDS,ES;非法指令:不允许段寄存器间传送2.交换指令XCHG(exchange)把两个地方的数据进行互换寄存器与寄存器之间对换数据寄存器与存储器之间对换数据不能在存储器与存储器之间对换数据XCHGXCHGreg,reg/mem;reg

reg/mem例题2.7例题2.6重点例3.6:寄存器间交换movax,1234h

;ax=1234hmovbx,5678h ;bx=5678hxchg

ax,bx;ax=5678h,bx=1234hxchgah,al ;ax=7856hXCHG例3.7:寄存器与存储器交换xchgax,[2000h]

;字交换;等同于

xchg[2000h],axxchgal,[2000h]

;字节交换;等同于

xchg[2000h],al

XCHG应用:换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码。表格首地址存放于BX,AL存放相对表格首地址的位移量换码指令执行后:将AL寄存器的内容转换为目标代码3.换码指令XLAT(translate)即查表转换指令:将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给ALXLATXLAT ;al←ds:[bx+al]例题2.8重点例3.8:代码转换假设自数据段100h初开始存放一下数据:10、20、30、40、50、90则执行以下指令后al的值?movbx,100hmoval,03hxlat换码指令没有显式的操作数,但使用了BX和AL;因为换码指令使用了隐含寻址方式——采用默认操作数XLAT2.1.2堆栈操作指令堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定栈顶是地址较小的一端(低端),栈底不变第2章堆栈和队列堆栈:按照后进先出(LIFO)的原则组织的存储器空间(栈)队列:按照先进先出(FIFO)的原则组织的存储器空间LIFOFIFO堆栈的操作堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POPPUSH;进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部POP;出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2重点第2章1.进栈指令PUSHPUSHpushaxpush[2000h]PUSHr16/m16/seg;SP←SP-2;SS:[SP]←r16/m16/seg第2章2.出栈指令POPpopaxpop[2000h]POPr16/m16/seg;r16/m16/seg←SS:[SP];SP←SP+2POP堆栈的特点堆栈操作的单位是字,进栈和出栈只对字量字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据堆栈常用来临时存放数据传递参数保存和恢复寄存器例题2.11例3.11:现场保护恢复pushax ;进入子程序后pushbxpushds...popds

;返回主程序前popbxpopax2.1.3标志传送指令标志寄存器传送指令用来传送标志寄存器FLAGS的内容标志位操作指令直接对CF、DF、IF标志进行复位或置位1.标志寄存器传送标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作有2对4条指令低8位传送:LAHF和SAHF16位传送:PUSHF和POPF标志低字节进出AH指令LAHF;AH←FLAGS的低字节LAHF指令将标志寄存器的低字节送寄存器AHSF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意SAHF;FLAGS的低字节←AHSAHF将AH寄存器内容送FLAGS的低字节用AH的第7/6/4/2/0位相应设置SF/ZF/AF/PF/CF标志第2章标志寄存器进出堆栈指令PUSHF;SP←SP-2;SS:[SP]←FLAGSPUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2POPF;FLAGS←SS:[SP];SP←SP+2POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2例题2.12第2章思考:将标志寄存器的内容送ax,如何实现?例3.12:置位单步标志pushf

;保存全部标志到堆栈popax ;从堆栈中取出全部标志orax,0100h ;设置D8=TF=1,

;ax其他位不变pushax ;将ax压入堆栈popf

;FLAGS←AX;将堆栈内容取到标志寄存器2.标志位操作标志位操作指令直接对CF、DF、IF标志进行复位或置位,常用于特定的情况对标志位进行设置的指令CLC

STC

CMCCLD

STDCLI

STI

(了解)进位标志操作指令用于任意设置进位标志CLC

;复位进位标志:CF←0STC

;置位进位标志:CF←1CMC

;求反进位标志:CF←~CF方向标志操作指令串操作指令中,需要使用CLD

;复位方向标志:DF←0STD

;置位方向标志:DF←1中断标志操作指令在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止CLI

;复位中断标志:DF←0STI

;置位中断标志:DF←12.1.4地址传送指令地址传送指令将存储器单元的逻辑地址送至指定的寄存器偏移地址传送指令LEA(重点掌握)指针传送指令LDS和LES特别注意:不是获取存储器单元的内容有效地址传送指令LEA(loadEA)将存储器操作数的偏移地址传送至指定的16位寄存器中例题2.13LEAr16,mem;r16←mem的偏移地址EALEA重点例3.13:获取偏移地址.dataxdb20hnumdb11h,33h,45h……leabx,num等价于mov

bx,offsetnum获得主存单元的有效地址;不是物理地址,也不是该单元的内容LEA指针传送指令(了解)LDSr16,mem;r16←mem,;DS←mem+2LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器LESr16,mem;r16←mem,;ES←mem+2LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器例题2.14第2章例3.14:地址指针传送movwordptr[3060h],0100hmovwordptr[3062h],1450hlesdi,[3060h] ;es=1450h,di=0100hldssi,[3060h] ;ds=1450h,si=0100h

mem指定主存的连续4个字节作为逻辑地址(32位的地址指针),送入DS:r16或ES:r162.1.5输入输出指令(熟悉)8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地址8086用于寻址外设端口的地址线为16条,端口最多为216=65536(64K)个,端口号为0000H~FFFFH每个端口用于传送一个字节的外设数据输入输出寻址方式8086的端口有64K个,无需分段,设计有两种寻址方式直接寻址:只用于寻址00H~FFH前256个端口,操作数i8表示端口号间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号注:对大于FFH的端口只能采用间接寻址方式输入指令IN将外设数据传送给CPU内的AL/AXINAL,i8;字节输入:AL←I/O端口(i8直接寻址)INAL,DX;字节输入:AL←I/O端口(DX间接寻址)INAX,i8;字输入:AX←I/O端口(i8直接寻址)INAX,DX;字输入:AX←I/O端口(DX间接寻址)IN例题2.15例3.15:输入字量;直接寻址,字节量输入inal,21hmovah,alinal,20h;直接寻址,字量输入inax,20h;间接寻址,字量输入movdx,20hinax,dx两段功能相同字量数据传送实际上实现了连续的两个端口地址的字节量传送IN输出指令OUT将CPU内的AL/AX数据传送给外设OUTi8,AL;字节输出:I/O端口←AL(i8直接寻址)OUTDX,AL;字节输出:I/O端口←AL(DX间接寻址)OUTi8,AX;字输出:I/O端口←AX(i8直接寻址)OUTDX,AX;字输出:I/O端口←AX(DX间接寻址)OUT例题2.16例3.16:输出字节量;间接寻址,字节量输出movdx,3fchmoval,80houtdx,alOUT阶段练习1编写程序段并用debug调试:2.12.32.52.26(1)至少用2种方法(作业)2.2算术运算类指令问题:在汇编语言中,数学表达式

A*B+C-12如何描述?答案:用算术运算指令实现二进制(和十进制)数据的四则运算学习提示:注意算术运算类指令对标志的影响重点掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP熟悉:MUL/IMUL、DIV/IDIV、CBW/CWD了解:DAA/DAS、AAA/AAS/AAM/AAD加法指令ADDADD指令将源与目的操作数相加,结果送到目的操作数ADD指令影响标志位ADDADDreg,imm/reg/mem

;reg←reg+imm/reg/memADDmem,imm/reg

;mem←mem+imm/reg例题2.17a例3.17a:加法运算moval,0fbh ;al=0fbhaddal,07h

;al=02hmov

wordptr[200h],4652h;[200h]=4652hmovbx,1feh

;bx=1fehaddal,bl

;al=00haddwordptr[bx+2],0f0f0h;[200h]=3742hADD带进位加法指令ADCADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数ADC指令影响状态标志位应用:ADC指令主要与ADD配合,实现多精度加法运算(即多字节数相加,如双字)ADCADCreg,imm/reg/mem

;reg←reg+imm/reg/mem+CFADCmem,imm/reg

;mem←mem+imm/reg+CF例题2.17bTip:双字加法中,一般用ax保存低位,dx保存高位例3.17b:双字加法movax,4652h ;ax=4652haddax,0f0f0h ;ax=3742h,CF=1movdx,0234h ;dx=0234hadcdx,0f0f0h ;dx=f325h,CF=0;DX.AX=02344652H

+F0F0F0F0H

=F3253742HADC增量指令INC(increment)INC指令对操作数加1(增量)INC指令不影响进位CF标志,按定义设置其他状态标志INCINCreg/mem;reg/mem←reg/mem+1incbxincbyteptr[bx]减法指令SUB(subtract)SUB指令将目的操作数减去源操作数,结果送到目的操作数SUB指令按照定义相应设置状态标志SUBSUBreg,imm/reg/mem

;reg←reg-imm/reg/memSUBmem,imm/reg

;mem←mem-imm/reg例题2.18a例3.18a:减法运算moval,0fbh ;al=0fbhsubal,07h

;al=0f4h,CF=0movwordptr[200h],4652h;[200h]=4652hmovbx,1feh

;bx=1fehsubal,bl

;al=0f6hsubwordptr[bx+2],0f0f0h;[200h]=5562h,CF=1注:补码运算[X-Y]补=[X]补+[-Y]补SUB带借位减法指令SBBSBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。SBB指令影响状态标志应用:SBB指令主要与SUB配合,实现多精度减法运算(即多字节减法)SBBSBBreg,imm/reg/mem

;reg←reg-imm/reg/mem-CFSBBmem,imm/reg

;mem←mem-imm/reg-CF例题2.18b例3.18b:双字减法movax,4652h ;ax=4652hsubax,0f0f0h ;ax=5562h,CF=1movdx,0234h ;dx=0234hsbbdx,0f0f0h ;dx=1143h,CF=1;DX.AX=02344652H

-F0F0F0F0H

=11435562HSBB注意AX、DX的使用减量指令DEC(decrement)DEC指令对操作数减1(减量)DEC指令不影响进位CF标志,按定义设置其他状态标志DECDECreg/mem;reg/mem←reg/mem-1dec

cxdecwordptr[si]

INC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整求补指令NEG(negative)NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数求补运算也可以表达成:将操作数按位取反后加1影响标志位用于求一个数的相反数NEGNEGreg/mem;reg/mem←0-reg/mem例题2.19例3.19:求补运算movax,0ff64hnegal;ax=ff9ch,OF=0、SF=1、ZF=0、PF=1、CF=1subal,9dh;ax=ffffh,OF=0、SF=1、ZF=0、PF=1、CF=1negax;ax=0001h,OF=0、SF=0、ZF=0、PF=0、CF=1decal;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=1negax;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=0NEG比较指令CMP(compare)CMP指令将目的操作数减去源操作数,但结果不回送目的操作数(与SUB指令不同)影响状态标志位CMPreg,imm/reg/mem

;reg-imm/reg/memCMPmem,imm/reg

;mem-imm/reg例题2.20CMP很常用例3.20:比较AL与100

cmpal,100

;al-100

jbbelow

;al<100,跳转到below执行

subal,100

;al≥100, al←al-100 incah

;ah←ah+1below: ...执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等CMP2.2.3乘法指令MULr8/m8;无符号字节乘法;AX←AL×r8/m8MULr16/m16;无符号字乘法;DX.AX←AX×r16/m16IMULr8/m8;有符号字节乘法;AX←AL×r8/m8IMULr16/m16;有符号字乘法;DX.AX←AX×r16/m16例题2.21说明第2章乘法指令的功能乘法指令分无符号和有符号乘法指令乘法指令的源操作数显式给出,隐含使用另一个操作数AX和DX字节量相乘:AL与r8/m8相乘,得到16位的结果,存入AX字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX乘法指令利用OF和CF判断乘积的高一半是否具有有效数值乘法指令对标志的影响乘法指令影响OF和CF标志:MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1乘法指令对其他状态标志没有定义对标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1)对标志没有影响:指令执行不改变标志状态了解例3.21:乘法运算moval,0b4h ;al=b4h=180movbl,11h ;bl=11h=17mul

bl

;ax=Obf4h=3060;OF=CF=1,AX高8位不为0moval,0b4h ;al=b4h=-76movbl,11h ;bl=11h=17imul

bl

;ax=faf4h=-1292;OF=CF=1,AX高8位含有效数字2.2.4除法指令DIVr8/m8

;无符号字节除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数DIVr16/m16

;无符号字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数IDIVr8/m8 ;有符号字节除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数IDIVr16/m16 ;有符号字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数例题2.22说明第2章除法指令的功能除法指令分无符号和有符号除法指令除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX除法指令对标志没有定义除法指令会产生结果溢出除法错中断——溢出中断当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断——除法错中断对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,或者在字除时商不在-32768~32767范围内,则发生除法溢出例3.22:除法运算movax,0400h ;ax=400h=1024movbl,0b4h ;bl=b4h=180divbl

;商al=05h=5

;余数ah=7ch=124movax,0400h ;ax=400h=1024movbl,0b4h ;bl=b4h=-76idiv

bl

;商al=f3h=-13

;余数ah=24h=36问题:当被除数与除数都是8位/16位的数据时,如何使用除法指令进行运算?措施:将被除数进行符号扩展2.2.5符号扩展指令CBW ;将AL的符号扩展至AH;如AL的最高有效位是0,则AH=00;AL的最高有效位为1,则AH=FFH。AL不变CWD

;将AX的符号扩展至DX;如AX的最高有效位是0,则DX=00;AX的最高有效位为1,则DX=FFFFH。AX不变什么是符号扩展符号扩展指令常用于获得倍长的数据不影响标志位例题2.23例题2.24第2章符号扩展的概念符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数中扩展后的各位是全0(正数)或全1(负数)。符号扩展不改变数据大小对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100)对于数据0f7H(表示有符号数-9),其最高位D7为1,符号扩展后高8位都是1,成为fff7H(仍表示有符号数-9)例3.23:符号扩展moval,80h

;al=80hcbw

;ax=ff80haddal,255 ;al=7fhcbw

;ax=007fh例3.24:AX÷BXcwd

;DX.AX←AXidiv

bx

;AX←DX.AX÷BX对于有符号数:利用符号扩展指令得到除法指令所需要的倍长于除数的被除数对无符号数:应该采用直接使高8位或高16位清0的方法,获得倍长的被除数2.2.6十进制调整指令压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即00~99非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位0~9,高4位任意,通常默认为0十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果分成压缩BCD码和非压缩BCD码调整第2章BCD码(BinaryCodedDecimal)二进制编码的十进制数:一位十进制数用4位二进制编码来表示8086支持压缩BCD码和非压缩BCD码的调整运算真值 8 64二进制编码 08H

40H压缩BCD码 08H

64H非压缩BCD码 08H

0604H区分:压缩BCD码和非压缩BCD码压缩BCD码加、减调整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)DAA;AL←将AL的加和调整为压缩BCD码(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8)DAS;AL←将AL的减差调整为压缩BCD码使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令DAA和DAS指令对OF标志无定义,按结果影响其他标志,例如CF反映压缩BCD码相加或减的进位或借位状态第2章例题2.25a例题2.25b例题2.26例3.25a:压缩BCD加法moval,68h;al=68h,压缩BCD码表示真值68movbl,28h;bl=28h,压缩BCD码表示真值28addal,bl;二进制加法:al=68h+28h=90hdaa

;十进制调整:al=96h;实现压缩BCD码加法:68+28=96例3.25b:压缩BCD减法moval,68h;al=68h,压缩BCD码表示真值68movbl,28h;bl=28h,压缩BCD码表示真值28subal,bl;二进制减法:al=68h-28h=40hdas

;十进制调整:al=40h;实现压缩BCD码加法:68-28=40例3.26:压缩BCD减法movax,1234hmovbx,4612hsubal,bldas

;34-12=22,CF=0xchgal,ahsbb

al,bhdas

;12-46=66,CF=1xchgal,ah ;11234-4612=6622非压缩BCD码加、减调整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)AAA;AL←将AL的加和调整为非压缩BCD码;AH←AH+调整的进位(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8)AAS;AL←将AL的减差调整为非压缩BCD码;AH←AH-调整的借位使用AAA或AAS指令前,应先执行以AL为目的操

温馨提示

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

评论

0/150

提交评论