微机原理与接口技术 南京信息工程大学第3章-80X86微处理器指令系统_第1页
微机原理与接口技术 南京信息工程大学第3章-80X86微处理器指令系统_第2页
微机原理与接口技术 南京信息工程大学第3章-80X86微处理器指令系统_第3页
微机原理与接口技术 南京信息工程大学第3章-80X86微处理器指令系统_第4页
微机原理与接口技术 南京信息工程大学第3章-80X86微处理器指令系统_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

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

文档简介

第3章80X86微处理器指令系统1NUIST主要内容寻址方式8086/8088指令系统32位处理器指令系统2隐含于机器指令内3.1寻址方式处理的数据在什么地方?要处理的数据有多长?操作码操作数……操作数指令的一般格式:33.1寻址方式操作码指计算机所要执行的操作,是一种助记符。操作数在指令执行操作的过程中所需要的数据。该字段可以是操作数本身,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。

如何寻找操作数就是寻址方式4立即寻址汇编指令机器码用C语言描述MOVAX,10HB81000H(AX)=16MOVAL,28HB028H(AL)=40操作数直接放在指令中,紧跟在操作码后,与操作码一起放在代码段5立即寻址B8H10H00HB0H28H操作码操作数操作码操作数MOV AX,0010HAHAL10H00HMOV AL,28HAL28H代码段6立即寻址立即数只能作源操作数,不能作目标操作数。立即数应与目标操作数的长度一致立即数默认采用十进制,采用十六进制数以“H”为后缀,2进制数以“B”为后缀。以16进制形式出现的立即数,若以字母开头,需以数字0为前缀。立即数只能是整数,不能是小数或其他类型的数据。注意7寄存器寻址汇编指令机器码用C语言描述指令执行前数据的位置

MOVAX,BXB9D8H(AX)=(BX)CPU内寄存器BXMOVAL,BL88DBH(AL)=(BL)CPU内寄存器BL操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。寄存器可以是8位或者16位。8寄存器寻址B9HD8H操作码MOV AX,BXAXBX1234H1234H代码段9寄存器寻址源操作数的长度必须与目的操作数一致。16位操作数:AX,BX,CX,DX,DI,SI,SP和BP等8位操作数:AH,AL,BH,BL,CH,CL,DH和DL两个操作数不能同时为段寄存器目标操作数不能为CS注意10直接寻址汇编指令机器码指令执行前数据的位置

MOVAX,[2]A10200H内存的DS:2~3单元MOVAL,[2]A00200H内存的DS:2单元MOVBX,ES:[2]8B1E0200H

内存的ES:2~3单元操作数在内存中,指令中以具体数值的形式给出操作数所在单元的有效地址EA。逻辑地址为段地址(SA):偏移地址(EA)。11直接寻址A0H02H00H1234操作码代码段567810000H20000H20001H20002H20003H地址低位地址高位数据段20DS00MOV AL,[0002H]20000H+0002H20002H偏移量左移4位AL56H12直接寻址A1H02H00H1234操作码代码段567810000H20000H20001H20002H20003H地址低位地址高位数据段20DS00MOV AX,[0002H]20000H+0002H20002H偏移量左移4位AL56HAH78H13寄存器间接寻址操作数在内存中,操作数地址的16位EA包含在以下寄存器SI、DI、BP、BX中。为了区别于寄存器寻址方式,指令中指定的寄存器名要用“[]”括起来。分成两种情况:以SI、DI、BX间接寻址,则通常操作数在现行数据段区域中,此时(DS)×16+[REG]

为操作数的地址,REG表示寄存器可以是SI、DI、BX。以寄存器BP间接寻址,操作数在堆栈段中。即(SS)×16+(BP)作为操作数的地址。14寄存器间接寻址B8H04H1234操作码代码段567810000H21000H21001H21002H21003H数据段20DS00MOV AX,[SI]20000H+1000H21000H左移4位MOV SI,1000H10SI00AL12HAH34H15寄存器相对寻址操作数在存储器中,由指定的寄存器内容,加上指令中给出的8位或16位偏移量作为操作数的偏移地址。寄存器为四个寄存器SI、DI、BX、BP之一

寻址方式含义[BX+idata]/idata[BX]EA=(BX)+idata,SA=(DS)[SI+idata]/idata[SI]EA=(SI)+idata,SA=(DS)[DI+idata]/idata[DI]EA=(DI)+idata,SA=(DS)[BP+idata]/idata[BP]EA=(BP)+idata,SA=(SS)16寄存器相对寻址B8H47H011234操作码代码段567810000H21000H21001H21002H21003H数据段20DS00MOV AX,[BX+1]20000H1000H21001H左移4位MOV BX,1000H10BX00AL34HAH56H+0001H17基址加变址寻址操作数在存储器中其偏移地址由(基址寄存器)+(变址寄存器)形成基址寄存器——BX(数据段),BP(堆栈段)

变址寄存器——SI、DI

寻址方式含义[BX+SI]/[BX][SI]EA=(BX)+(SI),SA=(DS)[BX+DI]/[BX][DI]EA=(BX)+(DI),SA=(DS)[BP+SI]/[BP][SI]EA=(BP)+(SI),SA=(SS)[BP+DI]/[BX][DI]EA=(BP)+(DI),SA=(SS)18基址加变址寻址8BH00H1234操作码代码段567810000H21000H21001H21002H21003H数据段20DS00MOV AX,[BX+SI]20000H1000H21001H左移4位MOV BX,1000H10BX00AL34HAH56H+0001HMOV SI,0001H00SI0119相对基址变址寻址操作数在存储器中偏移地址:(基址寄存器)+(变址寄存器)+相对偏移量寻址方式含义[BX+SI+idata]/idata[BX][SI]EA=(BX)+(SI)+idata,SA=(DS)[BX+DI+idata]/idata[BX][DI]EA=(BX)+(DI)+idata,SA=(DS)[BP+SI+idata]/idata[BP][SI]EA=(BP)+(SI)+idata,SA=(SS)[BP+DI+idata]/idata[BX][DI]EA=(BP)+(DI)+idata,SA=(SS)20相对基址变址寻址8BH40H011234操作码代码段567810000H21000H21001H21002H21003H数据段20DS00MOV AX,[BX+SI+1]20000H1000H21002H左移4位MOV BX,1000H10BX00AL56HAH78H0001HMOV SI,0001H00SI01+0001H21寻址方式小结从直接寻址方式开始的寻址方式中,操作数都存放在除代码段以外的内存区域中,通过求得操作数所在的有效地址,取得操作数。比较这几种寻址方式:

[idata]用一个常量来表示地址,可以用于直接定位一个内存单元;[BX]用一个变量来表示内存地址,可以用于间接定位一个内存单元;[BX+idata]用一个变量和常量来表示地址,可以在一个起始地址的基础上用变量间接定位一个内存单元;[BX+SI]用两个变量表示地址;[BX+SI+idata]用两个变量和一个常量表示地址。22寻址方式小结

有关带[]地址表达式必须遵守下列规则:立即数可以出现在[]内,表示直接地址,如[1000H]只有BX、BP、SI和DI四个寄存器可以出现在[]内,它们可以单独出现,也可以组合起来(只能相加),或以常数与寄存器相加的形式出现,但BX和BP寄存器不允许出现在同一个[]内,SI和DI也不能同时出现。23寻址方式小结

有关带[]地址表达式必须遵守下列规则:由于方括号有相加的含义,下面几种方法是等价的6[BX][SI] [BX+6][SI] [BX+SI+6]6[BX+SI]若[]内包含BP,则隐含使用SS来提供基地址,物理地址=16SS+EA其余情况隐含使用DS提供基地址段超越前缀的使用24课堂练习指出下列指令中源操作数和目的操作数的寻址方式MOVBX,20HMOVDX,[SI]MOV[BP][SI],AXMOV[1800H],AL指令源操作数目的操作数立即寻址寄存器寻址寄存器间接寻址寄存器寻址寄存器寻址基址加变址寻址寄存器寻址直接寻址25课堂练习判断下列操作数寻址方式的正确性操作数判断错误原因AX不能用于寄存器间接寻址[AX]BPDS[BX+BP+32][CX+90]BX+90H

BX和BP都是基址寄存器

CX不能用于寄存器相对寻址

无此寻址方式26NUIST主要内容寻址方式8086/8088指令系统32位处理器指令系统273.2指令系统数据传送指令1算术运算指令2逻辑运算指令3移位指令和循环移位指令4处理器控制指令5283.2.1数据传送指令MOV指令栈指令交换指令累加器专用传送指令地址传送指令标志位传送指令29MOV指令格式:MOVDST,SRC;(DST)←(SRC)说明:MOV是操作码,DST和SRC分别是目的操作数和源操作数。执行后,目的操作数改变,源操作数不变。指令格式举例MOVREG,idataMOVAX,8MOVREG,REGMOVBX,AXMOVREG,MEMMOVAX,[0000H]MOVMEM,REGMOV[0000H],AX30MOV指令格式:MOVDST,SRC;(DST)←(SRC)说明:MOV是操作码,DST和SRC分别是目的操作数和源操作数。执行后,目的操作数改变,源操作数不变。指令格式举例MOVSREG,REGMOVDS,AXMOVREG,SREGMOVAX,DSMOVSREG,MEMMOVDS,[0000H]MOVMEM,SREGMOV[0000H],DSMOVMEM,idataMOVBYTEPTR[0000H],01H31MOV指令运行传送数据的途径存储器MEM立即数idata段寄存器CS,DS,ES,SS通用寄存器AX,AHBX,ALCX,BHDX,BLSI,CHDI,CLSP,DHBP,DL32MOV指令立即数和CS只能作为源操作数IP和FR都不允许作为源操作数和目的操作数立即数不允许直接送至DS,ES,SS或CS源操作数和目的操作数不能同时是内存操作数源操作数和目的操作数必须类型相同(同为字节或字类型)注意33MOV指令存储器传送指令中,不允许对CS和IP进行操作;不允许两个存储器操作数之间直接进行信息传送两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值目的操作数,不能用立即寻址方式;操作数类型要匹配,字对字,字节对字节传送。MOVIP,0010HMOVCS,AXMOV[1230H],[0010H]MOVAX,[0010H],MOV[1230H],AXMOVDS,SSMOVDS,1000HMOV1234H,AXMOVBX,AL34栈指令栈是一种具有特殊访问方式的存储空间,它的特殊性就在于,最后进入这个空间的数据最先出去(后进先出)1234在基于8086CPU编程的时候,可以通过指令将一段内存当作栈来使用。栈空间的使用是从高地址往低地址方向的。栈底栈顶35栈指令CPU如何知道哪一段内存空间作为栈空间使用?CPU如何知道栈顶的位置?

回忆寄存器SS和SP的作用是什么任意时刻SS:SP指向栈顶元素。36栈指令PUSH和POP指令指令格式说明PUSHREG将一个寄存器中的数据入栈PUSHSREG将一个段寄存器中的数据入栈PUSHMEM将内存单元处的字入栈POPREG将栈顶的数据送入一个寄存器中POPSREG将栈顶的数据送入一个段寄存器中(不能是CS)POPMEM将栈顶的数据送入内存单元两个操作都是以字为单位进行的37栈指令PUSHAX的执行过程(1)(SP)=(SP)

2,SS:SP指向当前栈顶前面的单元,以当前栈顶上面的单元为新的栈顶;(2)将AX中的内容送入SS:SP指向的内存单元处,此时SS:SP指向新栈顶。1234AX20000H2000AH2000BH2000CH2000DH2000EH2000FH20010HSS:SP123438栈指令POPBX的执行过程(1)将SS:SP指向的内存单元处的一个字数据送入BX中

;(2)(SP)=(SP)

+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶

BX20000H2000AH2000BH2000CH2000DH2000EH2000FH20010HSS:SP123439栈指令栈指令与MOV指令的区别PUSH和POP指令访问的内存单元地址不是在指令中给出的,而是由SS:SP指出的;CPU执行MOV指令只需要一步操作;而执行PUSH和POP指令则要分两步,先修改SP,然后向SS:SP传送,或先取SS:SP处的数据,后改变SP。40分析两段指令的执行结果MOVAX,2000HMOVDS,AXMOVAX,1234HMOV[0000H],AXMOV AX,2000HMOV SS,AXMOV SP,2MOV AX,1234HPUSHAX2000HAX2000HDS1234HAXDS:020000H20001H20002H20003H12342000HAX2000HSS0002HSPSS:SP20000H20001H20002H20003H1234HAX123441课堂练习设(SS)=1250H,(SP)=0240H,若在堆栈中取出2个数据,则栈顶的物理地址为

H,如果又在栈中存入5个数据,则栈顶的物理地址为

H。初始时刻栈顶物理地址=(SS)×16+(SP)=12500H+0240H=12740H取出2个数据后,(SP)=(SP)+4当前栈顶物理地址

=12740H+4=12744H再存入5个数据后,(SP)=(SP)-10当前栈顶物理地址

=12744H-10=1273AH127441273A42交换指令交换指令XCHG的作用是把一个字节或一个字的源操作数与目的操作数相交换

指令格式举例XCHGREG,REGXCHGCL,BLXCHGREG,MEMXCHGBX,[0]XCHGMEM,REGXCHG[0],BX43交换指令交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存储器之间进行但段寄存器和立即数不能作为一个操作数,不能在累加器之间进行。如果需要交换两个内存操作数,需要使用一个寄存器作为临时存储容器,并把MOV指令和XCHG指令结合起来使用MOVAX,[0100H]XCHGAX,[1000H]MOV[0100H],AX

如何用堆栈实现同样的功能?44DS:0100HDS:1000HDS:0101HDS:1001H…34127856交换指令MOV AX,[0100H]XCHGAX,[1000H]MOV[0100H],AX12345678栈底栈顶PUSH[0100H]PUSH[1000H]POP[0100H]POP[1000H]5678123445累加器专用传送指令

IN指令从I/O端口输入数据至AL或AX指令格式含义INAL,port(AL)←(port)INAX,port(AX)←(port+1)(port)INAL,DX(AL)←((DX))INAX,DX(AX)←((DX+1),(DX))46累加器专用传送指令OUT指令将AL或AX中的内容传送到一个输出端口指令格式含义OUTport,AL(AL)→(port)OUTport,AX(AX)→(port+1)(port)OUTDX,AL(AL)→((DX))OUTDX,AX(AX)→((DX+1),(DX))若端口地址超过255时,则必须用DX保存端口地址,这样用DX作端口寻址最多可寻找64K个端口。47课堂练习22H226EH20H1020H已知AX=1020H,DX=3080H,端口地址PORT=41H,(40H)=6EH,(41H)=22H,指出下列各条指令执行的结果(1)INAL,PORT;AL=

.(2)INAX,40H;AX=.(3)OUTDX,AL;(DX)=.(4)OUTDX,AX;(DX)=

.48XLAT指令一般格式XLAT;(AL)=((DS)

×16+(BX)

+(AL))要求:①寄存器AL的内容作为一个256字节的表的下标;②表的基地址在BX中;③转换后的结果存放在AL中.49XLAT指令例3-1:已知AL中有一个0~9范围内的数,试用查表指令写出能查找出该数平方值的程序分析:为了进行查表,必须确定一张0~9的平方值表。若平方值表的起始地址为21000H,则相应平方值表如图:表中AL中之数恰好等于该数平方值对表起始地址的偏移量设(DS)=2000H21000H21001H21002H21003H21004H21005H21006H21007H21008H21009H…0149162536496481…50XLAT指令例3-1:已知AL中有一个0~9范围内的数,试用查表指令写出能查找出该数平方值的程序21000H21001H21002H21003H21004H21005H21006H21007H21008H21009H…0149162536496481…MOVAX,2000H ;取平方表的段地址MOVDS,AXMOVBX,1000H ;取平方表的偏移地址MOVAL,06H ;AL中为待查找的数XLATBXBX+ALAL3651地址传送指令

LEAREG,SRC功能:把源操作数SRC的地址偏移量传送至寄存器REG。要求:①源操作数的寻址方式不能是立即数和寄存器方式;②目的操作数必须是一个16位的通用寄存器,但不能是段寄存器。LEAAX,[SI+20H]MOVAX,[SI+20H]0120HAX01ABAX假设(SI)=0100H,(DS)=0200H52地址传送指令LDSREG16,m32功能:将源操作数m32的有效地址所对应的内存单元的32位内容分别送入DS和指令所指出的寄存器REG中。REG16←m32低16位,DS←m32高16位要求:源操作数的寻址方式不能是立即数和寄存器方式;目的操作数是不能是段寄存器。LESREG16,m32这条指令除将地址指针的段地址部分送入ES外,与LDS类似。53课堂练习设DS=1200H,(12450H)=F346H,(12452H)=0A90H,执行指令LDSSI,[450H]后SI=

,DS=

.F346H0A90H54课堂练习试比较下列3组指令的功能(1)(2)(3)LDSSI,[DI]MOVSI,[DI]MOVDS,[DI+2]MOVDS,[DI+2]MOVSI,[DI](1)和(2)的功能相同(3)的第一条指令修改了DS的值,因此执行第二条指令后结果可能与(1)(2)不同。55标志位传送指令LAHF

功能:(AH)←(FLAGS的低字节),即将标志寄存器的低字节送寄存器AH,即状态标志位SF、ZF、AF、PF、CF分别送AH的D7、D6、D4、D2、D0位,而AH的D5、D3、D1位任意。56标志位传送指令SAHF

功能:(FLAGS的低字节)←(AH),即将寄存器AH送标志寄存器的低字节,即根据AH的D7、D6、D4、D2、D0位相应设置SF、ZF、AF、PF、CF标志。57标志位传送指令PUSHF功能:(SP)←(SP)−2,((SP)+1,(SP))←(FLAGS),即将标志寄存器的内容压入堆栈,同时栈顶指针SP减2。这条指令可用保护调用过程以前的标志寄存器的值。58标志位传送指令POPF功能:(FLAGS)←((SP)+1,(SP)),(SP)←(SP)+2,即将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2。该指令用于在过程返回以后恢复标志状态。59课堂练习操作数判断错误原因CS不能做目的操作数MOVCS,BXPUSHALMOVCH,100HPUSHCS

栈操作指令的操作数必须是字类型源操作数超出目的操作数表示范围判断下列指令的对错,如果错误请说明原因

60课后作业 给出MOV指令执行后的结果,设有关寄存器及存储单元内容如下:

DS=2000H,ES=2200H,BX=0100H,SI=0004H, (22100H)=12H,(22101H)=34H,(22102H)=56H, (22103H)=78H,(22104H)=9AH,(22105H)=0BCH, (20100H)=1AH,(20101H)=2BH,(20103H)=3CH, (20104H)=4DH,(20105H)=5EH,(20106H)=6FH,61课后作业

(1)MOVAX,ES:[BX][SI] (2)MOVAX,BX (3)MOVAX,[BX] (4)MOVAX,[BX+SI] (5)MOVAX,[BX+SI+01]623.2指令系统数据传送指令1算术运算指令2逻辑运算指令3移位指令和循环移位指令4处理器控制指令5633.2.2算术运算指令加法指令减法指令乘除法指令符号扩展指令十进制调整指令64加法指令:ADDADD指令ADDDST,SCR;(DST)←(DST)+(SCR)指令格式举例ADDREG,idataADDAX,8ADDREG,REGADDAX,BXADDREG,MEMADDAX,[0]ADDMEM,REGADD[0],ALADDMEM,idataADDWORDPTR[0000H],1234H

65例3-2试分析执行如下指令后AL和FR各标志位的变化状况。MOV AL, 99HADD AL, 99HMOV AL, 3FHADD AL, 50H加法指令:ADD1001100110011001+010011001OF=Cs

Cp=1

0=1CsCpCF=1,PF=0,AF=1,SF=0,OF=1,ZF=0(AL)=32H0011111101010000+11110001OF=Cs

Cp=0

1=1CsCpCF=0,PF=0,AF=0,SF=1,OF=1,ZF=0(AL)=8FH66加法指令:ADCADCDST,SCR;(DST)←(DST)+(SCR)+(CF)例3-3将存储在DS:0000H处的4字节数12345678H与DS:0010H处的4字节数00ABCDEFH相加,结果放在DS:0020H处67加法指令:ADC78563412EFCDAB000000H0001H0002H0003H0010H0011H0012H0013H0020H0021H0022H0023H+?78563412EFCDAB000000H0001H0002H0003H0010H0011H0012H0013H0020H0021H0022H0023H+5678HCDEFH12467HCF=1672478563412EFCDAB000000H0001H0002H0003H0010H0011H0012H0013H0020H0021H0022H0023H+1234H00ABH12E0H16724CFE01268加法指令:ADCMOV AX,[0000H]ADD AX,[0010H];低2字节相加MOV [0020H],AX;低2字节相加结果送DS:0020H处MOV AX,[0002H];取高2字节数据ADC AX,[0012H];

高2字节相加MOV [0022H],AX;高2字节相加结果送DS:0022H处69加法指令:INCINCDST;(DST)←(DST)+1指令格式举例INCREG16INCAXINCREG8INCBLINCMEMINCVAR;VAR是变量70减法指令SUB指令SUBDST,SCR;(DST)←(DST)−(SCR)SBB指令SBBDST,SCR;(DST)←(DST)−(SCR)−(CF)

DEC指令DECDST;(DST)←(DST)−171减法指令NEG指令NEGDST;(DST)←0−(DST)CMP指令CMPDST,SCR;(DST)−(SCR)完成两个操作数相减,使结果反映在标志位上,但并不送回结果(即不带回送的减法)。比较指令主要用于比较两个数之间的关系。72课后作业求双字DX:AX的负,即0

DX:AX 假设DX:AX中存放一个双字的数据: NEGDX NEGAX SBBDX,0请问:上述程序段完成什么功能?设执行前,DX=0001H,AX=FFFFH,上述程序段执行后,DX、AX的值是什么?73乘法指令无符号乘法指令MUL

MULSRC①若SRC为字节,则默认被乘数在AL中,得到的16位积默认在AX中,即:

(AX)←(AL)×(SRC)②若SRC为字,则默认被乘数在AX中,得到的32位积默认在DX,AX中,即:

(DX,AX)←(AX)×(SRC)MUL指令影响CF位和OF位,若相乘后的结果中高16位(16位乘法)或高8位(8位乘法)均为0时,CF和OF均被置为0,否则CF和OF均被置为1。

74乘法指令带符号乘法指令IMUL

IMULSRC同MUL一样可以进行字节与字节、字和字的乘法运算。结果放在AX或DX,AX中。当结果的高半部分不是结果的低半部分的符号扩展(见CWB和CWD指令)时,标志位CF和OF将置位。75除法指令无符号数除法指令DIVDIVSRC①若SRC为字节,则默认被除数在AX中,得到的8位商在AL中余数在AH中,即:(AX)÷(SRC)→(AL),(AH)②若SRC为字,则默认被除数在DX,AX中,得到的16位商在AX中余数在DX中,即:(DX,AX)÷(SRC)→(AX),(DX)如果除数为零,或商的结果超出相应寄存器的范围,则在内部产生一个类型0的中断。76除法指令带符号数除法指令IDIVIDIVSRC执行过程同DIV指令,但IDIV指令认为操作数的最高位为符号位,除法运算的结果商的最高位也为符号位。77符号扩展指令应该将长度短的数扩展成与长度长的数位数相同后再计算。BX=0101H;+257AL=80H;−128字数据与字节数据之间的运算如何进行?问题的提出BX=0101H;+257AX=FF80H;−128符号扩展78符号扩展指令字节扩展指令CBW该指令执行时将AL的符号扩展到AH,即若D7=0,则AH=0;否则AH=0FFH。字扩展指令CWD该指令执行时将AX的符号扩展到DX,即若D15=0,则DX=0;否则DX=0FFFFH。CBWADDAX,BXBX=0101H;+257AL=80H;−12879符号扩展指令扩展无符号数是否可以使用如下指令?为什么?(1)CBW指令;(2)CWD指令不可以因为这两个指令都是针对带符号数的CBW把AL的符号扩展到AH,CWD把AX的符号扩展到DX无符号数(AL)=80H,若用CBW扩展后,(AX)=FF80H,显然不对。80符号扩展指令例3-4编写汇编程序段,计算(V−(X*Y+Z−100))/X。已知X、Y、Z、V均为16位符号数,已装入X、Y、Z、V单元,要求将上式计算结果的商存入AX,余数存入DX。MOV AX,X ;取被乘数XIMUL Y ;X*Y,结果在DX,AX中MOV CX,AX ;将乘积保存在BX,CX中MOV BX,DXMOV AX,Z ;取被加数ZCWD ;将Z符号扩展成32位(DX,AX)ADD CX,AX ;加到BX,CX中的乘积上ADC BX,DX16位符号数的乘积是32位的81符号扩展指令例3-4编写汇编程序段,计算(V−(X*Y+Z−100))/X。已知X、Y、Z、V均为16位符号数,已装入X、Y、Z、V单元,要求将上式计算结果的商存入AX,余数存入DX。SUB CX,100 ;从BX、CX中减去100SBB BX,0MOV AX,VCWD ;将V扩展为32位SUB AX,CX ;从符号扩展后的V中减去BX,CXSBB DX,BX IDIV X ;除以X,商在AX中,余数在DX82课后作业编写计算4A2−B+10多项式值的程序段;说明:多项式值存于AX中,A、B是无符号数,设中间和最后结果不超过16位二进制数。数据说明:ADB0AHBDB10H83十进制调整指令

十进制数25D压缩BCD数25H非压缩BCD数0205H指令格式指令说明DAA压缩的BCD码加法调整DAS压缩的BCD码减法调整AAA非压缩的BCD码加法调整AAS非压缩的BCD码减法调整AAM乘法后的BCD码调整AAD除法前的BCD码调整84十进制调整指令DAA若AL的低4位>9或AF=1,则进行(AL)←(AL)+06H修正,同时AF置1。若AL的高4位>9或CF=1,则进行(AL)←(AL)+60H修正,同时CF置1。例3-5:编写汇编程序段,用压缩BCD码计算12D+28D。MOV AL,12HADD AL,28H ;AL=3AH,AF=0,CF=0DAA ;AL=40H85十进制调整指令举例AL=28H,BL=68HADDAL,BLDAA;AL=90H;AL=96HAL=07H,BL=09HAAM;AX=003FH;AX=0603H

MOVAX,0307HAADMOVBL,5DIVBL请分析以下指令的执行结果MULBL863.2指令系统数据传送指令1算术运算指令2逻辑运算指令3移位指令和循环移位指令4处理器控制指令5873.2.3逻辑运算指令AND指令OR指令XOR指令TEST指令NOT指令88AND指令ANDDST,SRC;(DST)←(DST)∧(SRC)

对源操作数SRC和目的操作数DST进行按位的逻辑“与”运算,结果送回目的DST。源操作数可以为立即数,通用寄存器和任一寻址方式所指定的内存单元;目的操作数可以为通用寄存器和任意寻址方式所指定的内存单元,但不允许是立即数;当源操作数不是立即数时,两个操作数中必须有一个是寄存器。MOVAL,01100011BANDAL,00110011B执行后(AL)=00100011B89AND指令AND指令可以将操作对象的相应位设为0,其他位不变。将AL的D3位设为0的指令是:ANDAL,11110111B将AL的D0位设为0的指令是:

ANDAL,11111110B将AL的低4位清零指令是:

ANDAL,0F0HAND指令提供了一种把小写字母转换成大写字母的简单方法。01100001=61H(’a’)01000001=41H(’A’)只要将任何字符与11011111相与,则D5被清零,其他位不变。90OR

指令ORDST,SRC;(DST)←(DST)∨(SRC)

对源操作数SRC和目的操作数DST进行按位的逻辑“或”运算,结果送回目的DST。MOVAL,01100011BORAL,00110011B执行后(AL)=01110011

BOR指令可以将操作对象的相应位设为1,其他位不变。将AL的D3位设为1的指令是:ORAL,00001000B将AL的D0位设为1的指令是:

ORAL,00000001B将AL的低4位设为1的指令是:

ORAL,0FHOR指令可以把0~9之间的整数转换成对应的ASCII码数字字符,方法是把D4和D5置1。91XOR指令XORDST,SRC;(DST)←(DST)

(SRC)

对源操作数SRC和目的操作数DST进行按位的逻辑“异或”运算,结果送回目的DST。MOVAL,01100011BXORAL,00110011B执行后(AL)=01010000

BXOR指令可以将操作对象的相应位取反,其他位不变。将AL的D3位取反的指令是:XORAL,00001000B将AL的D0位取反的指令是:

XORAL,00000001B将AL的低4位取反的指令是:

XORAL,0FH92TEST指令TESTOPR1,OPR2;(OPR1)∧(OPR2)对操作数OPR1和OPR2进行按位的逻辑“与”运算,结果只体现在标志位上,不改变操作数的值。TEST与AND的关系类似于CMP与SUB的关系。利用TEST可以测试操作对象的相应位是否为0。

测试AL的D3位是否为0:TESTAL,00001000B一般TEST指令后面会跟一个条件转移指令(见4.3.2节)。93NOT指令对操作数DST的各位按位取反

MOVAL,01100011BNOTAL执行后AL=10011100

BNOTDST;(OPR)←(OPR)94课堂练习写出一条能完成下述操作的指令(1)将AX的高字节清零,低字节不变(2)将BX的低字节置成全’1’,高字节不变(3)将CX的高字节变反,低字节不变AND AX,00FFHOR BX,00FFHXOR CX,0FF00H95课堂练习按要求编写下列指令序列(1)把AX中的0~3位置0,7~9位置1,13~15取反(2)检查CX中的1、3和5位中是否有1位为1;AND AX,0FFF0H ;11111111

11110000BOR AX,0380H ;0000001110000000BXOR AX,0E000H ;1110000000000000BMOV AX,CXAND AX,002AH ;0000000000101010B如果运算结果不为0,表示1、3、5位至少有一位为1

963.2指令系统数据传送指令1算术运算指令2逻辑运算指令3移位指令和循环移位指令4处理器控制指令597移位指令SHL/SALDST,CNTSHRDST,CNTSARDST,CNT目的操作数DST可以是除立即数以外的任何寻址方式;CNT用于指定移位的位数,如果是立即数则只能是1;如果移位次数大于1,则CNT必须为寄存器CL,CL中的内容即移位次数。DSTCF逻辑/算术左移0DSTCF逻辑右移0DSTCF算术右移98移位指令SHL和SAL可以用于乘法左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2。

举例:X

10=X

2+X

8MOVAH,0SALAX,1

;X

2

MOVBX,AX;移至BX中暂存SALAX,1

;X4

SALAX,1

;X8

ADDAX,BX;X10

99移位指令SHL和SAL可以用于乘法左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2。

SHR可以用于无符号数的快速除法

SAR可以用于带符号数的快速除法

100移位指令无符号数乘法有符号数乘法无符号数除法有符号数除法00001000B(8)00010000B(16)11110001B(−15)1110

温馨提示

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

评论

0/150

提交评论