第二章80X86指令系统34Word文档格式.docx
- 文档编号:18795879
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:19
- 大小:24KB
第二章80X86指令系统34Word文档格式.docx
《第二章80X86指令系统34Word文档格式.docx》由会员分享,可在线阅读,更多相关《第二章80X86指令系统34Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
MOVAX,SEGAREA2
MOVES,AX
MOVSI,OFFSETAREA1
MOVAL,[SI]
MOVES:
[DI],AL
INCSI
INCDI
DECCX
JNELOOP1
2.在附加段STORE开始内存中存入5个空格。
MOVAL,20H
MOVCX,5
MOVDI,offsetSTORE
CLD
REPSTOSB;
3.内存中有一个首地址为BLOCK补码表示的有符号数的数据块。
要求将正、负数分开,分别存于二个缓冲区:
存放正数的缓冲区首址为PUOS-DATA,存放负数的缓冲区首址为MINUS-DATA。
START:
MOVSI,OFFSETBLOCK
MOVDI,OFFSETPUOS-DATA
MOVBX,OFFSETMINUS-DATA
MOVCX,COUNT
CLD
GOON:
LODSB
TESTAL,80H
JNZMINS
STOSB
JMPAGAIN
MINS:
XCHGBX,DI
STOSB
XCHGBX,DI
AGAIN:
DECCX
JNZ,GOON
INT20H
4.利用CMPS指令对STRING1和STRING2二个字符串进行比较,若STRING1和STRING2相同在RESULT单元送00H,否则送0FFH。
MOVSI,OFFSETSTRING1
MOVDI,OFFSETSTRING2
REPZCMPSB
JNZUNMAT
MOVAL,0
JMPOULPT
UNMAT:
MOVAL,0FFH
OUTPT:
MOVRESULT,AL
INT20H
5.要搜索的关键字CHAR放在(AL)或(AX)中,搜索某一数据块或字符串中有无关该键字,若有,把搜索次数记下来,且记录关键字地址;
若次数为0,表示没有要搜索的关键字。
MOVDI,0FFSETBLOCK
MOVCX,COUNT
CLD
MOVAL,CHAR
REPNESCASB
JZFOUND
MOVDI,0
JMPDONE
FOUND:
DECDI
MOVPOINTR,DI
MOVBX,OFFSETBLOCK
SUBBX,DI
MOVDI,BX
DONE:
INT20H
6.一个数据块由大小写英文字母、数字、其他符号组成,用CR(ASCII码0DH)结束。
数据块首地址为BLOCK1。
将其传送到BLOCK2为首地址的内存区,并将英文中小写英文字母(a~z)转换成大写英文字母(A~Z),其余不变。
LEASI,BLOCK1
LEADI,BLOCK2
NEXT:
LODSB
CMPAL,0DH
JZDONE
CMPAL,61H
JCOK
CMPAL,7AH
JNCOK
SUBAL,20H
OK:
STOSB
JMPNEXT
DONE:
INT20H
五、练习
1.编写程序段,查找字符串中是否含有字符"
&
"
若有,将字符"
用空格字符代替。
MOVAL,&
REPNESCASB
JZFOUND
FOUND:
MOVDI;
ES,””
2.已知在N到N+I的内存单元中有一组ASCII码字符串(共I+1个),编写程序将此字符串传送到NI到NI+I内存单元中,并使字符串的顺序与原来字符串的顺序相反。
MOVAX,SEGN+I
MOVDS,AX
MOVAX,SEGNI
MOVES,AX
MOVSI,OFFSETN+I
MOVDI,OFFSETNI
MOVCX,I+1
CLD
REPMOVSES;
DI,DS;
SI
3.编写程序段:
查找TELEPHONE中的电话号码(10位)中有无“-”字符,若有则将程序转向FOUND处执行;
若无则将程序转向NON_FOUND出执行;
NON-FOUND
…….
4.ds:
100开始的内存单元中存放着以“*”结尾的字符串,编写程序段查找该字符串中包含字符’$’的个数,把个数放入CX寄存器中。
MOVDI,DS:
100
MOVAL,*
JZFOUND1
FOUND1:
SBBOFFFSETDI,OFFSETDS:
MOVCOUNT,OFFSETDI
MOVCX,COUNT
MOVAL,$
JEFOUND2
FOUND2:
MOVBX,COUNTSUBBX,CX
MOVCX,BX
2.4控制指令的使用
一、控制指令概述
控制指令可以分为以下两种:
1.控制程序执行的指令:
控制指令程序是由一条一条的指令构成的,经过编译连接后,在执行程序的时候,指令按照书写的顺序,一条一条的依次放在连续的内存单元中,计算机在执行程序的时候,根据CS:
IP所指定的内存单元的地址,将指令一条一条的取出,分析运行之。
控制指令用于在程序中改变程序执行的流程,根据上面的分析,控制指令就是用来修改程序运行时CS:
IP寄存器的值。
2.控制处理器的指令:
控制处理器的指令又可以分为:
(1)控制CPU内标志寄存器的指令:
用于改变CPU标志寄存器的状态;
(2)控制CPU状态的指令:
用于CPU的工作状态;
二、控制指令详解
✧控制程序执行的指令:
1.转移指令,转移指令包括两种:
⏹JMP(Jump)无条件转移指令
格式:
JMP地址
功能:
改变程序执行的流程,给定计算机下一条要执行指令在内存单元中的地址;
根据给定地址的不一样,无条件转移指令可以分为下面的五种:
1)段内直接短转移:
JMPSHORTOPR
OPR——在汇编语言中使用符号地址。
在机器语言中存放位移量D8,位移量D8=符号地址的偏移地址-当前IP的值,SHORT短属性标号;
功能:
(IP)←(IP)当前+D8,把当前正在执行指令的IP加上指令中地址标号给定8位位移偏移量,形成下一条指令的IP,CS保持不变;
说明:
8位位移偏移量为带符号数,取值范围在-128H——+127H;
2)段内直接近转移:
格式:
JMPNEARPTROPR
OPR—在汇编语言中使用符号地址。
在机器语言中存放位移量D16,位移量D16=符号地址的偏移地址-当前IP的值,MEAR近属性标号;
(IP)←(IP)当前+D16,把当前正在执行指令的IP加上指令中地址标号给定16位位移偏移量,形成下一条指令的IP,CS保持不变;
说明:
16位位移偏移量为带符号数,取值范围在-32768H~+32767H;
使用段内直接近转移指令,可以转移到同一代码段内的任何一条语句上;
3)段内间接转移:
JMPWORDPTROPR
OPR为16位寄存器、或存储器(除立即数以外的任何一种寻址方式指定)
把指令中指定的内存单元或寄存器的值送入IP寄存器,形成下一条指令的IP地址,CS保持不变;
说明:
OPR是16位的寄存器或除立即数寻址以外的任何一种寻址方式指定的字内存单元;
4)段间直接(远)转移:
格式:
JMPFARPTROPR;
OPR是一在汇编语言中使用符号地址。
把OPR所在的段内偏移地址送入(IP),OPR所在的段的段地址送入(CS),形成下一条指令的物理地址;
该指令在内存中本身需要占用5个内存单元:
第1个内存单元中存放指令的操作码,后四个内存单元用于存放符号地址的段值、偏移地址值;
5)段间间接转移:
JMPDWORDPTROPR
OPR是指向某一内存单元的地址,可以使用除立即数和寄存器以外的任何一种寻址方式任何一种寻址方式指定;
从OPR指向的内存单元中指定四个内存单元的内容,前两个内存单元送入IP寄存器,后两个内存单元送入CS寄存器,形成下一条指令的物理地址;
⏹Jxx条件转移指令
1)根据单个条件标志的设置情况转移(10种)
JZ(JE)/JNZ(JNE)(判断ZF标志),JP(JPE)/JNP(JPO)(判断PF标志),JS/JNS(判断SF标志),JO/JNO(判断OF标志),JB(JNAE、JC)/JNB(JAE、JNC)(判断CF标志);
2)根据两个无符号数比较结果转移(4种)
JB(JNAE、JC)/JNB(JAE、JNC)(判断CF和ZF标志),JBE(JNA)/JNBE(JA)(判断CF和ZF标志);
3)比较两个带符号数,并根据比较结果转移(4种)
JL(JNGE)/JNL(JGE)(判断SF和OF标志),JLE(JNG)/JNLE(JG)(判断SF和OF标志);
JxxOPR
根据上一条指令所设置的条件码来判别测试条件进行转移。
每一种条件转移指令都有它的测试条件。
当满足条件时:
(IP)←(IP)当前+OPR所指定的8位位移偏移量,形成下一条指令的IP地址;
不满足条件时:
(IP)不变,顺序执行下一条指令;
①所有条件转移指令都是相对转移形式,范围(-128~+127)。
若需向一个较远地方进行条件转移时,选用条件转移转到附近一个单元,然后,再用无条件转移转到较远的目的地;
②条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移;
③条件转移指令不影响标志位
2.过程(子程序)指令
⏹CALL(Callaprocedure)过程调用指令
CALL过程名
改变程序执行的流程,程序跳到过程名所指定的子程序执行程序;
此时可以把过程名看为指定某一内存单元的地址,程序跳到该内存单元继续执行程序;
根据跳转方式的不同,CALL指令可以分为下面四种:
1)段内直接调用
CALLDST
(SP)←(SP)-2
((SP)+1,(SP))←(IP)当前
(IP)←(IP)当前+D16
原来的CS和新的IP形成被调用过程的入口地址;
调用过程的程序和被调用的过程在同一代码段内,使用段内直接调用;
DST是被调用的过程的名字,通过过程名字给出转向地址(子程序的入口地址)。
D16为机器指令中的位移量(转向地址和返回地址之差)。
位移量D16范围为-32768~+32767H,占有两个字节内存单元。
2)段内间接调用
CALLWORDPTROPR
(IP)←(EA)
OPR为16位寄存器或存储器(除立即数以外的任何一种寻址方式),EA由DST寻址方式所确定的有效地址;
3)段间直接调用
CALLFARPTRDST;
(SP)←(SP)-2,((SP)+1,(SP))←(CS)当前
(SP)←(SP)-2,((SP)+1,(SP))←(IP)当前
(IP)←DST偏移地址(指令中第2,3字节)
(CS)←DST段地址(指令中第4,5字节)
新的CS和新的IP形成被调用过程的入口地址;
DST的偏移地址和段地址被保存在代码段中,CALL指令的目标代码之后;
4)段间间接调用
CALLDWORDPTRDST
(SP)←(SP)-2,((SP)+1,(SP))←(CS)当前
(IP)←(EA)
(CS)←(EA)+2
EA是由DST的寻址方式确定的有效地址,可以是出立即数寻址和寄存器寻址以外的任何一种寻址方式;
⏹RET过程返回指令
RET(EXP)
在执行完子程序后,返回到调用子程序处继续执行下面程序;
为子程序的最后一条语句;
根据返回方式的不一样;
RET指令可以分为下面四种:
1)段内返回
RET
(IP)←((SP)+1,(SP))
(SP)←(SP)+2
2)段内带立即数返回
RETEXP;
(SP)←(SP)+D16
EXP是一个表达式,计算出来的常数成为机器指令中位移量D16,修改堆栈指针。
3)段间返回
(SP)←(SP)+2
(CS)←((SP)+1,(SP))
4)段间带立即数返回
RETEXP;
(SP)←(SP)+2
(CS)←((SP)+1,(SP))
(SP)←(SP)+D16
CALL指令和RET指令都不影响条件码。
3.循环指令
LOOPxx目的地址
功能:
根据上一条指令的执行结果,完成下面的操作:
①(CX)←(CX)-1(此操作不影响标志)
②检查转移条件xx,满足则转到目标地址去执行程序;
不满足执行LOOPxx后一条指令,结束循环;
转移方式只允许段内直接短方式,跳转地址范围-128~127;
根据转移条件的不同,循环指令可以分为下面三种:
1)LOOP
循环条件:
CX寄存器的值不等于0时循环,否则结束循环;
2)LOOPZ/LOOPE
CX寄存器的值不等于0而且ZF标志位等于1时循环,否则结束循环;
3)LOOPNZ/LOOPNE
CX寄存器的值不等于0而且ZF标志位等于0时循环,否则结束循环;
(1)LOOP退出循环条件是(CX)=0
(2)LOOPZ和LOOPNZ提供了提前结束循环的可能,不一定要等到(CX)=0才退出循环。
(3)使用:
▲在串中查找字符,查到了,就可退出,可用LOOPNZ,不相等时继续查找。
▲比较两串时,当有字符不等,就可退出,说明两字符串不等。
可用LOOPZ,当相等时继续比较。
▲执行完LOOPNZ或LOOPZ后,根据ZF标志的值判断结果;
对查找字符,ZF=1,说明找到;
否则没有找到。
对串比较,ZF=1,说明两串相等;
否则不等。
4.中断指令
在执行中断指令的时候,计算机一般需要完成下面的操作:
中断前:
(PSW)入栈保护现场,(CS),(IP)保存入栈保留断点;
中断中:
转中断例行程序去执行;
中断后即中断返回时:
从堆栈中恢复(IP)、(CS)及(PSW);
下面介绍几条最常见的中断指令:
1)INT类型号
INTn
(SP)←(SP)-2,((SP)+1,(SP))←(PSW)当前
(SP)←(SP)-2,((SP)+1,(SP))←(CS)当前
(SP)←(SP)-2,((SP)+1,(SP))←(IP)当前
(IP)←(N×
4)
(CS)←(N×
4+2)
n是常数或表达式,取值范围0—255,代表中断类型号;
进入中断后自动清除IF、TF,避免进入中断以后不被外面其它中断所打断及进入中断后程序按单步方式执行。
2)IRET,中断返回指令
IRET
(IP)←((SP)+1,(SP)),(SP)←(SP)+2
(CS)←((SP)+1,(SP)),(SP)←(SP)+2
(PSW)←((SP)+1,(SP)),(SP)←(SP)+2
用作中断子程序的最后一条语句,作用是从堆栈中弹出中断子程序执行前程序压入堆栈保护的程序地址;
✧控制处理器的指令
1)控制CPU内标志寄存器的指令,
⏹CLC(Clearcarryflag)
清除CF标志,使CF标志位为0;
⏹STC(Setcarryflag)
置CF标志,使CF标志为1;
⏹CMC(Complementcarryflag)
对CF标志进行求反
⏹CLD(Cleardirectionflag)
清DF标志,使DF标志为0;
⏹STD(Setdirectionflag)
置DF标志,使DF标志为1;
⏹CLI(Clearinterruptflag)
清IF标志,使IF标志为0;
⏹STI(Setinterruptenableflag)
置IF标志,使IF标志为1;
2)控制CPU状态的指令
⏹NOP(Nooperation)
使CPU处于空操作状态;
⏹HLT(Halt)
使CPU处于暂停状态;
⏹WAIT(Waitwhilepinnotasserted)
使CPU处于等待状态;
⏹ESC(Escape)
交权指令,交出总线的控制权;
⏹LOCK(Lockbus)
CPU锁定总线,不响应别的部件总线请求;
三、控制指令的有关说明
1.控制程序执行的指令都涉及到一个地址,该地址指向程序下一条要执行的语句。
有的地址用来改变IP值,有的地址同时改变CS和IP值,归纳总结如下:
1)段内直接:
只需要改变IP的值,方法:
(IP)新←(IP)当前+D16,把当前正在执行指令的IP加上指令中地址标号给定16位位移偏移量;
2)段内间接:
把指令中指定的内存单元或寄存器的值送入IP寄存器,形成下一条指令的IP地址,CS保持不变;
3)段间直接:
同时改变CS和IP的值,方法:
把OPR所在的段内偏移地址送入(IP),OPR所在的段的段地址送入(CS),形成下一条指令的物理地址;
4)段间间接:
从OPR指向的内存单元中指定四个内存单元的内容,前两个内存单元送入IP寄存器,后两个内存单元送入CS寄存器,形成下一条指令的物理地址;
2.所有条件转移指令都是相对转移形式,范围(-128~+127);
3.中断的嵌套问题:
由于进入中断子程序后,程序把IF标志自动设置为0,所以在中断子程序中若允许再次进行中断,则应在中断子程序中使用STI指令设置IF标志为1;
1.带符号数判断X,Y数据存放放在内存单元X,Y中,先判X>
50,YES→too_high,NO→做X-Y,在接着判断差是否溢出,YES→overflow,否则求|X-Y|→result;
MOVAX,X
CMPAX,50
JGtoo_high
SUBAX,Y
JOoverflow
JNSnonneg
NEGAX
nonneg:
MOVresult,AX
JMPEXIT
too_high:
……
Overflow:
……
EXIT:
INT20H
2.在M中有一个首地址为array的N字数组,要求测试其中正数、0及负数的个数。
(带符号数判断)正数个数放在:
(DI)中,0的个数放在:
(SI)中,负数的个数放在:
(AX)中;
如果没有负数转skip,如果有负数转neg_val。
movcx,N
movbx,0
movdi,bx
movsi,bx
again:
cmpwordptrarrary[bx],0
jleless_or_ag
incdi
jmpshortneat
less_or_ag:
jlneat
incsi
neat:
addbx,2
deccx
jnzagain
movax,N
subax,di
subax,si
jzskip
jmpnearptrneg_val
skip:
neg_val:
INT20H
3.在string字符串中查找空格字符,串长度为N。
(1)用条件转移JZ
MOVCX
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 80 X86 指令系统 34
![提示](https://static.bdocx.com/images/bang_tan.gif)