第3章8086指令系统课件_第1页
第3章8086指令系统课件_第2页
第3章8086指令系统课件_第3页
第3章8086指令系统课件_第4页
第3章8086指令系统课件_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

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

文档简介

第3章8086指令系统3.1概述3.2指令格式3.38086的操作数的寻址方式3.3.1立即数寻址3.3.2寄存器寻址3.3.3存储器操作数寻址方式3.4IA-32通用指令3.4.1数据传送指令3.4.2算术运算指令3.4.3逻辑运算、移位3.4.4串操作指令3.4.5控制转移指令3.4.6处理器控制指令本章小节思考题12/5/2023本章重点基本数据类型8086/8088寻址8086的指令系统本章难点8086的指令系统应用12/5/20233.1概述80x86结构的基本数据类型字节:8位字:16位,2个字节双字:32位,4个字节四字:64位,8个字节(80486CPU引入)双四字:128位,16个字节(PentiumIII)数据在内存中的字节顺序80X86多字节数据的存放原则是低位字节在低端地址,高位字节在高端地址。而最低地址就是操作数的地址。

3.1概述12/5/2023例如,1B23H存放在2000H与2001H地址单元中,2000H即为该操作数的地址;12/5/2023

本讲要解决的问题:8086/8088寻址指令系统?指令格式?寻址概念?寻址方式?操作数寻址的方法?3.1概述12/5/20233.2指令格式指令格式通用格式如下:操作码域:

存放指令的操作码,即指明计算机所要执行的操作。地址域:指出在指令执行过程中所需要的操作数或操作数所在的地址。操作码域操作数或操作数地址3.2IA-32的指令格式12/5/2023立即数位移量寄存器方式操作码1-2字节低字节1-2字节1字节(寻址方式)1字节高字节高字节低字节r/m3位reg3位mod2位opcode8086CPU指令格式3.2IA-32的指令格式12/5/2023机器指令:计算机能识别和执行的指令的二进制代码。如:1011000001100010汇编指令:用助记符表示机器指令的操作码和操作数,例如上面指令的汇编指令是MOVAL,62H3.1IA-32的指令格式12/5/2023指令执行时间指令执行时间:由时钟周期长短和执行指令所需要的时钟周期数决定。MOVAX,BX;执行时间最短MOVAX,[1000H]MOV[2000H],CX3.1IA-32的指令格式12/5/20233-38086的操作数的寻址方式寻址根据指令内容确定操作数地址的过程,称为寻址。有效地址根据寻址方式计算所得到的地址叫做有效地址EA,也就是段内偏移地址。有效地址还需要与相应的段基地址组合才是20位的物理地址,该工作由CPU完成。寻址方式在两种方式下被涉及:操作数的寻址方式和对调用或转移指令的寻址方式。本讲只介绍对操作数的寻址!!!3.38086的操作数的寻址方式12/5/2023计算机中操作数数按存放的方法分为:立即数(指令中)寄存器数存储器数I/O端口操作数寻址方式立即数立即数寻址寄存器数寄存器寻址串操作寻址存储器数直接寻址寄存器间接寻址基址变址寻址变址寻址端口寻址直接寻址寄存器间接寻址3.38086的操作数的寻址方式12/5/20233.3.1立即数寻址操作数由指令提供.

例:MOVAL,80HMOVAX,1090HMOVCX,1003.3.2寄存器寻址操作数在寄存器中。MOVAH,BLMOVAX,BXMOVCX,AX1090HAHALAXBX3.38086的操作数的寻址方式12/5/20233.3.3存储器操作数寻址方式规定段寄存器3.38086的操作数的寻址方式12/5/2023任何内存实际地址(PA)都由两部分组成:PA=段基址+段内偏移地址(此单元与段基址的距离)段内的偏移地址又称为有效地址(EA).

3.38086的操作数的寻址方式12/5/2023A1H70H10H........代码段直接寻址

操作数在存储器中,其地址由指令提供。例:MOVAX,[1070H](DS)=2000H,物理地址为:PA=20000H+1070H=21070H

20H

30H

数据段2000:10702000:10712000:1072AHALAX3.38086的操作数的寻址方式12/5/20238086执行某种操作时,预先规定了采用的段和段寄存器,即有基本的段约定,如果要改变默认的段约定(即段超越),则需要在指令中明确指出来.

例如:MOVBX,ES:[3400H];将附加段ES段中偏移地址为3400H和3401H两单元的内容送BX中。若用DATA代替偏移地址3400H:MOVBX,ES:DATA12/5/2023指令寄存器内存寄存器数据EA寄存器间接寻址

操作数在存储器中,寻址方式同直接寻址相似,但偏移地址由指针寄存器提供.3.38086的操作数的寻址方式12/5/2023[BX][SI][BP][DI]EA=8或16位移量++EA=8或16位移量[BX]

[BP]

[SI]

[DI]+

8086CPU,有效地址EA计算:3.38086的操作数的寻址方式12/5/20231、以BX寄存器进行间接寻址——数据段基址寻址例:

MOVAX,[BX]若(DS)=2000H,(BX)=1000H操作数物理地址PA:PA=2000H*16+1000H=21000H将21000H、21001H单元的内容送AX。执行结果:(AX)=5B40H

405B2000:1000H2000:1001H8BH07H........代码段数据段AHAL5B403.38086的操作数的寻址方式12/5/20232、以BP寄存器进行间接寻址——堆栈段基址寻址例:

MOVAX,[BP]若(SS)=5000H,(BP)=3000H,操作数物理地址:PA=5000H*16+3000H=53000H将53000H、53001H单元的内容送AX。执行结果:(AX)=4A56H3、以SI、DI寄存器进行间接寻址——变址寻址例:

MOVAX,[SI]

若(DS)=3000H,(SI)=4000H,

物理地址PA=34000H,执行结果:(AX)=201AH

34000H34001H1AH20H56H4AH53000H53001H3.38086的操作数的寻址方式12/5/2023寄存器相对寻址例:MOVAL,[BX+5];

若(DS)=6000H,(BX)=2000H,3.38086的操作数的寻址方式12/5/2023例如:MOVAL,COUNT[SI]或MOVAX,[COUNT+SI]设(DS)=6000H,(SI)=1000H,COUNT=05H有效地址EA=1000H+05H=1005H物理地址PA=6000H×16+1000H+05H=61005H12/5/2023基址变址寻址方式

例:MOVAX,[BP][SI]

设(SS)=2000H,(SI)=1000H,(BP)=5000H,有效地址EA=1000H+5000H=6000H。

3.38086的操作数的寻址方式12/5/2023相对基址变址寻址方式例:MOVAH,[BX+DI+1234H]3.38086的操作数的寻址方式12/5/2023例:设(BX)=1000H,(DI)=2000H,(DS)=3000H,位移量=0020HH。1)直接寻址:MOVAX,[2100H]有效地址EA=2100H物理地址PA=3000H*16+2100H=32100H2)寄存器间接寻址:MOVAX,[BX]EA=1000HPA=30000H+1000H=31000H3)BX寄存器相对间接寻址:MOVAX,[BX+0020H]EA=1000H+0020H=1020HPA=30000H+1020H=31020H3.38086的操作数的寻址方式12/5/20234)变址寻址:MOVAX,[DI]

EA=?PA=?5)DI寄存器相对变址寻址:MOVAX,[DI+1B57H]EA=?PA=?6)基址加变址的寻址:MOVAX,[BX+DI]

7)相对的基址加变址的寻址:MOVAX,[BX+DI+1B57H]3.38086的操作数的寻址方式思考题:12/5/20233.3.4I/O端口寻址寻址个数:最多可达216=65536个8位I/O端口(也可以定义16位或32位)直接寻址地址编号<256,可寻址I/O端口前256个;INAL,60H ;将60H端口中的数据输入到AL中。INAX,80H;将80H与81H相邻两个端口的16位数据输入到AX中。用DX寄存器寻址地址范围可达FFFFH,可寻址64KI/O端口。MOV DX,333H ;将端口地址送入DXOUT DX,AL ;将AL中的数据输出到DX所指的端口中MOV DX,330H ;将端口地址送入DXIN AL,DX ;将DX所指的端口中的数据输入到AL中3-38086的操作数的寻址方式12/5/20233.4通用指令重点介绍8086的指令系统指令系统是一台计算机能识别和执行的全部指令的集合。8086汇编指令系统,分为6类:数据传送指令14条算术运算指令20逻辑运算、移位13串操作指令13控制转移指令28处理器控制指令123.4IA-32通用指令12/5/20233.4.1数据传送指令(14条)MOVLEAPUSHLDSPOPLESXCHGLAHFPUSHFXLATSAHFPOPFINOUT3.4IA-32通用指令12/5/2023数据传送指令:传送指令把数据从一个位置传送到另一个位置除标志寄存器传送指令外,均不影响标志位重点掌握MOVXCHGXLATPUSHPOPLEA12/5/2023MOV传送指令格式:MOVdst,src操作:dstsrc把一个字节或字的操作数从源地址传送至目的地址【例3.8】MOVCX,AX若(AX)=1A90H,执行该指令后,

(CX)=1A90H,(AX)=1A90H不变【例3.9】MOV DI,[BX+20H] 执行指令前,若(DS)=1000H,(BX)=2000H,则EA=2000H+20H=2020H,而(12020H)=56,(12021H)=78H

执行指令后,(DI)=7856H

(一).通用型传送指令3.4.1数据传送指令12/5/2023注意: 1、源和目的操作数不能都是存储器数2、目的操作数不能是立即数,也不能是CS寄存器3、不允许两个段寄存器之间传送数据4、立即数不能直接送段寄存器5、不影响标志位(一).通用型传送指令3.4.1数据传送指令12/5/2023例如:MOV指令-寄存器传送: MOVAL,BL ;(AL)←(BL) MOVCX,AX ;(CX)←(AX) MOVSP,AX ;(SP)←(AX)MOV指令-立即数传送: MOVCL,4 ;(CL)←4,字节传送 MOVDX,0FFH;(DX)←00FFH,字传送 MOVSI,200H ;(SI)←0200H,字传送3.4.1数据传送指令(一).通用型传送指令12/5/2023例如:MOV指令-寄存器与存储器之间传送 MOV[DX],AX;((DX))AX

MOVAL,[BX] ;(AL)

DS:((BX))MOVDX,[BP+4] ;(DX)

SS:((BP+4))MOVAL,BUFFER;BUFFER是已定义的存储单元符号地址MOV指令-段寄存器传送 MOVSS,AX ;(SS)(AX) MOVDS,DAT[SI+BX]MOV[BP+DI],ES3.4.1数据传送指令(一).通用型传送指令12/5/2023例题:判断下列指令是否正确:MOVDS,ES ;非法指令MOVDS,100H ;非法指令修正:movax,es movds,ax修正:movax,100hmovds,axMOVAX,BLMOV100H,DXMOV[DI],200修正:MOVAX,BX修正:MOV[0100H],DX修正:MOVBYTEPTR[DI],200BYTEPTR说明是字节操作3.4.1数据传送指令(一).通用型传送指令12/5/2023MOVDAT[BX+DI],AXMOVAREA2,AREA1

;假设AREA和AREA是两个字变量修正:MOVAX,AREA2MOVAREA1,AX问题:如何在存储器中传送一个数据块?3.4.1数据传送指令12/5/20232.交换指令格式:

XCHGDST,SRC注意:1、dst与src不能同时为内存单元;2、不能使用CS、IP作为操作数。3、不影响标志位例:XCHGAX,BXXCHGBX,[1000H]

例:读下列程序段,写出AX,BX的内容.MOVAX,1234HMOVBX,5678HPUSHAXPOPBXXCHGAX,BXHLT(一).通用型传送指令3.4.1数据传送指令12/5/20233.堆栈操作指令堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定堆栈只有两种基本操作:进栈和出栈两条指令PUSH和POP12/5/2023(1)入栈指令PUSH指令格式:PUSHsrc执行操作:(1)(SP)←(SP)-2,(2)((SP))←(src)L,((SP+1))←(src)H标志位:不影响。【例3.11】PUSHAX指令执行前,若(SS)=2000H,(SP)=0008H, (AX)=12C3H。指令执行后:栈顶指针(SP)=(SP)-2=0008-2=0006H, 栈顶字单元为12C3H,(一).通用型传送指令指令3.4.1数据传送指令12/5/2023(一).通用型传送指令3.4.1数据传送指令PUSHAX入栈操作过程示意图12/5/2023(2)出栈指令POP指令格式:POPdst执行操作:(dst)L←((SP)),(dst)H←((SP+1)),(SP)←(SP)+2标志位:不影响。POPmem16/reg16/segreg【例3.14】POPBX指令执行前,若(SS)=2000H,(SP)=0006H,栈顶内容为1278H,即:(20006H)=78H,(20007H)=12H。指令执行后:(BX)=1278H栈顶指针(SP)=(SP)+2=2008H

12/5/2023POPBX出栈操作过程示意图12/5/2023例:设(SS)=2000H,(SP)=00C0H,执行下述指令后,SP的值=?物理地址PA=?1)PUSHAX;SP=SP-2=00C0-2=00BEH,PA=200BEH2)PUSHBX;SP=00BE-2=00BCH,PA=200BCH3)POP;SP=00BC+2=00BEH,PA=200BCH(一).通用型传送指令3.4.1数据传送指令12/5/20231.换码指令:格式:XLAT操作:(AL)((AL+BX))例:读下列程序段,写出AL,BX的内容

MOVBX,1000HMOVAL,3XLATHLT30313239…1000H1001H1009HTABLE(二)累加器专用传送指令3.4.1数据传送指令12/5/2023XLAT指令的功能12/5/20232.输入输出指令1)、直接寻址:寻址空间为:0~255字节格式:INAL,nOUTn,ALINAX,NOUTN,AX2)、间接寻址:寻址空间为:0000H~FFFFH

格式:INAL,DXOUTDX,ALINAX,DXOUTDX,AX注:1、只能用累加器作为执行输入/输出过程的机构。2、用直接输入/输出指令时,寻址范围为1~255。

3.4.1数据传送指令(二)累加器专用传送指令12/5/20231.取有效地址

格式:LEAreg16,mem

【例3.18】设(BX)=1000H,(BP)=6000H,(SI)=3500H,DAT的偏移地址为20H,指出分别执行下列指令后的结果。LEA BX,[BX+50H];执行指令后,(BX)=1050HLEA DI,DAT[BP][SI] ;执行指令后,(DI)=6000H+3500H+20H=9520HLEA BP,[3456H];执行指令后(BP)=3456HLEA BX,DAT ;执行指令后(BX)=0020H12/5/20232.传送指针到ES格式:LESreg16,mem32reg(EA),ES(EA+2)3.传送指针到DS格式:LDSreg16,mem32reg(EA),DS(EA+2)(三)目标地址传送指令3.4.1数据传送指令12/5/2023例题:LDS

DI,[2000H](DS)=1000H12000H12001H12002H12003H5AH34H00H30H(DI)=345AH(DS)=B521H(三)目标地址传送指令3.4.1数据传送指令12/5/20231读标志:LAHF

2.设置标志:SAHF3.标志寄存器入栈:

PUSHF把标志推入堆栈。

SP

SP-2,PSW(FLAGH)入栈4.标志寄存器出栈:

POPFPSW(FLAG)

[SP+1],[SP]

SP

SP+2D7D6D5D4D3D2D1D0SFZFAFPFCFFLAG(四)标志传送3.4.1数据传送指令12/5/2023例:下面这些指令哪些是正确的?哪些是错误的?如是错误的,请说明原因。1)MOVDS,AX ()

2)MOV [BX],[1000] ()

3)PUSH CS()

4)POPCS ()

5)IN BX,DX ()

6)MOV1000H,AX()

7)MOVAX,BL()

8)OUT300H,AX()

9)OUT20H,AL()

3.4.1数据传送指令12/5/2023例:说明下面程序执行后,AX,CX,DI的内容是什么?

MOVDI,3500H MOVCX,0010H MOVAX,0000H PUSHDIPOPCXXCHGAX,CX

(AX)=3500H,(CX)=0000H,(DI)=3500H3.4.1数据传送指令12/5/20233.4.2算术运算指令

加法:ADD、ADC、INC减法:SUB、SBB、DEC、DAS乘法:MUL、IMUL、AAM除法:DIV、IDIV、AAMAAA、DAA、AAS、DAS、AAM、AAD3.4.2算术运算指令12/5/20231.不带进位位的加法格式:ADDDST,SRC;DST

DST+SRC例:ADDAL,50H;(AL)

AL)+50H ADD[BX+DI],AX2.带进位位的加法格式:ADCDST,SRC;DST

DST+SRC+CF例:ADCAX,SI;(AX)

(AX)+(SI)+CF ADCDX,[SI]注意:指令影响标志AF、OF、PF、SF、ZF,CF。

(一)加法指令3.4.2算术运算指令12/5/20233.加一指令格式:INCsrc;src

src+1将操作数内容加一,再回送操作数。例:INCAX;(AX)

(AX)+1INCBL;(BL)

(BL)+1注意:INC指令影响标志AF、OF、PF、SF、ZF,但不影响进位标志CF。例:读程序: MOVAL,1 MOVBL,0FFH ADDAL,BL执行指令序列后,(AL)=00H),CF=1,OF=0。3.4.2算术运算指令(一)加法指令12/5/20234.非组合BCD码十进制校正AAA操作:执行AAA,若AL低4位的值大于9或AF=1,则在低4位加6,同时置CF=1,AH+1。注意:AAA指令影响标志AF、CF.例:8+7=15MOVAL,8HMOVBL,7HADDAL,BL;(AL)=0FH,AF=0AAA;(AL)=15H,AF=1,CF=1

AF1,CFAF00001000(8)+00000111(7)00001111(FH)+0000011000010101(一)加法指令3.4.2算术运算指令12/5/20235.组合BCD码十进制校正DAA操作:执行DAA,若AL的低4位的值大于9或AF=1,则加06H;若AL的高4位的值大于9,则加60H。注意:DAA指令影响标志AF、CF、PF、SF、ZF。例:

89+75=164

MOVAL,89HMOVBL,75HADDAL,BL;(AL)=0FEH,AF=0,CF=0DAA

;(AL)=64H,CF=1

3.4.2算术运算指令(一)加法指令10001001(89)+01110101(75)11111110(FEH)+0110011010110010012/5/2023例3-1:两个十进制数2964,4758放在BCD1和BCD2开始的单元,低位在前,高位在后,结果放在BCD3中.

BCD1DB64H,29HBCD2DB58H,47H

BCD3DB?,?MOVAL,BCD1ADDAL,BCD2;(AL)=0BCHDAA;(AL)=22H,MOVBCD3,ALMOVAL,BCD1+1

ADCAL,BCD2+1DAAMOVAL,BCD3+12964+475877223.4.2算术运算指令(一)加法指令12/5/20231.不带借位的减法格式:SUBDST,SRC;DST

DST-SRC例:

SUBBX,CX;(BX)(BX)-(CX)SUBWORDPTR[DI],1000H2.带借位的减法格式:SBBDST,SRC

DST

DST

SRC

CF

例:

SBBAX,2030H;执行:(AX)

(AX)

2030H

CFSBBDX,[BX+20H]

3.4.2算术运算指令(二)减法指令12/5/20233.减量指令

格式:DECDST;DST

DST

14.求补指令格式:NEGDST;对DST求补,0-DST例如:MOVAL,1 NEGAL;(AL)=0FFH,CF=1,OF=0,SF=15.比较指令格式:CMPDST,SRC;DST-SRC注意:CMP指令执行相减,但不回送结果,结果只影响标志位CF、OF、SF、ZF。3.4.2算术运算指令(二)减法指令12/5/20236.非组合BCD码减法十进制校正AAS操作:执行AAA,若AL的低4位的值大于9或AF=1,则在AL的低4位减6,同时置CF=1。结果只影响标志位CF、AF。7.组合BCD码减法十进制校正DAS与AAS相似12/5/2023

例3-2:假设AL=13H,BL=09H,读下列指令,分析单独执行这些指令后的结果.程序片段:1)INCAL;(AL)=14H2)ADDAL,BL;(AL)=1CH3)SUBAL,BL;(AL)=0AH4)DECBL;(BL)=08H5)ADDAL,BL;(AL)=1CHDAA;(AL)=22H3.4.2算术运算指令(二)减法指令12/5/2023(三)乘法指令

二进制乘法特点:

两个8位数相乘,结果为16位数。两个16位数相乘,结果为32位数。

8086乘法指令特点:

一个乘数总是放在AL(8位)或AX(16位)中;

将DX看成是AX的扩展3.4.2算术运算指令(三)乘法指令12/5/2023乘法指令分:无符号数MUL

有符号数IMUL例:3×(-2)=-63×14=42(2AH)3的补码:0011,-2的补码:111014的补码:11101)直接相乘:对无符号数,结果正确。0011(3)

×1110(-2或14)00101010(2A)

3.4.2算术运算指令(三)乘法指令12/5/20232)有符号相乘:负数复原为原码,并去掉符号位,相乘后,结果添上符号位,再取补码。

0011(3)

×0010(2)00000110(6)

结果添上负号,1

0000110,再取补码:11111001+1=11111010=FAH=-63×(-2)=-6,结果正确对于3×14,结果错误。3.4.2算术运算指令(三)乘法指令12/5/20231、无符号数乘法

格式:MULsrc;(AX)(AL)×src,字节;(DX,AX)(AX)×src,字

8位乘法

16位乘法

AX操作数DXAX(16位)(16位)(32位)AL操作数AHAL(8位)(8位)(16位)

3.4.2算术运算指令(三)乘法指令12/5/20232、带符号数的乘法

格式:IMULsrc字节乘:(AX)

(AL)*src,字乘:(DX,AX)

(AX)*src,字乘例:IMULBL;AL的内容乘以BL的内容,结果送AX

IMULDI;AX的内容乘以DI的内容,结果送DX.AX

IMULBYTEPTR[DI];

AL的内容乘以DI所指单元的内容,结果送AX

3.4.2算术运算指令(三)乘法指令12/5/2023例:4902H×403AH,结果送0510H~0513H单元.

MOVAX,4902HMOVBX,403AHMULBXMOV[0510H],AXMOV[0512H],DX

3.4.2算术运算指令(三)乘法指令12/5/2023(四)除法指令

1、无符号数除法格式:

DIVsrc:字节除:(AX)

src,(AL)

商,(AH)

余数字除:(DX.AX)

src,(AX)

商,(DX)

余数注意:被除数在累加器中,且必须是除数的两倍字长。

3.4.2算术运算指令(四)除法指令12/5/20238位除法:

被除数(16位)除数(8位)

余数(8位)商(8位)AHAL操作数AHAL3.4.2算术运算指令(四)除法指令12/5/2023DXAX操作数DXAX16位除法:

被除数(32)除数(16)

余数(16)商(16)3.4.2算术运算指令(四)除法指令12/5/20232、有符号数除法格式:IDIVsrc

字节除:(AL)

AX

src(商),(AH)

余数,字除:(AX)

(DXAX)

src(商)(DX)

余数3、扩展字节为字CBW

将AL寄存器的符号位扩展到AH中。(AL)<80H,执行CBW后,(AH)=00H。(AL)>=80H,执行CBW后,(AH)=FFH。3.4.2算术运算指令(四)除法指令12/5/20234、扩展字为双字CWD

(DX,AX)(AX)将AX寄存器的符号位扩展到DX中。(AX)<8000H,执行CWD后,(DX)=0000H。(AL)>=8000H,执行CWD后,(DX)=FFFFH。12/5/2023例3-3:设AL=-2,BL=-1,编程求-2/-1=?,将商存DL单元。 MOVAL,-2;(AL)=0FEH MOVBL,-1;(BL)=0FFH CBW;(AX)=0FFFEH IDIVBL;(AL)=2,(AH)=0 MOVDL,AL HLT3.4.2算术运算指令(四)除法指令12/5/2023例3-4:试计算(X*Y+Z)/X,X,Y,Z都是16位无符号数,结果存在S开始的单元.XDW304YDW10ZDW200SDW?,?

MOVAX,XMULYADDAX,ZADCDX,0DIVXMOVS,AXMOVS+2,DX

304100BE0DXAX2000CA83.4.2算术运算指令(四)除法指令12/5/20235.非组合BCD码的乘法校正

要求乘数和被乘数用非组合的BCD码表示。

AAM;(AH)

(AL)/(0AH)(商);(AL)

余数注意:AAM指令紧跟MUL之后。6.非组合BCD码除法校正

AAD (AL)

10*(AH)+(AL),(AH)

0

被除数为二位的非压缩BCD码,存AX中,除数为一位的非压缩BCD码。注意:AAD指令应该在除法指令之前。3.4.2算术运算指令(四)除法指令12/5/20233.4.3逻辑运算指令、移位指令逻辑指令非循环移位指令循环移位指令3.4.3逻辑运算指令、移位指令12/5/2023(一)、逻辑指令ANDdst,srcORdst,srcXORdst,srcNOTdstTESTdst,src例:ANDAX,BXANDAH,0FHORAL,0F0H;TESTAL,01;测试AL的D0=1?XORAX,AX;将AX清零3.4.3逻辑运算指令、移位指令(一)逻辑指令12/5/2023例3-7:设AH=10011101,对AH的高四位置零,低四位保持不变。ANDAH,0FH

10011101AND0000111100001101例3-8:ORAH,00001101BORAH,0F0H00001101OR11110000

111111013.4.3逻辑运算指令、移位指令(一)逻辑指令12/5/2023例3-9:使AL中的数,第0、1位取反。MOVAL,01010001B;送操作数XORAL,03H;送特征数00000011HLT;暂停

01010001(AL)

XOR00000011010100103.4.3逻辑运算指令、移位指令(一)逻辑指令12/5/2023例3-10:测试AL中的第0、1、2位是否为零。MOVAL,48HTESTAL,07H;测AL的0、1、2位HLT

01001000AND00000111000000003.4.3逻辑运算指令、移位指令(一)逻辑指令12/5/2023(二)、非循环移位指令SHLdst,count;逻辑左移SHRdst,count;逻辑右移SALdst,count;算数左移SARdst,count;算数右移CML00MLCCML0MLC3.4.3逻辑运算指令、移位指令(二)非循环移位指令12/5/2023注意:移位指令影响标志位CF、OF、PF、SF和ZF。如果只移一位,指令中用1指出移位的位数,如果超过1位,必须用CL预先指明移位的位数。例:SALDX,1;DX中的数左移1位MOVCL,4SALAX,CL;AX中的数左移4位SHLAL,CL;SHRAL,CL;AL中的数右移4位3.4.3逻辑运算指令、移位指令(二)循环移位指令12/5/2023例3-11A:X乘以10的例子。 MOVAL,X SHLAL,1 ;X*2 MOVBL,AL SHLAL,1 ;X*4 SHLAL,1 ;X*8 ADDAL,BL ;X*8+X*23.4.3逻辑运算指令、移位指令12/5/2023(三)、循环移位指令ROLdst,count;左小循环RORdst,count;右小循环RCLdst,count;左大循环RCRdst,count;右大循环例:ROLAL,1操作:AL:1001000100100011;CF=1例:MOVCL,2ROLBH,CL操作:BH:10101111 ;CF=0

101111103.4.3逻辑运算指令、移位指令(二)循环移位指令12/5/2023SHL和SAL指令的功能12/5/2023SHR指令的功能12/5/2023SAR指令的功能12/5/2023ROL指令的功能12/5/2023ROR指令的功能12/5/2023RCL指令的功能12/5/2023RCR指令的功能12/5/2023第四讲串操作指令控制转移指令系统功能调用简单程序调试12/5/20233.4.4串操作指令(A)、串操作的特点1)、SI寻址源操作数,段地址在DS,DI寻址目的操作数,段地址在ES;2)、每次操作后,SI、DI自动修改:DF=0,SI和DI加1或(+2),DF=1,SI、DI减一或减二。3)、若源字串和目的字串在同一段中,则把DS和ES设成相同数字。4)、通过重复前缀实现串操作3.4.4串操作指令特点12/5/2023(B)、重复前缀:1、REP(1).若(CX)=0,退出重复操作;(2).(CX)≠0,执行串操作一次,(CX)

(CX)-1,

根据指令修改SI、DI,转(1)。2、相等重复前缀REPZ(REPE)(1).若(CX)=0,或ZF=0,退出重复操作;(2).(CX)≠0,执行串操作一次,(CX)

(CX)-1,根据指令修改SI、DI,转(1)。用途:用于比较两个字串,找出不同的字。3.4.4重复前缀12/5/20233、不相等重复前缀REPNZ(REPNE)(1).若(CX)=0,或ZF=1,退出重复操作;(2).(CX)≠0,执行串操作指令一次,(CX)

(CX)-1,根据指令修改SI、DI。用途:1)在一个字串中,找到需要的字。2)用于比较两个字串,找出相同的字串。3.4.4重复前缀12/5/2023(一).串传送指令:MOVSB/MOVSW

字节操作:MOVSB字操作:MOVSW1).SI指向源串(数据段DS),DI指向目的(附加段ES);2).CX置入传送的字串数;3).CLD清DF=0:对字节操作:(SI)←(SI)+1;(DI)←(DI)+1);

对字操作:(SI)←(SI)+2;(DI)←(DI)+2;STD置DF=1:字节操作:(SI)←(SI)-1,(DI)←(DI)-1;对字操作:(SI)←(SI)-2;(DI)←(DI)-2;4).REPMOVSB,重复前缀,每传送一次,CX中的值减一。((ES:DI))←((DS:SI))标志位:不影响标志位12/5/2023例3-12:

将100个字节,从地址为AR1单元传送到地址为AR2单元区.LEASI,AR1;SI指向源串地址LEADI,AR2;DI指向目的串地址MOVCX,100;置计数器CLD;清方向标志REPMOVSB;将源地址的100个字节传送到目的地址单元HLT3.4.4串传送指令12/5/2023(二)串比较指令CMPS执行的操作:源串-目的串:((SI))-((DI)) DF=0: (DI)

(DI)+1(字操作+2) (SI)(SI)+1(字操作+2) DF=1: (DI)

(DI)-1(字操作-2) (SI)(SI)-1(字操作-2)标志位:A、C、O、P、S,z在CMPSW/CMPSB前使用重复前缀:用REPZ/REPE,表示两个字串比较相等时继续下次比较,若不相等则退出比较。用途:用于比较两个字串,找出第一个不相等的字符。3.4.3串比较指令CMPS12/5/2023

【例3-13】检验一段被送过的数据是否与原串完全相同.若相同,在RESULT置0,否则置0FFH。STR1DB1,2,3,4,5,6,7,7,8,0STR2DB1,2,3,4,5,6,7,8,9,0RESULTDB?

MOVSI,OFFSETSTR1 MOVDI,OFFSETSTR2 MOVCX,10 CLD REPZCMPSB JNZNOEQU;串不相等转 MOVAL,0 JMPOUTPUTNOEQU: MOVAL,0FFHOUTPT: MOVRESULT,ALSTOP: JMPSTOP3.4.3串比较指令CMPS12/5/2023(三)字串检索指令:

SCASB/SCASW

操作:AL(AX)—((DI))(DI)

(DI)±1(字操作:±2)用AL或AX中的一个字串和位于ES段由DI指出的内存单元的字节或字比较。

功能:从一个字串中查找一个与AL或AX中不同的字符,或寻找一个相同的字符.3.4.3字串检索指令12/5/2023(四)取字串指令:

LODSB/LODSW执行的操作:(AL)或(AX)((SI))(SI)

(SI)±1(或±2)将位于DS段由SI指出的内存单元的字节或字的内容取到AL或AX中。注意:因为取来的字或字节放在AX或AL中,LODSB/LODSW前面不能加前缀。(五)存储指令:

STOSB/STOSW

执行的操作:((DI))

(AL)(或AX)(DI)

(DI)±1(或±2)3.4.3取字串指令存储指令12/5/2023例3:将0404H单元开始的256单元清零。

CLD

;清方向标志

LEADI,0404H

;DI指向字串地址

MOVCX,256;共256个字节

XORAX,AX;AX清零REPSTOSBHLT

12/5/2023例3-14:

从地址为BLOCK开始单元,存放100个字节的字符串,找出第一个字符$(ASCII码24H),将$的第一个地址存入BX中,否则将BX清零.

1)分析:要求找指定字符$,可以用指令SCASB;重复前缀用REPNZ,表示表示两个字串比较不相等时继续,否则退出循环$的地址应为多少?

1031332445DIDI1000H1001H1002H1003H….3.4.3字串处理例题12/5/20232).程序段: MOVDI,1000H;送目标串首地址 MOVCX,256 CLD;清方向标志 MOVAL,‘$’

REPNZSCANB;AL-[DI] JZFOUND;找到$,转 MOVBX,0 JMPSTOPFOUND: DECDI;退回到$所在地址 MOVBX,DI;$所在地址送BX JMPSTOPSTOP: HLT3.4.3字串处理例题12/5/2023例3-15:P84:统计数据块中正数与负数的个数.并将正数与负数分别送到两个缓冲区。BLOCK DB-1,-3,5,6,-2,0,20,10PLUS_D DB8DUP(?);正数缓冲区MINUS_D DB8DUP(?);负数缓冲区PLUS DB0MINUS DB0MOVSI,OFFSETBLOCKMOVDI,OFFSETPLUS_DMOVBX,OFFSETMINUS_DMOVCX,8;数据个数送CX3.4.3字串处理例题12/5/2023GOON:LODSBTESTAX,80HJNZJMIUSINCPLUS;正数个数加一STOSB;传正数JMPAGAINJMIUS:INCMINUS;负数个数加一XCHGBX,DISTOSB;送负数到缓冲区XCHGBX,DIAGAIN:DECCXJNZGOON3.4.3字串处理例题12/5/20233.4.5控制转移指令控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变3.4.5控制转移指令12/5/2023目标地址的寻址方式相对寻址方式指令代码中提供目的地址相对于当前IP的位移量,转移到的目的地址(转移后的IP值)就是当前IP值加上位移量直接寻址方式指令代码中提供目的逻辑地址,转移后的CS和IP值直接来自指令操作码后的目的地址操作数间接寻址方式指令代码中指示寄存器或存储单元,目的地址从寄存器或存储单元中间接获得12/5/2023段内转移——近转移(near)在当前代码段64KB范围内转移(±32KB范围)不需要更改CS段地址,只要改变IP偏移地址段内转移——短转移(short)转移范围可以用一个字节表达,在段内-128~+127范围的转移段间转移——远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围需要更改CS段地址和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址代码段代码段实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移程序员可用操作符short、nearptr或farptr强制成为需要的转移类型12/5/2023(一)、转移指令1、无条件转移指令

段内转移:

JMP1000H;IP

IP+1000HJMPSHORTLOP1;LOP1是标号

段间转移

JMPFARPTRLOP2IP

LOP2的段内偏移地址CS

LOP2的段地址JMPDWORDPTR[BX]IP

[BX]CS

[BX+2]3.4.5转移指令和调用指令直接寻址:用标号表达间接寻址:用寄存器或存储器操作数表达12/5/20232、条件转移指令

形式:JX短目标地址X:1~3个英文字母跳转范围:-128~+127字节1)JE/JZ;等于,A=BJNZ/JNE;不等于,A<>B2)无符号数比较JB/JNAE:A<BJNB/JAE:A>=BJA/JNBE:A>B;JNA/JBE:A<=B3.4.5条件转移指令12/5/20233)带符号数比较指令JL:A<BJNL:A>=BJG:A>BJNG:A<=B4)其它转移指令JS、JNS;JO、JNO;JP、JPE:P=1JPO、JNP;JCXZ:CX=0转移

3.4.5条件转移指令12/5/2023例3-16:比较1000H、1001单元的两个数,将大数存2000H单元中。解:MOVBX,1000H;第一数送ALMOVAL,[BX]INCBX;指向第二数CMPAL,[BX];两数比较JALOP1;大于转MOVAL,[BX];大数AL送LOP1:MOV[2000H],ALHLT3.4.5例题12/5/2023【例3.18】测试AL中的D7位,若为0,则置BL为0;否则置BL为0FFH。 TEST AL,80H ;测试D0=0? JZ LP ;为0,转LP MOV BL,0FFH ;否则,置BL为0FFH JMP STOP LP:MOVBL,0 ;置BL为0STOP: ……12/5/2023(二).子程序调用和返回指令子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行

转移指令有去无回子程序调用需要返回,其中利用堆栈保存返回地址12/5/2023(1)CALLdst操作:段间调用

①当前CS,IP入栈,SP←SP-4②CS←DST的段值,IP←DST的偏移地址段内调用:

①当前IP入栈,SP←SP-2②IP←DST的偏移地址(2)RET

段内返回:SP+2段间返回:SP+43.4.5子程序调用和返回指令12/5/2023CALL指令分成4种类型(类似JMP)CALLLabel ;段内调用、直接寻址CALLR16/M16 ;段内调用、间接寻址CALLFARPTRLabel ;段间调用、直接寻址CALLFARPTRMem ;段间调用、间接寻址例如:

CALL1000H;段内直接调用

1)断点处地址IP入栈,(SP)

(SP)-22)装入入口地址(IP)

(IP)+1000H若段内直接调用的标号为:SUBP,偏移地址为1000H可以写为:

CALLAUBP

12/5/2023CALL2500H:3600H;段间直接调用1)断点处地址:CS值入栈,IP值入栈2)装入入口地址

温馨提示

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

评论

0/150

提交评论