《微机原理与接口技术》课件-第3章8086指令系统3-3_第1页
《微机原理与接口技术》课件-第3章8086指令系统3-3_第2页
《微机原理与接口技术》课件-第3章8086指令系统3-3_第3页
《微机原理与接口技术》课件-第3章8086指令系统3-3_第4页
《微机原理与接口技术》课件-第3章8086指令系统3-3_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1微机原理与接口技术2§3-38086的指令系统

——逻辑运算和移位指令

三、逻辑运算和移位指令指令的种类逻辑运算算术逻辑移位循环移位逻辑运算NOT取反AND逻辑乘(与)OR逻辑加(或)XOR异或TEST测试算术逻辑移位SHL/SAL逻辑/算术左移SHR逻辑右移SAR算术右移循环移位ROL循环左移ROR循环右移RCL通过进位的循环左移RCR通过进位的循环右移3§3-38086的指令系统

——逻辑运算和移位指令1.逻辑运算指令(LogicalOperations)⑴NOT取反指令(LogicalNot)指令格式:NOT目的指令功能:目的

目的取反操作数要求:①可以是8位或16位寄存器、存储器。②对于存储器操作,需指明是字还是字节。

注意:指令执行后,对标志位无影响。

NOTAX ;AX

AX取反

NOTBL ;BL

BL取反

NOTBYTEPTR[BX] ;对存储单元字节内容取反后送回该单元4§3-38086的指令系统

——逻辑运算和移位指令⑵AND逻辑与指令(LogicalAND)指令格式:AND目的,源指令功能:目的

目的∧源

有置“0”功能⑶OR逻辑或指令(LogicalOR)

指令格式:OR目的,源

指令功能:目的

目的∨源

有置“1”功能。

MOVAX,3538HANDAX,0F0FH;AX

0508HORAX,3030H ;AX

3538H5§3-38086的指令系统

——逻辑运算和移位指令⑷XOR异或操作指令(ExclusiveOR)指令格式:XOR目的,源指令功能:目的

目的∨

源有取反功能(和“1”相异或)⑸TEST测试指令(Test)指令格式:TEST目的,源指令功能:目的∧源逻辑与操作,并修改标志位,但不回送结果,两个操作数都不变。

6§3-38086的指令系统

——逻辑运算和移位指令例设AL寄存器中存有报警标志。若D7=1,表示温度报警,程序要转到温度报警处理程序T_ALARM;D6=1,则转压力报警程序P_ALARM。用TEST指令来实现这种功能。

解:TESTAL,80H ;查AL的D7=1?

JNZT_ALARM ;是1(非零),则转温度报警程序

TESTAL,40H ;D7=0,D6=1?

JNZP_ALARM ;是1,转压力报警7§3-38086的指令系统

——逻辑运算和移位指令

2.算术逻辑移位指令(ShiftArithmeticandShiftLogical)

这类指令可对寄存器、存储器中的字或字节的各位进行算术移位或逻辑移位,移位的次数由指令中的计数值决定。移位指令的操作示意图如下:8§3-38086的指令系统

——逻辑运算和移位指令⑴SAL算术左移指令(ShiftArithmeticLeft)指令格式:SAL目的,1/CL⑵SHL逻辑左移指令(ShiftLogicLeft)指令格式:SHL目的,1/CL指令功能:以上两条指令的功能完全相同,均将寄存器或存储器中的目的操作数的各位左移,每移一次,最低有效位LSB补0,而最高有效位MSB进入标志位CF。

MOVAH,06H ;AH=60H SALAH,1 ;将AH的内容左移1次,AH=0CH MOVCL,03H SHLDI,CL ;将DI的内容左移3次

SALBYTEPTR[BX] ;将内存单元的字节左移1位9§3-38086的指令系统

——逻辑运算和移位指令注意:▲移动一次,相当于将目的操作数乘以2;▲计数值就是所要移位的次数。若移位一次,直接将计数值置1;移位次数大于1,将移位次数送进CL,再把CL放在计数值位置上。10§3-38086的指令系统

——逻辑运算和移位指令⑶逻辑右移指令(ShiftLogicRight)指令格式:SHR目的,1/CL指令功能:各位进行右移。每移一次,低位进入CF,最高位补0。

注意:若目的操作数为无符号数,每右移一次,目的操作数除以2,余数被丢掉。

例用右移的方法作除法133/8=16…5。解:MOVAL,10000101B ;AL=133MOVCL,03H ;CL=移位次数

SHRAL,CL ;右移3次指令执行后,AL=10H=16,余数5被丢失。标志位CF、AF不定。

11§3-38086的指令系统

——逻辑运算和移位指令⑷SAR算术右移指令(ShiftArithmeticRight)指令格式:SAR目的,1/CL指令功能:各位右移。每移位一次,最低位进入CF,但最高位(即符号位)保持不变。注意:每移一次,相当于对带符号数进行除2操作。

例用SAR指令计算-128/8=-16。解:MOVAL,10000000B ;AL=-128MOVCL,03H ;右移次数3SARAL,CL;算术右移3次后,AL=0F0H=-1612§3-38086的指令系统

——逻辑运算和移位指令

3.循环移位指令(Rotate)

算术逻辑移位指令,移出操作数的数位均被丢失;循环移位指令把操作数从一端移到另一端,移出的位不丢失。循环移位指令共四条:操作如图所示。⑴ROL循环左移指令(RotateLeft)指令格式:ROL目的,1/CL⑵ROR循环右移指令(RotateRight)指令格式:ROR目的,1/CL⑶RCL通过进位位循环左移(RotatethroughCarryLeft)指令格式:RCL目的,1/CL⑷RCR通过进位位循环右移(RotatethroughCarryRight)指令格式:RCR目的,1/CL13§3-38086的指令系统

——逻辑运算和移位指令

循环移位指令操作示意图:14§3-38086的指令系统

——逻辑运算和移位指令注意:

循环移位后:结果→目的操作数。目的操作数可以是8/16位的寄存器、存储器,移位的次数可以是1,也可以由CL寄存器的值指定。15例如:计算a×3+b×7MOVSI,aSHLSI,1 ADDSI,a MOVDX,bMOVCL,03hSHLDX,CLADDDX,b ADDDX,SI请分析!该程序段有错吗?16§3-38086的指令系统

——字符串处理指令

8086CPU提供了串操作指令,使长字符串的处理更快速、方便。共有5条串操作指令和3条重复前缀指令。四、字符串处理指令指令名称字节/字操作字节操作字操作字符串传送字符串比较字符串扫描字符串装入字符串存储MOVS目的串,源串CMPS目的串,源串SCAS目的串LODS源串STOS目的串MOVSBCMPSBSCASBLODSBSTOSBMOVSWCMPSWSCASWLODSWSTOSW字符串操作指令的类型和格式17§3-38086的指令系统

——字符串处理指令关于隐合约定:

①源串:起始地址(或末地址)为DS:SI。源串允许使用段超越前缀来修改段地址。②目的串:起始地址(或末地址)为ES:DI。目的串不允许使用段超越前缀修改ES。如果要在同一段内进行串运算,必须使DS和ES指向同一段。③指针:每执行一次字符串指令,指针SI和DI会自动修改,以指向下一个待操作单元。18§3-38086的指令系统

——字符串处理指令

④DF标志:控制字符串处理的方向。DF=0为递增方向。DS:SI指向源串首地址,每执行一次串操作:字节串操作时,SI、DI分别增1;字串操作时,SI和DI分别增2;DF=1为递减方向。DS:SI指向源串末地址,每执行一次串操作:字节串操作时减1;字串操作时减2。STD指令使DF置1,CLD指令将DF清0。⑤串长度:要处理的字符串长度(字节或字数)放在CX寄存器中。19§3-38086的指令系统

——字符串处理指令

关于重复前缀:①功能在基本指令前加重复前缀,可加快串运算指令的执行速度。每重复执行一次,地址指针SI和DI按方向标志自动修改,CX的值自动减1。②类型与格式

REP:无条件重复(Repeat),常与MOVS连用,连续传送字符串。直到传送完毕,即CX=0为止。

REPE/REPZ:相等/结果为零则重复(RepeatwhileEqual/Zero),常与CMPS连用,连续比较字符串。当两个字符串相等(ZF=1)和CX≠0时,则重复进行比较,直到ZF=0或CX=0为止。20§3-38086的指令系统

——字符串处理指令

REPNE/REPNZ:不相等/结果非零则重复(RepeatwhileNotEqual/NotZero),常与SCAS连用,当结果非0(ZF=0)和CX≠0时,重复进行扫描,直到ZF=1或CX=0为止。带有重复前缀的串指令执行过程中允许有中断进入。格式:MOVSBMOVSW功能:MOVSB是将DS:SI逻辑地址所指存储单元的字节传送到ES:DI逻辑地址所指的存储单元中,当DF=0,SI和DI均增1;当DF=1,SI和DI均减1。

MOVSW是将DS:SI逻辑地址所指存储单元的字传送到ES:DI逻辑地址所指的存储单元中,当DF=0,SI和DI均增2;当DF=1,SI和DI均减2。

即:[SI]→[DI]SI±1/2→SIDI±1/2→DI1.MOVS字符串传送指令(MoveString)

例如:MOVSI,2000HMOVDI,3000HMOVCX,100;CX←传送次数CLD;设置DF=0,实现地址增加again:MOVSB;传送一个字节DECCX ;传送次数减1JNZagain;判断传送次数CX是否为0,不为0,则转移again处执行;。。。否则,继续。2.CMPS字符串比较指令(CompareString)格式:CMPSBCMPSW功能:CMPSB是将DS:SI逻辑地址所指存储单元的字节与ES:DI逻辑地址所指的存储单元中的字节相比较,当DF=0,SI和DI均增1;当DF=1,SI和DI均减1。

CMPSW是将DS:SI逻辑地址所指存储单元的字与ES:DI逻辑地址所指的存储单元中的字相比较,当DF=0,SI和DI均增2;当DF=1,SI和DI均减2。

即:[DI]-[SI]SI±1/2→SIDI±1/2→DI例如:比较从逻辑地址2000H:100H开始的10个字节与逻辑地址4000H:200H开始的10个字节是否对应相等,相等则设置00h标记,否则设置FFH标记。MOVDS,2000HMOVES,4000HMOVSI,100H;MOVDI,200H;MOVCX,10CLDagain:CMPSB;比较两个字符JNZunmat;有不同字符,转移到unmatDECCXJNZagain;进行下一个字符的比较MOVAL,0;字符串相等,设置00h标记JMPoutput ;转向outputUnmat:MOVAL,0FFH;设置FFH标记output:MOVresult,AL;输出结果标记3.SCAS字符串扫描指令(ScanString)

格式:SCASWSCASB功能:SCASB/SCASW在字符串中查找一个与已知数值相同或

不同的元素。

SCASB将AL中的字节与逻辑地址ES:DI所指单元中的字节相比较。当DF=0,DI增1;当DF=1,DI减1。

SCASW将AX中的字与逻辑地址ES:DI所指单元中的字相

比较,当DF=0,DI增2;当DF=1,DI减2。该两条指令都是通过影响标志位AF、CF、OF、PF、SF

和ZF来反映比较结果,不改变被比较的两个操作数。即:AL/AX-[DI]DI±1/2→DI例如:从逻辑地址9000H:100H开始的10个单元中寻找空格,遇到第一个空格即跳转到found。MOVES,9000HMOVDI,100HMOVAL,20H;空格的ASCII码0x20HMOVCX,10CLD;DF=0,增址;again:SCASB;搜索,即AL-ES:[DI]JZfound;为0(ZF=1),发现空格DECCX;不是空格JNZagain ;搜索下一个字符...;不含空格,则继续执行found:...

4.LODS取字符串指令(LoadString)格式:LODSBLODSW功能:LODSB将逻辑地址DS:SI所指单元中的字节取到AL中当DF=0,SI增1;当DF=1,SI减1。

LODSW将逻辑地址DS:SI所指单元中的字取到AX中,当DF=0,SI增2;当DF=1,SI减2。即:[SI]→AL/AXSI±1/2→SI例如:将100H:20H单元开始10个字节的内容均加6。CLD;方向标志清0,SI递增MOVCX,10;置计数初值10MOVDS,100H;置DS为100HMOVSI,20H;置SI为20,作为初始地址指针again:LODSB;取1个字节到AL中,并使SI增1ADDAL,6;加6

MOV[SI-1],AL;处理结果送回DECCX;计数值减1JNZagain;如未处理完,转again。。。。。。5.STOS数据串存储指令(Storestring)格式:STOSBSTOSW功能:STOSB把AL中的值存到逻辑地址ES:DI所指单元中当DF=0,DI增1;当DF=1,DI减1。STOSW把AX中的值存到逻辑地址ES:DI所指单元中当DF=0,DI增2;当DF=1,DI减2。即:AL/AX→[DI]DI±1/2→DI例如:将100H:20H开始的128个单元清0。CLD;清除方向标志,DI递增MOVCX,0080H;置计数初值128MOVES,100H;置ES为100HMOVDI,20H;置DI为20H,作为始地址指针XORAL,AL;AL清0again:STOSB;将128个字节清0DECCXJNZagain。。。。。。6、重复前缀的使用举例

例:下列程序可改用重复前缀。MOVSI,2000HMOVDI,3000HMOVCX,100;CX←传送次数CLD;设置DF=0,实现地址增加

again:MOVSB;传送一个字节DECCX;传送次数减1JNZagain;判断传送次数CX是否为0,不为0,则转移again处执行;否则,继续。

。。。。。。使用重复前缀后,代码如下:MOVSI,2000HMOVDI,3000HMOVCX,100;CX←传送次数CLD;设置DF=0,实现地址增加

REPMOVSB;传送一个字节例2:从逻辑地址9000H:100H开始的10个单元中寻找空格,遇到第一个空格即跳转到found。MOVES,9000HMOVDI,100HMOVAL,20H;空格的ASCII码0x20HMOVCX,10CLD;DF=0,增址;REPNESCASB;搜索,即AL-ES:[DI]JZfound;为0(ZF=1),发现空格...;不含空格,则继续执行found:...3333五、控制转移指令作用:改变CS和IP的值,从而改变指令的执行顺序。类型:无条件转移和过程调用指令条件转移指令条件循环控制指令中断指令无条件转移和过程调用指令JMPCALLRET无条件转移过程调用过程返回条件转移JZ/JE等10条指令JA/JNBE等8条指令直接标志转移间接标志转移条件循环控制LOOPLOOPE/LOOPZLOOPNE/LOOPNZJCXZCX≠0则循环CX≠0和ZF=1则循环CX≠0和ZF=0则循环CX=0则转移中断INTINTOIRET中断溢出中断中断返回3434五、控制转移指令作用:改变CS和IP的值,从而改变指令的执行顺序。(一)、转移的类型1、段内转移:简称NEAR(如果转移位移量在-128~+127则称

为段内段转移,简称SHORT).2、段间转移:简称FAR(从一个段转移到了另外一个段)(二)段内转移和段间转移的特点段内转移只改变IP.

段间转移要同时改变CS和IP(三)、转移指令的寻址方式

直接寻址(段内直接寻址和段间直接寻址)

间接寻址(段内间接寻址和段间间接寻址)353578H23H34H12H56H78H18H72H97H45H56H89HCS1:IP1CS2:IP2CS3:IP3代码段1代码段2代码3段CS1:IP1CS1:IP2段内转移段间转移1、无条件跳转指令格式:JMP目标地址功能:使程序无条件地转移到指定的目标地址处。目标地址的寻址方式分为直接寻址和间接寻址两种方式,

而目标地址的分布范围则分为段内转移和段间转移,因

此,JMP指令可分4种类型:

①段内转移、直接寻址 ②段内转移、间接寻址;

③段间转移、直接寻址;

④段间转移、间接寻址。①段内转移、直接寻址格式:JMPlabel 功能:跳转到IP←IP+label 所指的指令处。位移量label是紧接着JMP指令后的那条指令

的偏移地址到目标指令的偏移地址的地址移。当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负。

该指令不修改CS寄存器的内容。如:JMPagain ;转移到again处继续执行

……again:DECCX ;标号again的指令

…… JMPoutput ;转向output ……output:MOVresult,AL;标号output的指令②段内转移、间接寻址格式:JMP寄存器/mem 功能:将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容。如:JMPAX ;IP←AX JMPwordptr[2000h];IP←[2000h]③段间转移、直接寻址格式:JMPfarptrlabel功能:将标号label所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值。④段间转移、间接寻址格式:JMPfarptrmem 功能:用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器。例1:MOVwordptr[BX],0 MOVwordptr[BX+2],1000h JMPfar[BX] ;转移到1000h:0h例2:①JMPSHORTMI;SHORT为短程属性算符,属于段内直接转移②JMPNEARPRTM2;NEAR为近程属性算符,是段内直接转移③JMPCX;转移地址的偏移量由CX指出,属于段

内间接转移④JMPFARPTRM3;FAR为远程属性算符,属于段间直接转移⑤JMPDWORDPTR[SI];DWORD为双字属性算符,段地址和偏

移量放在SI、SI+1、SI+2、SI+3这4

个单元中,前两个单元的内容作为偏

移量,后两个单元的内容作为段地址;

属于段间间接转移。41

2.条件转移指令根据上一条指令执行后的状态标志作为判别测试条件来决定是否转移。条件转移均为段内短转移。目的地址=当前IP值+8位相对位移量。它与转移指令之后的那条指令间的距离,允许为-128~+127字节;8位偏移量用符号扩展法扩展到16位与IP相加。指令格式:条件操作符标号条件转移指令共有18条,可以为两类:直接标志转移指令间接标志转移指令42

⑴直接标志转移指令(10条)在指令助记符中直接给出标志状态的测试条件:以CF,ZF,SF,OF和PF等5个标志的10种状态为判断的条件。表3-11

直接标志条件转移指令指令助记符测试条件指令功能JCJNCJZ/JEJNZ/JNEJSJNSJOJNOJP/JPEJNP/JPOCF=1CF=0ZF=1ZF=0SF=1SF=0OF=1OF=0PF=1PF=0有进位转移无进位转移结果为零/相等转移不为零/相等转移符号为负转移符号为正转移溢出转移无溢出转移奇偶位为1/为偶转移奇偶位为0/为奇转移例:用条件跳转指令实现程序的循环

MOVSI,2000HMOVDI,3000HMOVCX,50again:MOVSBDECCXJNZagain┇4444

⑵间接标志转移指令的助记符中不直接给出标志状态位的测试条件,而是标志的状态组合作为测试的条件。指令应用:通常放在比较指令CMP之后,以比较两个数的大小。无符号数比较测试指令中,指令助记符中的“A”是英文Above的缩写,表示“高于”之意,“B”是英文Below的缩写,表示“低于”之意;带符号数比较测试指令中,指令助记符中的“G”(Greatthan)表示大于,“L”(Lessthan)表示小于。

4545

表3-12

间接标志条件转移指令类别指令助记符测试条件指令功能无符号数比较测试JA/JNBEJAE/JNBJB/JNAEJBE/JNACF∨ZF=0CF=0CF=1CF∨ZF=1高于/不低于等于转移高于等于/不低于转移低于/不高于等于转移低于等于/不高于转移带符号数比较测试JG/JNLEJGE/JNLJL/JNGEJLE/JNG(SF⊕OF)∨ZF=0SF⊕OF=0SF⊕OF=1(SF⊕OF)∨ZF=1大于/不小于等于转移大于等于/不小于转移小于/不大于等于转移小于等于/不大于转移例:设有2个无符号字节数存放在以010H单元为首地址的数据缓冲区中,试编程把较高的数送060H单元中。MOVSI,010H;首址010H送SIMOVAL,[SI];取第一个数据CMPAL,[SI+1];与第二个数相比较JAresu;如果高于第二个数,转resuMOVAL,[SI+1];取第二个数resu:MOVSI,060H;将较高的数送至060HMOV[SI],AL例:设有2个有符号字节数存放在以010H单元为首地址的数据缓冲区中,试编程把较高的数送060H单元中。MOVSI,010H;首址010H送SIMOVAL,[SI];取第一个数据CMPAL,[SI+1];与第二个数相比较

JGresu;如果高于第二个数,转resuMOVAL,[SI+1];取第二个数resu:MOVSI,060H;将较高的数送至060HMOV[SI],AL3、循环控制指令格式:LOOP目标地址;CX-1→CX,CX≠0则转目标地址。

LOOPZ/LOOPE目标地址;CX-1→CX,CX≠0且ZF=1,

则转目标地址继续,否则跳出循环;

LOOPNZ/LOOPNE目标地址;CX-1→CX,CX≠0且ZF=1,

则转目标地址继续,否则跳出循环;例:编程求1+2+3+4+…+50MOVCX,50;置循环计数初值50MOVAX,0;求和寄存器AX清0,

SUM:ADDAX,CX;把CX计数值累加入AXLOOPSUM;CX=CX-1,当CX≠0时再循环

RET;返回,结果在AX中50

4、过程调用和返回指令(CallandReturn)过程:一段具有特定功能的,供其它程序调用的公用程序。

也称子程序。特点:调用子程序时,IP(CS)的内容被压入堆栈栈顶。子程

序返回时,栈顶的内容又被弹出到IP(CS)。子程序执行结束

后一般均要返回调用程序。一次定义,多次调用;

优点:程序代码短,结构清晰,便于编程、调试、修改和阅读

过程嵌套:在过程运行中又去调用另一个过程。过程调用和返回指令的格式:CALL 过程名

RET近过程调用:调用指令CALL和被调用的过程在同一代码段中

远过程调用:两者在不同代码段中。

5151返回指令返回、、、、、、、、、、、、调用指令、、、、、、、、、、、、调用

主程序子程序、、、主程序子程序调用返回调用和返回指令CALL/RET………….2000:1002CAL

温馨提示

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

评论

0/150

提交评论