微机原理第3章-指令系统课件_第1页
微机原理第3章-指令系统课件_第2页
微机原理第3章-指令系统课件_第3页
微机原理第3章-指令系统课件_第4页
微机原理第3章-指令系统课件_第5页
已阅读5页,还剩234页未读 继续免费阅读

下载本文档

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

文档简介

及秦红磊金天微机原理接口技术第三章微处理器指令系统(InstructionSet)第一节:指令的基本格式第二节:8086的寻址方式第三节:8086的指令系统第四节:其它微处理器的指令扩展第五节:中断指令和DOS系统功能调用指令系统是计算机硬件和软件之间的桥梁,是汇编语言设计的基础。操作码操作数汇编指令:操作码:指令操作类型;操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。例:MOVAX,CX;将CX的内容送入AX中。微机算机处理器的指令由几十种或上百种组成,每种指令由两个字段(Field)构成:第一节指令的基本格式指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中。立即数有8位和16位。例:MOVAL,05H

;源操作数为立即寻址指令执行后,AL=05H,8位数据05H存入AL寄存器。例:MOVAX,3064H

;源操作数为立即寻址指令执行后,AX=3064H,16位数据3064H存入AX寄存器。1.立即数寻址(ImmediateAddressing)

立即数寻址、寄存器寻址的操作数,不用在取完指令后再到内存中取数。寻址方式。其它寻址方式操作数存放在内存中,取完指令后,还需到内存取数,指令中给出的是该操作数的地址,包括段地址和偏移地址。CPU总线内存DSESSSCSIP数据暂存器PSW标志寄存器执行部件控制电路指令译码器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器组指令队列总线接口控制电路运算器地址加法器、、、指令1指令2指令3指令4、、、数据1数据2数据3、、、地址总线AB数据总线DB控制总线CB地址译码器

寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括8位或16位通用寄存器和段寄存器。可使用的16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP;其中:AX、BX、CX、DX可分成两8位使用。例:MOVAX,CX

;(AX)(CX)

INCCX

;(CX)(CX)+12.寄存器寻址(RegisterAddressing)例:MOVAX,[1000H]

若(DS)=2000H

内存操作数的物理地址为:PA=(DS)×10H+EA=2000H×10H+1000H=21000H

执行后(AX)=3040H

思考:

指令MOVAX,[1000H]

与MOVAX,1000H有什么不同?4.间接寻址(IndirectAddressing)按给出偏移地址方式的不同,分为以下5种:寄存器间接寻址

MOVAL,[BX]寄存器相对寻址

MOVAL,[BX+10H]

基址加变址寄存器

MOVAL,[BX+SI]

相对基址加变址寄存器

MOVAL,[BX+SI+10H](1)寄存器间接寻址

寄存器间接寻址方式的操作数形式为:[reg]操作数的有效地址包含在基址寄存器BX,基址指针BP或一个变址寄存器(SI或DI)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。例:MOVAX,[BX];将由BX决定的存储单元的内容送到AX寄存器。0000000100020003CCAATAB:AHAL

AA

BB数据段0002BXBB使用BX、SI、DI的寄存器寻址,默认段寄存器为DSCPU总线内存DSESSSCSIP数据暂存器PSW标志寄存器执行部件控制电路指令译码器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器组指令队列总线接口控制电路运算器地址加法器、、、指令1指令2指令3指令4、、、数据1数据2数据3、、、地址总线AB数据总线DB控制总线CB地址译码器例:

MOVAX,[DI]

若(DS)=3000H(DI)=2000H

则内存操作数的物理地址为:

PA=(DS)×10H+(DI)=32000H

执行后(AX)=(32000H)=400BH思考:指令MOVAX,[DI]

与MOVAX,DI有什么不同?用SI、DI、BX、BP作为间接寻址允许段跨越

指令中可以指定段跨越前缀来取得其他段中的数据。例:MOVES:[DI],AXMOVDX,DS:[BP]这种寻址方法可以用于表格处理。操作数

有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量(displacement)之和。可用的寄存器有BX、DI

、SI、BP,与寄存器间接寻址相同如:MOVAL,[BX+10H]MOVAH,[DI+20H]MOVDL,30H[SI]MOVDH,40H[BP]例:

MOVAX,[BX+30H]

若(DS)=2000H(BX)=1000H

则内存操作数的物理地址为:

PA=(DS)×10H+(BX)+30H=21030H

指令执行后:

(AX)=(21030H)=8976H(3)基址变址寻址方式:操作数在存储器中,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)内容之和作为操作数所在存储单元的有效地址。(BX)(SI)(BP)(DI)EA=+PA=(DS)*16+(BX)+(SI)或(DI)PA=(SS)*16+(BP)+(SI)或(DI)

例:MOVAX,[BX+DI]或MOVAX,[BX][DI]DS:(BX)+(DI)字存储单元内容送AX。例:MOVAX,[BP+SI]或MOVAX,[BP][SI]SS:(BP)+(SI)字存储单元内容送AX。

使用BX的基址加变址寻址,默认段寄存器为DSCPU总线内存DSESSSCSIP数据暂存器PSW标志寄存器执行部件控制电路指令译码器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器组指令队列总线接口控制电路运算器地址加法器、、、指令1指令2指令3指令4、、、数据1数据2数据3、、、地址总线AB数据总线DB控制总线CB地址译码器例:

MOVAX,[BX+SI]

若(DS)=4000H(BX)=2000H(SI)=100H

则内存操作数的物理地址为:

PA=(DS)×10H+(BX)+(SI)=42100H

指令执行后

(AX)=(42100H)=2345H

(4)相对基址变址寻址方式操作数在存储器内,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)的内容之和再加上位移量(8位或16位),得到操作数所在单元的有效地址。

(BX)(SI)DISP8

(BP)(DI)DISP16有效地址=++例:

MOVAX,[BX+SI+10H]

若(DS)=4000H(BX)=3000H(SI)=200H

则内存操作数的物理地址为:

PA=(DS)×10H+(BX)+(SI)+10H=43210H

指令执行后

(AX)=(43210H)=8877H第三节8086的指令系统8086的指令系统包含133条基本指令,这些指令功能可以分为6类:

1.数据传送指令(Datatransfer)

2.算术运算指令(Arithmetic)

3.逻辑指令与移位指令(Logic&Shift)

4.控制转移指令(Controltransfer)

5.处理机控制指令(ProcessorControl)

6.串操作指令(Stringmanipulation)

一.数据传送指令数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中

。地址总线AB存储器I/O接口输入设备I/O接口数据总线DB控制总线CB输出设备CPU寄存器,存储器,I/O端口1.通用传送指令MOV、PUSH、POP、XCHGreg/mem/segreg←regreg/segreg←memreg/mem←segregreg/mem←data

可实现(1)MOV传送指令格式

MOVdst,src执行

(dst)←(src)例:

①reg/mem/segreg←reg

通用寄存器/存储器/段寄存器←通用寄存器

MOVAL,BLMOV[BX],ALMOVDS,AX

②reg/segreg←mem

通用寄存器/段寄存器←存储器

MOVAL,[BX]MOVDS,[BX+SI]

③reg/mem←segreg

通用寄存器/存储器←段寄存器

MOVBX,CSMOV[BX],DS

④reg/mem←data

通用寄存器/存储器←立即数

MOVAl,9MOVBX,OFFSETbufferMOVBYTEPTR[value],0MOVWORDPTR[BX],1MOV指令特点及注意事项:

双操作数指令(注意双操作指令的特点)可进行字节或字传送不允许存储器传送到存储器MOV[BX],[value]MOV[DI],[SI]MOVAX,valueMOV[BX],AXMOVAL,[SI]MOV[DI],AL

可对DS、ES、SS赋值但不允许立即数直接传送给段寄存器MOVDS,AXMOVES,[BX]MOVDS,1000HMOVAX,1000HMOVDS,AXCS不能做目的操作数,不能通过传送指令改变CS的值

MOVCS,AXMOVAX,CS

不允许段寄存器传送到段寄存器

MOVES,DSMOVAX,DSMOVES,AXD:\MASM>DEBUG-A1693:0100MOVES,DS^Error1693:0100MOVAX,DS1693:0102MOVES,AX1693:0104-

MOV指令应用例:实现将AREA1开始的100个数据传送到AREA2开始的单元。……AREA1:AREA2:100个数据分析题意:

①可以用200条MOV指令来完成100个数据传送,指令操作重复,每个数据传送后的地址是变化的。

②可以利用循环, 但每循环一次要修改地址(源地址和目的地址),必须把地址放在寄存器当中,用寄存器间接寻址来寻找操作数.得到如下程序:

MOVSI,OFFSET

AREA1 MOVDI,OFFSET

AREA2 MOVCX,100AGAIN: MOVAL,[SI] MOV[DI],AL

INCSI ;修改地址指针

INCDI ;修改地址指针

DECCX ;修改个数

JNZAGAIN

…(2)PUSH(Pushwordontostack)POP(Popwordoffstack)

这是两条堆栈操作指令。

1)先介绍一下什么是堆栈,为什么需要堆栈

堆栈是按照先进后出原则组织的一段内存区域。通常用于存放一些重要数据,

如:程序的地址、或是需要恢复的数据。为方便数据的存放和恢复,设置专门的指针,指向堆栈中要操作的单元。段值由SS给出,偏移地址由SP给出

SS→堆栈段寄存器(stacksegment)SP→堆栈指针寄存器(stackpoint)SS:SP

特点:下推式的(规定堆栈设置在堆栈段内)改变SP的内容,随着推入堆栈内容增加,SP的值减少。先进后出工作原则(LastInFirstOut简称LIFO)

堆栈在内存中的情况:堆栈在内存中的情况:可以用一条立即数传送指令给SP赋值,确定SP在SS段中的初始位置。例:设:(SS)=9000H,堆栈段为64KBMOVSP,0E200H ;(SP)=0E200H则:

整个堆栈段的物理地址范围为:

90000H~9FFFFH

栈顶的物理地址为:9E200H堆栈在内存中的情况如右图所示:堆栈在内存中的情况2)堆栈操作指令

(堆栈操作指令有两条):

入栈指令格式:PUSHsrc ;(SP)(SP)-2 ((SP)+1,(SP))(src)

把一个字从源操作数(src)由SP指向堆栈顶部。

出栈指令格式:POPdest ;(dest)((SP)+1,(SP)) (SP)(SP)+2把现行SP所指向堆栈顶部的一个字指定的目的操作数(dest),同时进行修改堆栈指针的操作。

SS:SP

SS:SP

(src)SS:SP

SS:SP

(dst)PUSH入栈操作格式

PUSHsrc执行(SP)←(SP)-2

(SS:SP)←(src)特点:

单操作数指令操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:CS,DS,ES,SSmem:字类型SS:SP

SS:SP

(src)例:

PUSHAX若执行前:

(SS)=2000H(SP)=1002H(SS:SP)=

2010H

(AX)=1234H3B2A10低高20地址SS:SP2000:1002指令执行前(AX)=1234h则执行PUSHAX后:

(SS)=2000H(SP)=1000H(SS:SP)=1234H(AX)=1234H123410低高20地址SS:SP2000:1000指令执行后(AX)=1234h不变减2变不变

特点:单操作数指令操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:DS,ES,SS,不允许是CSmem:字类型

POP出栈操作SS:SP

SS:SP

(dst)格式

POPdst执行(dst)←(SS:SP)(SP)←(SP)+2若执行前:

(SS)=2000H(SP)=1000H(SS:SP)=1234H

(BX)=5678H123410低高20SS:SP2000:1000指令执行前地址(BX)=5678h例:POPBX123410低高20SS:SP2000:1002指令执行后地址(BX)=1234h则执行POPBX后:

(SS)=2000H(SP)=1002H

(SS:SP)=2010H

(BX)=1234H

不变加2变

堆栈使用的场合用堆栈保存恢复信息

子程序的调用、返回以及中断调用、返回

用堆栈传送数据(程序设计中介绍)主程序子程序:子程序:在一个实际程序中,有些操作要执行多次, 把要重复执行(subroutine)操作编为子程序。 也常把一些常用的操作标准化、通用化的子程序。主程序(Mainprogram)——往往要调用子程序 或处理中断,

暂停主程序,执行子程序或中断服务程序。调用子程序时需保留内容:①调用子程序:将CALL下条指令地址即IP值保留下来 (8088中码段寄存器CS和指令指针IP),才能保证子程序执行完后准确返回主程序继续执行。②执行子程序时,通常用到内部寄存器,执行结果会影响标志位,必须在调用子程序之前将现状保护起来。③子程序嵌套或子程序递归(自调自)保留许多信息,而且保证正确返回(且后进先出)。后保留先取出原则(即LIFO-LASTInFirstout)。注意:SP——堆栈指针,始终指向栈顶。

SP初值用MOVSP,data来设定。

下边详细说明一下堆栈用途:存放CPU寄存器或存储器中暂时不使用的数据,

使用数据时将其弹出:

PUSHAX ;将(AX)入栈(AX)(AX)使用数据时将其弹出:

POPBX调用子程序(或过程)或发生中断时要保护断点的地址,子程序或中断返回时恢复断点。子程序嵌套断点地址压入和弹出情况注意事项

堆栈是一重要数据结构,使用堆栈应有明确目的。不乱用堆栈操作,不乱修改堆栈内容。PUSH、POP、PUSHF、POPF、CALL、RET、INT、IRET

乱修改

SS和SP的内容包括乱用BP参与的存储器操作数

乱用指令

PUSH和POP指令只能对字操作。

PUSHALPOPBYTEPTR[BX]

可以对段寄存器操作但POP不能对CS操作

PUSHDSPUSHCSPOPES

POPCS自学堆栈应用:比较下边两个程序运行结果?

例:用BP的基址指令代替POP指令

…MOVBP,SPPUSHAXPUSHBXPUSHCX …MOVCX,[BP-6]

MOVBX,[BP-4]MOVAX,[BP-2] …ADD

SP,6例:压入堆栈的内容与弹出内容顺序相反…PUSH AXPUSHBXPUSHCX…POPCXPOPBXPOPAX (3)XCHG交换指令

格式

XCHGoprd1,oprd2执行

(oprd1)(oprd2)regregregmemmemreg

可实现例

XCHGAX,BX字操作执行前(AX)=1122H(BX)=3344H

执行后(AX)=3344H(BX)=1122H

例XCHGAH,BL字节操作执行前(AX)=1122H(BX)=3344H

执行后(AX)=4422H(BX)=3311HXCHGoprd1,oprd2注意事项:

双操作数指令可进行字或字节操作,不影响标志位。不允许对立即数、段寄存器做操作数

XCHGAX,4

XCHGBX,DS

存储器之间不能交换,两个操作数中必须有一个在寄存器中;

XCHG[BX],[DI] (错)(1)输入输出指令(InputandOutput)

输入输出指令共两种:

IN(Inputbyteorword)

OUT

(Outputbyteorword)

输入指令用于CPU从外设端口接受数据,输出指令用于CPU向外设端口发送数据。

无论接受还是发送数据,必须通过累加器AX(字)或AL(字节),又称累加器专用传送指令。

输入、输出指令不影响标志位。2.累加器专用传送指令每个外设要占几个端口:数据口,状态口和控制口。由图可见:信息交换要通过端口:在IBMPC机里,可以配接许多外部设备,每个外设与CPU之间交换数据,状态信息和控制命令,每一种信息交换都要通过一个端口来进行。端口数:外部设备最多有65536个I/O端口。

A0~A15译码形成。端口号:端口号(即外设端口地址)为0000H~FFFFH。

PC机端口数:仅使用A0~A9译码形成I/O口地址,即1024H个口地址PC机端口号:0000H~03FFH

其中:A9=1,表示扩充槽上的口地址。长格式:端口号中前256个端口(0~FFH),可以直接写在指令中,端口号代替指令中的PORT,机器指令用二字节表示,第二字节就是端口号。短格式:当端口号≥256时,只能使用短格式,必须先把端口号放到DX寄存器中。不需要用任何段寄存器来修改它的值。1)IN(Inputbyteorword)输入指令格式:INacc,port;(acc)(port)具体形式有四种:长格式:

INAL,data8;端口地址8位,输入一个字节

INAX,data8;端口地址8位,输入一个字短格式:

INAL,DX ;端口地址16位,输入一个字节

INAX,DX ;端口地址16位,输入一个字必须通过累加器AX(字)或AL(字节)输入数据。2)OUT(Outputbyteorword)输出指令格式:OUTport,acc ;(port)(acc)具体形式有四种:长格式:OUTdata8,AL;端口地址8位,输出一个字节

OUTdata8,AX;端口地址8位,输出一个字短格式:OUTDX,AL;端口地址16位,输出一个字节

OUTDX,AX;端口地址16位,输出一个字必须通过累加器AX(字)或AL(字节)输出数据。例1:实现(29H)(28H)→(DATA_WORD)长格式:

INAX,28H MOVDATA_WORD,AX例2:从端口3FCH送一个字到AX寄存器短格式: MOVDX,3FCH INAX,DX;(AL)←(3FCH), (AH)←(3FDH)

例3:实现将(AL)→(05H)长格式: OUT5,AL;(05H)←(AL)(2)

XLAT(Translate)字节转换指令(换码指令):

该指令不影响标志位。格式:XLATstr_table ;(AL)←((BX)+(AL))或XLAT str_table——表格符号地址(首地址), 只是为了提高可读性而设置,汇编时仍用BX。

XLAT指令使用方法:先建立一个字节表格;表格首偏移地址存入BX;需要转换代码的序号(相对与表格首地址位移量)存入AL;(表中第一个元素的序号为0)执行XLAT指令后,表中指定序号的元素存于AL中。

(AL)为转换的代码。XLAT指令应用:若把字符的扫描码转换成ASCII码;或数字0~9转换成7段数码所需要的相应代码(字形码)等就要用XLAT指令。例:内存的数据段中有一张十六进制数字的ASCII码表。

首地址为:Hex_table,欲查出表中第10个元素(‘A’)执行指令序列:MOVBX,OFFSETHex_tableMOVAL,0AHXLATHex_table假设: (DS)=F000H,

Hex_table=0040H

(AL)=0AH执行XLAT以后:(AL)=41H=(F004AH), 即“A”的ASCII码。30H31H32H...39H41H42H...46H...Hex_tableHex_table+1Hex_table+2Hex_table+0AHHex_table+0BHHex_table+0FH'F''B''A''9''1''2''0'16进制数的ASCII码表3.目的地址传送指令(Address-objecttransfer)8086/8088提供三条:

地址指针写入指定寄存器或寄存器对指令。(1)LEA(LoadEffectiveAddress)(2)LDS(LoadpointerusingDS)(3)LES(LoadpointerusingES)(1)LEA有效地址传送格式

LEAreg,mem执行(reg)←mem的EA

即寄存器←存储器操作数的偏移地址

执行后

(BX)=1000H注意:

OFFSET是汇编程序提供的一个操作符,不是CPU的指令.LEABX,

buffer例

buffer是一个符号地址表示的内存操作数(变量)。…...12h34h56h…...buffer内存DS:1000h若变量buffer的偏移地址=1000H等价于

MOVBX,OFFSETbuffer

LEAreg,mem特点及注意事项:目的操作数reg应是16位通用寄存器

LEAES,[BX]LEAAL,bufferLEA6,[BX+SI]LEA[DI],buffer

源操作数应是存储器操作数

LEABX,AX

传送的是内存单元的有效地址,与其内容无关。…...12h34h56h…...buffer内存(2)LDS(LoadpointerusingDS)格式:LDSreg16,mem32 ;(reg16)←(EA) (DS)←((EA)+2))功能:把源操作数指定的4个相继字节送指令指定的寄存器及DS寄存器中。

前两个单元内容(16位偏移量)装入指定通用寄存器,后两个单元内容(段地址)装入到DS段寄存器。用于写远地址指针。例:假设:

(DS)=C000H指令: LDSSI,[0010H]执行指令后:(SI)=0180H(DS)=2000H

80H01H00H20HC000H:0010H(DS)C0011HC0012HC0013H......存储器(3)LES(LoadpointerusingES)格式:LESreg16,mem32 ;(reg16)←(EA) (ES)←((EA)+2))功能:把源操作数指定的4个相继字节送指令指定的寄存器及ES寄存器中。前两个单元内容(16位偏移量)装入指定通用寄存器,后两个单元内容(段地址)装入到ES段寄存器。此指令常常指定DI寄存器。用于写远地址指针。例:假设:

(DS)=B000H (BX)=080AH指令: LESDI,[BX]执行指令后: (DI)=05A2H (ES)=4000HA2H05H00H40HB000H:080AH(DS)B080BHB080CHB080DH......存储器(BX)4.标志传送指令(Flagregistertransfer)采用了隐含寄存器(AH、Flags)操作数方式。

8088有四条标志传送操作指令:(1). LAHF(LoadAHfromflags)(2). SAHF(StoreAHintoflags)(3). PUSHF(Pushflagsontostack)(4). POPF(Popflagsoffstack)

(1).LAHF(LoadAHfromflags)格式:LAHF;(AH)←(PSW的低字节)功能:标志寄存器低八位(AH)。LAHF指令操作图示意(2). SAHF(StoreAHintoflags) 格式:SAHF;(PSW的低字节)←(AH) 功能:(AH)送标志寄存器低八位。SFZFAFPFCF01234567TFIFDFOF8910111213141501234567FLAGSAHSS:SP

SS:SP

(PSW)(4).POPF标志出栈格式

POPF执行(PSW)←

(SS:SP)(SP)←

(SP)+2SS:SP

SS:SP

(PSW)(3).PUSHF标志入栈格式

PUSHF执行(SP)←

(SP)-2

(SS:SP)←

(PSW)注意:(1)标志位的影响LAHF、PUSHF不影响标志位,SAHF、POPF由装入的值确定标志位的值,即影响标志位。(2)PUSHF、POPF用于保护调用过程前(PSW),过程返回后恢复。例:

… PUSH AX PUSHCX PUSHF CALLTRANS

POPFPOPCXPOPAX…二.算术运算指令指令分类:特点:带符号数用补码表示如MOVAX,-1

等价于

MOVAX,0FFFFh

对加、减运算,不区分无符号数、带符号数对乘、除运算,区分无符号数、带符号数可进行字节或字操作影响状态标志十进制运算方法:当数据用组合(压缩)或分离(非压缩)BCD码表示时,为使运算的结果仍为BCD码表示,需对结果进行调整。

十进制运算=二进制运算+十进制调整

BCD码(BinaryCodedDecimal)

用二进制编码表示十进制数。常用8421BCD码,与十进制数码对应关系:例

48的BCD码为(01001000)BCD

根据在内存的存放形式,分组合BCD码和分离BCD码

组合BCD码(又称压缩BCD码)(PackedBCDformat)

用4位二进制数表示一个十进制数位,一字节存放2个BCD码。

整个十进制数形式为一个顺序的4位为一组的数串。例:9502d的压缩BCD码应表示为:

9 5 02分离BCD码(又称非压缩BCD码)(UnpackedBCDformat)

用8位为一组表示一个十进制数位,一字节存放1个BCD码。

8位中的低4位表示8421的BCD码,而高4位没有意义。例:9502d的非压缩BCD码则表示为:

9 5 0 21001010100000010

ASCII码是一种分离BCD码 数字的ASCII的高4位0011无意义; 低4位是以8421码形式表示的十进制数位。 符合分离BCD码高4位无意义的规定。

2的ASCII码:

高4位0011无意义当数据用组合或分离BCD码表示时,为使运算的结果仍为BCD码表示,需对结果进行调整。十进制运算=二进制运算+十进制调整例(00001000)

压缩BCD

+(00001001)

压缩BCD

=(00010111)

压缩BCD计算机计算过程看作压缩BCD0000100008+0000100109

00010001

11

二进制运算十进制调整+00000110

00010111171.加法运算指令

ADD、ADC为双操作数指令

INC为单操作数指令除INC指令不影响CF外,其余指令6个状态标志均据结果置位ADC带进位加法,实现字以上运算(进位是上条指令运算的进位)

CFA1H

1100111110100001+62A0H+0110001010100000111111111113241H0011001001000001例1

加法指令:编程完成

CFA1H+62A0HMOVDX,0CFA1HADDDX,62A0H执行后:(DX)=3241HCF=1,OF=0,SF=0,ZF=0(注意:CF和OF的判断方法)OF=1, 8位带符号数相加,和超出范围(-128~+127),16位带符号数相加,和超出范围(-32768~+32767);

加法:两个正数相加,结果为负;或两个负数相加,结果为正。 (两个异号数相加不可能溢出)

减法:

两个异号数相减,结果与减数相同。(两个同号数相减不可能溢出)

运算结果错误。CF=1,8位无符号数相加,和超过255,

16位无符号数相加,和超过65535。 运算结果准确其他条件标志(SF,AF,PF,ZF)根据定义设定。三组指令执行后的结果均为:(AL)=0FDH,CF=0,OF=0,SF=1,ZF=0

MOVAL,0F1HADDAL,0CH

MOVAL,241ADDAL,12

MOVAL,-15ADDAL,12第一章中的例题

F1H+0CHFDH二进制运算241+12253看作无符号数(-15)+12

(-3)看作带符号数B0F1040C、、、、、、第一条指令第二条指令三组机器码相同:对加、减运算,CPU计算时不区分无符号数、带符号数例2

加1指令:

INCAL执行前(AL)=FFH

执行后:

(AL)=00HCF=不变,OF=0,ZF=1,SF=0

FFH+01H

11

00H

01FFH+0001H进位11

0200H

例3

value是一个字变量

OFFSETvalue=1000H

(DS)=2000H,(21000H)=01FFHvalueFF21000H

01执行前value0021000H

02执行后执行后:(21000H)=0200HCF=不变,OF=0,ZF=0,SF=0注意:INCvalue是内存单元内容加1,而非地址加1INCvalue或写成:INC[value]例4

将buffer为首的4个字节内存内容相加,存放在AL中。

buffer1AB7C5D6注意若编程如下,MOVCX,4MOVAL,0exit:ADDAL,[buffer]INCbufferDECCXJNZexit

不能实现,为什么?

…...MOVCX,4

LEABX,bufferMOVAL,0exit:ADDAL,[BX]

INCBXDECCXJNZexit实现的是(1A)+(1B)+(1C)+(1D)指令INCbuffer将buffer指向的内容加1,而不是地址buffer加1例5

带进位加:两双字相加0002F365H+0005E024H=?MOVAX,0F365H①ADD

AX,0E024H

②MOVBX,0002H③ADC

BX,0005H④

0002F365H+

0005E024H

进位1

0008

D389H结果存放在:

0008D389(BX)(AX)执行完①、②:(AX)=D389HCF=1,OF=0,SF=1,ZF=0

执行完③、④:(BX)=0008HCF=0,OF=0,SF=0,ZF=0分析:8086/8088只能按字节或字相加。位数在字以上的操作数,先加低位,再加高位,加高位时加入从低位产生的进位。用途举例计算两个多字节数相加3B74AC60F8H+20D59E36C1H=?两个多字节数存放在:DATA1,DATA2的开始单元。流程图多字节数内存存放程序:

MOVCX,5 MOVSI,0 ;清SI

CLC

;清CFLOOPER: MOVAL,DATA2[SI]

ADCDATA1[SI],AL INCSI ;(SI)+1(SI) DECCX ;(CX)-1(CX) JNZLOOPER ;(CX)0转

HLT ;停机以8位二进制数为例分析一下数的溢出与进位情况:下面分4种情况加以讨论:(1) 带符号数和无符号数都不溢出(2) 无符号数溢出(3) 带符号数溢出(4) 带符号数和无符号数都溢出(1) 带符号数和无符号数都不溢出。(2) 无符号数溢出二进制数看作无符号数看作带符号数0000011111111011+000000107251+258+7-5++2相加标志CF=1,OF=0CF=1OF=0溢出无符号数溢出溢出结果应为2,错不溢出异号数相加不可能有溢出CF=1(3) 带符号数溢出(4) 带符号数和无符号数都溢出结论:(1)带符号数相加溢出

根据OF=1?,判断带符号数产生溢出?

OF=1,同符号数相加,结果符号与其相反,产生溢出;

OF=0,同符号数相加,结果符号与其相同,不产生溢出; 异号数相加,不可能溢出。(2)无符号数相加溢出

根据CF=1?,判断无符号数产生溢出?

CF=1,无符号数相加产生溢出,但结果并没有错, 只是结果放不下。

2.减法运算指令

SUB、SBB、

CMP为双操作数,DEC、NEG为单操作数

SBB为带进位减法(进位是上条指令运算的进位)。

除DEC不影响CF标志外,其余指令6个状态标志均据结果置位。

NEG求补运算,等价于用0减去操作数。其对标志位的影响,由0减去该操作数的过程决定。例1

减法指令:编程完成2D04H–3AB0H执行后:

(AX)=0F254HCF=1,OF=0,SF=1,ZF=02D04H0010110100000100-3AB0H-0011101010110000

11111111111F254H1111001001010100MOVAX,2D04HSUBAX,3AB0H

借位也可对(-3AB0)取补作加法0010110100000100

+1100010101010000111111001001010100减法进位取反CF=1,其它OF=0,SF=1,ZF=0例2

带借位减法:用指令完成两双字相减运算

05467A70H

-F001A543HMOVAX,7A70HSUBAX,A543HMOVBX,0546HSBBBX,0F001H例3

减1指令:value是一个字节变量

OFFSETvalue=1000H

(DS)=2000H,(21000H)=00HDECvalue

执行后:(21000H)=0FFH

CF=不变,OF=0,ZF=0,SF=1注意:DECvalue

是内存单元内容减1,而非地址减1

00H-01H11FFH

例4

求补指令:

MOVAH,80HNEGAH

00H00000000B

-80H-10000000B

11

80H10000000B执行后:

(AL)=80H,CF=1,OF=0,ZF=0,SF=1例5:求绝对值在内存中,从AREA1开始存放100个带符号数。求各数的绝对值存于AREA2的开始单元。流程图程序:

LEASI,AREA1 LEADI,AREA2 MOVCX,100CHECK:MOVAL,[SI] ADDAL,0;(AL)内容不变,置标志

JNSNEXT ;SF=0转NEXT

NEGAL ;负数求补

NEXT:MOV[DI],AL;送目标

INCSI INCDI DECCX JNZCHECK HLT

CMPoprd1,oprd2;(oprd1)-(oprd2)①据ZF判断两数是否相等CMPA,BZF=1两数相等,A=B;ZF=0两数不等,A≠B②据ZF和CF判断两无符号数关系CF=1A低于BCF=0A高于或等于BCF=1或ZF=1A低于等于BCF=0且ZF=0A高于B利用CMP执行后的标志值,比较两操作数之间的关系比较指令CMP,进行两操作数相减操作,但只影响标志值,不影响操作数(减的结果不保存)比较指令:条件转移指令判断条件

低于

JB

next

CF=1

低于或等于

JBE

next

CF=1或

ZF=1

高于

JA

next

CF=0且

ZF=0

高于或等于

JAE

next

CF=0

CMPAX,BX;比较

JAEabove;高于或等于则跳转

XCHGAX,BX;低于则交换

above:、、、例将AX和BX中较大的无符号数,存于AX中比较指令常常根据条件(标志)转移,无符号数转移指令如下:

CMPA,B③用ZF、SF和OF判断两带符号数关系

OF=0,不溢出情况,

SF=0,A≥BSF=1,A<BOF=0,SF=0A≥BOF=0,SF=1A<BOF=1,SF=1A>BOF=1,SF=0A<B

0

-

1

正-负=负,结果SF=1,OF=1

1

但,正>负,知A>B

1

-0

负-正=正,结果SF=0,OF=1

0

但,负<正,知A<B

OF=1,溢出情况,(由符号位可决定是否溢出)结合ZF,得到结论:逻辑运算:条件转移指令判断条件

小于

JL

next

SF∨

OF

=

1

小于或等于

JLE

next

(SF

OF)∨ZF=1

大于

JG

next

(SF

OF)∨ZF

=0

大于或等于

JGE

next

SF∨

OF=0例将AX和BX中较大的带符号数,存于AX中

CMPAX,BX;比较

JGEgreat

;大于或等于则跳转

XCHGAX,BX;小于则交换

great:、、、比较指令常常根据条件(标志)转移,带符号数转移指令如下:3.乘法指令无符号数乘法带符号数乘法MULsrcIMULsrc

单操作数指令源操作数(乘数)类型决定操作类型目的操作数(被乘数)隐含。字节乘AL字乘AX

字节相乘的结果存放在AX中字相乘的结果存放在DX、AX中

MUL用于无符号数运算

IMUL用于带符号数运算

影响CF和OF,对其他条件码无定义(不确定)(1)指令MUL

字节相乘:AH=0,CF=OF=0,否则CF=OF=1

字相乘:DX=0,CF=OF=0,否则CF=OF=1

即:

积的高一半为0(字节乘(AH)=0,字乘(DX)=0),则CF=0,OF=0;否则CF=1,OF=1。对其它条件码不确定(无定义)。状态不定。

(2)指令IMUL

字节相乘:AH=0或AH=FFH,CF=OF=0,否则CF=OF=1

字相乘:DX=0或DX=FFFFH,CF=OF=0,否则CF=OF=1

即:积的高一半为低一半的符号扩展,则CF=0,OF=0;

积的高一半部分不是低一半部分符号的扩展(包括结果的有效数字,不光是符号部分),则CF=1,OF=1。积的高一半为低一半的符号扩展的含义:

乘积为正,则(AH)=00H或(DX)=0000H

乘积为负,则(AH)=FFH或(DX)=FFFFH问题思考:乘法中为什么要用MUL,IMUL指令?例:结论:带符号数相乘,必须使用IMUL指令 无符号数相乘,必须使用MUL指令 否则,出错。无符号数带符号数(AL)=3(BL)=(

温馨提示

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

评论

0/150

提交评论