版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第三章8086指令系统movax,12hcalldisplayJmp1234h23.3.4串操作指令串:顺序放在内存中的一组相同类型的数据。串操作:对串中的元素进行相同的操作。串操作的寻址方式:
源操作数指针———DS:SI(DS可跨越)
目的操作数指针——ES:DI每次串操作后:
指令自动修改SI和DI:字节±1,字±2。DF标志决定±。【指令:CLD(置DF=0);STD(置DF=1】串操作后,指针指向最后操作的元素的下一个元素)可实现两个存储单元之间的传送和比较有隐式和显式两种形式的指令3串操作的指针与方向“A”“B”“C”“D”
…源:数据段
…目的:附加段DF=0DF=1DS:(SI)…ES:(DI)结束后DS:(SI)结束后ES:(DI)4MOVS
(MOVeString) 串传送CMPS
(CoMPareString) 串比较SCAS
(SCAnString) 串扫描LODS
(LOaDfromString) 取串STOS
(STOreintoString) 存串INS
(INputfromporttoString)输入OUTS
(OUTputStringtoport) 串输出与上述基本指令配合使用的前缀:REP
(REPeat) 重复。REPE/REPZ(REPeatwhileEqual) 相等则重复。REPNE/REPNZ(REPeatwhileNotEqual)不相等则重复。
串操作类指令5格式:MOVS
目的串,源串;显式指令
MOVSB;字节串传送,;隐式指令
MOVSW ;字串传送,;隐式指令功能:
字节操作 (ES:(DI))(DS:(SI)) (SI)(SI)±1;(DI)(DI)±1字操作 (ES:(DI))(DS:(SI)) (SI)(SI)±2;DI(DI)±2把由SI指向的数据段中的一个字节(或字)传送到由DI指向的附加段中的一个相应单元中去,同时根据方向标志DF及数据类型自动修改SI和DI的值,以指向下一个单元。该指令不影响标志位。⒈串传送指令MOVSB/MOVSW/MOVS例:将数据段中偏移地址为2002H开始的两个字符传送到目的地偏移地址为1022H开始的单元中。1)字节传送(DF=0)CLD;置DF=0MOVSI,2002HMOVDI,1022H
MOVSB
MOVSB执行结束:
(SI)=2004H,(DI)=1024H2)字传送(DF=1)STD;置DF=1MOVSI,2003HMOVDI,1023H
MOVSW执行结束:
(SI)=2001H,(DI)=1021H3)显式字传送(DF=0)
MOVSI,2002HMOVDI,1022H
MOVS
WORDPTR[DI],WORDPRT[SI]
7下面程序段完成字传送:(4000:2000H)(8000:1000H)CLDMOVAX,4000HMOVDS,AXMOVSI,2000HMOVAX,8000HMOVES,AXMOVDI,1000HMOVSW
段寄存器不能立即数,必须用AX中转8
重复前缀
有的串操作指令(MOVS、STOS、LODS、INS和OUTS)前面可加上重复前缀REP。当使用REP前缀时,该指令重复执行,重复次数由CX决定,每执行一次,CX自动减1。重复前缀:REP(CX)≠0时重复执行REPE/REPZ(CX)≠0且ZF=1时重复执行REPNE/REPNZ(CX)≠0且ZF=0时重复执行9
重复前缀REP执行过程:(1)当(CX)=0,结束REP,执行REP下一条指令。(2)当(CX)≠0,将CX减1,执行REP后的串指令,返回(1)。例:LEADI,destinationLEASI,sourceMOVCX,20REPMOVSBMOVAX,20
只在(CX)=0时退出循环10当相等重复前缀REPZ执行过程:(1)当(CX)=0,结束REPZ,执行REPZ下一条指令;(2)当(CX)≠0,将CX的内容减1,执行REPZ后的串指令;(3)当ZF=1,返回(1);(4)当ZF≠1,则结束REPZ,
执行REPZ下一条指令。
(CX)减1操作不影响标志
ZF标志由串操作决定11当不相等重复前缀REPNZ执行过程:(1)当(CX)=0,结束REPNZ,执行REPNZ下一条指令。(2)当(CX)≠0,将CX的内容减1,执行REPNZ后的串指令。(3)当ZF=0,返回(1);(4)当ZF≠0,则结束REPNZ,
执行REPNZ下一条指令。12例1:
用REPMOVS
进行数据块传送编程步骤:①设置传送方向用CLD使DF=0,地址增加方向(正向)用STD使DF=1,地址减小方向(反向)②设置源串地址将源串首地址(DF=0)或末地址(DF=1)放入DS:SI③设置目的串地址将目的串首地址(DF=0)或末地址(DF=1)放入ES:DI④设置串长度
将串的长度(传送次数)放入CX中⑤字节传送用REPMOVSB
字传送用REPMOVSW13例:若要将源串的100个字节数据传送到目标串单元中,设源串首元素的偏移地址为2500H,目标串首元素的偏移地址为1400H。
CLD;DF=0,地址自动递增
MOVCX,100;串长度,重复次数MOVSI,2500H;源串首元素偏移地址MOVDI,1400H;目标串首元素偏移地址REPMOVSB;重复传送,直到CX=0为止如采用字传送:MOVCX,50MOVSI,2500H
MOVDI,1400H
REPMOVSW
14
串传送指令中:常用指令
LEA获取偏移地址用串传送指令实现将内存单元MEM1的200个字节的数据传送到MEM2单元:
LEASI,MEM1LEA
DI,MEM2MOVCX,200CLD
REP
MOVSBHLT15
例:
编程将存放在
str1中的4字节字符串传送到str2定义的缓冲区中。‘D’‘C’‘B’‘A’str1str2;定义缓冲区data1SEGMENT
str1DB‘ABCD’
;源串data1ENDSdata2SEGMENTstr2DB4DUP(?)
;目的缓冲区data2
ENDS16CODESEGMENTASSUMECS:CODE,DS,DATA1,ES,DATA2START:CLD;DF=0,正方向传送
MOVAX,data1;源串首地址的段值→DS
MOVDS,AXLEASI,str1;源串首地址的偏值→SIMOVAX,data2;目的串首地址的段值→ESMOVES,AXLEADI,str2;目的串首地址的偏值→DIMOVCX,4;串长度CX
REPMOVSB
;串传送
MOVAH,4CHINT21HCODEENDSENDSTART17data1SEGMENTstr1DB‘ABCD’data1ENDSdata2SEGMENTstr2DB4DUP(?)data2EMDScodeSEGMENT
、、、、、、
CLDMOVAX,data1MOVDS,AXLEASI,str1MOVAX,data2MOVES,AXLEADI,str2MOVCX,4REPMOVSB
、、、、、、codeENDS
假设程序经汇编、连接后,装入内存的情况如下:18程序执行结果:19
MOVAL,[SI]MOVES:[DI],AL
INCSIINCDI
next:JCXZexitDECCXMOVSBJMPnextexit:….说明:串指令可单独使用等价于:MOVSB
等价于:REPMOVSB20⒉串比较指令CMPSB/CMPSW/CMPS功能:将由SI作为指针的源串中的1个元素减去由DI作为指针的目标串中相对应的1个元素,不回送结果,只根据结果特征置标志位;并相应地修改SI和DI内容指向下一个元素。指令执行的操作:
CMPSB
;((DS):(SI))-((ES):(DI))
;(SI)±1,(DI)±1CMPSW
;((DS):(SI+1)(SI))-((ES):(DI+1)(DI))
;(SI)±2,(DI)±2指令也可写成:CMPSdest,src比较的结果只反映在标志位上,串本身无变化。本指令可用来检查两个串是否相等。21
用REPZCMPS
进行串比较编程:①设置比较方向(STD或CLD)②设置源串、目的串地址
将源串首地址(DF=0时),或末地址(DF=1时)放入DS、SI
将目的串首地址(DF=0时),或末地址(DF=1时)放入ES、DI③设置串长度将串的长度放入CX中④按字节比较用REPZCMPSB
按字比较用REPZCMPSW22
执行完REPZCMPS后,根据ZF判断两串比较结果。若ZF=1,两串相等,此时:
CX=0,表明串中所有元素已比较完毕
SI、DI指向串尾的下一单元。若ZF=0,两串不等,此时:
CX的值为剩下的未比较的元素个数。
SI、DI指向不相等元素的下一元素。
说明:在CMPS指令前加重复前缀REPE/REPZ,用来确定两个串中的第1个不相同的数据。23⒊串扫描SCASB/SCASW/SCAS功能:用来从目标串中搜索(或查找)某个关键字,要求将待查找的关键字事先置入(AL)或(AX)中,取决于按字节还是字搜索。操作:将AX或AL中的关键字减去由(DI)所指向的目标串中的一个元素,不传送结果,只根据比较结果置标志位,然后修改(DI)的内容指向下一个元素。24执行的操作:对字节:(AL)-((ES):(DI))
DI±1
对字:(AX)-((ES):(DI+1)(DI))
DI±2该指令是比较(减法)操作,结果只影响标志位。要搜索的关键字放在AL(字节)或AX(字)中。本指令用于在串中查找指定的信息。⒊串扫描SCASB/SCASW25
SCAS指令加上重复前缀后,可对串进行连续扫描比较:若前缀为REPZ,则表示比较结果相等(ZF=1)且串未结束(CX≠0),则继续比较。若前缀为REPNZ,则表示比较结果不相等(ZF=0)且串未结束(CX≠0)就继续比较。⒊串扫描SCASB/SCASW26例:
用REPNZSCAS
在串中找关键字。编程步骤:①设置查找方向②设置串地址:将串的首地址(DF=0时),或末地址(DF=1时)放入ES、DI中。③设置关键字:
将关键字放入AL(关键字为字节)或
放入AX(关键字为字)。④设置串长度将串的长度放入CX中。⑤查找字节用REPNZSCASB
查找字用REPNZSCASW27执行完REPNZSCAS后,根据ZF判断查找结果。若ZF=1,则串中有关键字,此时:
(CX)的值为剩下的未搜索的元素个数,
(DI)指向关键字元素的下一元素,
而关键字在(DI)-1的位置若ZF=0,则串中无关键字,此时:
(CX)=0,表明串中所有元素已搜索完毕
(DI)指向串尾的下一单元。⒊串扫描SCASB/SCASW例:在ES段的偏移1000H开始处存有10个ASCII码。搜索’E’,若找到则记下搜索次数及存放地址,并在屏幕上显示’Y’;若未找到则显示’N’。(见右图)在屏幕上显示一个字符的指令段如下:
MOVDL,<字符>MOVAH,2INT21H
实现题目要求的程序段见下页:1000H414243444546’A’’B’’C’’D’’F’...ES段’E’
MOVDI,1000H;(DI)←串偏移地址
MOVCX,0AH;(CX)←串长度
MOVAL,’E’;搜索关键字=’E’ CLD;从低地址到高地址进行搜索
REPNZSCASB;若未找到,继续搜索
JZFOUND;找到,转至FOUNDMOVDL,’N’;串中无’E’,(DL)←’N’JMPDONE;转至DONEFOUND:DECDI;指针回退
MOVADDR,DI;ADDR←’E’的地址
SUBDI,1000HMOVNUM,DI;NUM←搜索次数
MOVDL,’Y’;(DL)←’Y’DONE:MOVAH,2 INT21H;显示字符
HLT30⒋串装入指令LODSB/LODSW/LODS功能:用来将源串中由SI所指向的元素取到AX/AL寄存器中,修改SI的内容指向下一个元素。说明:该指令一般不加重复前缀,常用来和其他指令结合起来完成复杂的串操作功能。31字节装入:LODSB;(AL)←((DS):(SI));(SI)±1
字装入:
LODSW;(AX)←((DS):(SI+1)(SI));(SI)±2
串装入指令通常不加重复前缀。
LODSB等价于:LODSW等价于:MOVAL,[SI]MOVAX,[SI]INCSIINCSIINCSI
⒋串装入指令LODSB/LODSW/LODS32⒌串存储指令STOSB/STOSW/STOS功能:用来将AX/AL寄存器中的1个字或字节写入由DI作为指针的目标串中,同时修改DI以指向串中的下一个元素。说明:该指令一般不加重复前缀,常与其他指令结合起来完成较复杂的串操作功能。若利用重复操作,可以建立一串相同的值。33指令的操作为:
对字节:
STOSB;((ES):(DI))←(AL);(DI)±1
对字:
STOSW;((ES):(DI+1)(DI))←(AX);(DI)±2本指令用于把一块存储区域填充成某一初始值(即对存储区进行初始化)。存储区域的首地址要预先设置到ES:DI中。要存储到串中的数据要预先存到AL(AX)中。⒌串存储指令STOSB/STOSW/STOS34例1:把从A000H开始的2KB内存单元清零。程序段如下:
MOVDI,0A000HMOVAX,0MOVCX,1024CLDREPSTOSW
串存储指令应用35例2:把1000H开始的100个存储单元填入
ASCII码2AH(“*”)。程序段如下:
MOVDI,1000H;首地址
MOVAL,2AH;‘*’
MOVCX,100;重复执行100次
CLD;增量修改DI REP STOSB
串存储指令应用36⑴总是用SI寄存器寻址源操作数,用DI寄存器寻址目的操作数。源操作数常存放在现行的数据段,隐含段寄存器DS,但也允许段超越。目的操作数总是在现行的附加数据段,隐含段寄存器ES,不允许段超越。⑵每一次操作以后修改地址指针,是增量还是减量取决于方向标志DF。当(DF)=0时,地址指针增量,即字节操作时地址指针加1,字操作时地址指针加2。当(DF)=1时,地址指针减量,即字节操作时地址指针减1,字操作是地址指针减2。
字符串操作指令的共同特点:37⑶有的串操作指令可加重复前缀,指令按规定的操作重复进行,重复操作的次数由CX寄存器决定。⑷若串操作指令的基本操作影响零标志ZF(如CMPS、SCAS),则可加重复前缀REPE/REPZ或REPNE/REPNZ,此时操作重复进行的条件不仅要求(CX)0,而且同时要求ZF的值满足重复前缀中的规定(REPE/REPZ要求(ZF)=1,REPNE/REPNZ要求(ZF)=0)。⑸串操作汇编指令的格式可以写上操作数,也可以只在指令助记符后加上字母“B”(字节操作)或“W”(字操作)。加上字母“B”或“W”后,指令助记符后面不允许再写操作数。
字符串操作指令的共同特点(续):38串指令使用的一般方法设置源串地址设置目标串地址设置串长度设置操作方向DF串指令MOVSI,源串首地址(或LEASI,源串)MOVDI,目的串首地址(或LEADI,目的串)MOVCX,串长度CLD(或STD)《串指令》393.3.5程序控制指令控制转移指令分为:转移指令循环控制指令调用和返回指令中断指令40在8086/8088中,指令的地址由CS和IP决定。DSESSSCSIP数据暂存器PSW标志寄存器执行部件控制电路指令译码器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器组指令队列总线接口控制电路运算器地址加法器、、、指令1指令2指令3指令4、、、数据1数据2数据3、、、地址总线AB数据总线DB控制总线CB地址译码器41
CS和IP两寄存器的内容决定了程序的流程
8086/8088中CS和IP的变化规则:
1)reset复位后
(CS)=FFFFH,(IP)=0,8088从内存FFFF:0000H处取第一条指令执行;改变CS和IP寄存器的值,就改变了程序执行的流程。第一条指令在内存的ROM区。422)非控制转移指令,指令本身对CS和IP均无操作,形成顺序执行结构。BB0001B12090指令1指令2指令3CS:IP顺序执行结构:顺序存放,顺序执行程序是指令的集合指令在内存中顺序存放对非控制转移指令,
CPU取来一条指令后,自动将IP的值加上该指令的字节数,使IP顺序指向下一条指令,
CPU接着取来紧连着的指令执行。
(此时IP的变化由CPU内部的硬件自动完成)433)控制转移指令:以CS和IP为主要操作对象改变CS和IP的值,使程序产生分支、调用结构。指令1指令2指令3指令439D87D0287C3A30020CS:IP分支结构、调用结构:
顺序存放,非顺序执行
CMPAX,BX
JGEgreatXCHGAX,BXgreat:MOV[max],AX……控制转移指令JGE可以改变IP的值,使程序非顺序执行。44转移指令的实质:改变IP(或CS)的内容。所有转移指令不会影响标志位。分为无条件转移和条件转移两种。1.转移指令45
目标地址的寻址方式(JMP指令)直接寻址方式:转移地址直接在指令的机器代码中给出。间接寻址方式:转移地址在寄存器或主存单元中,并通过它们来间接寻址。46段内转移(不需要改变CS的值)近转移(near):在当前代码段64KB范围内转移,不需要更改CS段地址,只要改变IP偏移地址。短转移(short):如果转移距离可用一个字节(-128~+127)来表示。段间转移(需要改变CS的值)远转移(far):从当前代码段跳转到另一个代码段,需要更改CS段地址和IP偏移地址。目标地址必须用一个32位数表达(32位远指针),是逻辑地址。目标地址的范围(JMP指令)47目标地址的范围(JMP指令)的使用实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移。程序员也可以用操作符
short/nearptr
或
farptr
进行强制指定转移的类型。48(1)无条件转移指令JMP
本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。根据设置CS、IP的方法,JMP指令分成4种情况。
①段内直接转移:JMPdisp
指令中给出的8/16位的位移量加到IP。CS保持不变。
②段内间接转移:JMPreg/mem
reg/mem中的16位偏移地址送IP。CS保持不变。③段间直接转移:JMP段地址:偏移地址
指令中给出的16位的段和16位偏移地址送给CS和IP。④段间间接转移:JMPmem32
mem32中的16位的段和16位的偏移地址送给CS和IP。49转移的目标地址由指令直接给出。指令中给出的目标地址实际上是一个相对于IP的位移量:位移量转移范围汇编语言中格式
8位-128~+127JMPSHORTPTR
标号16位-32768~+32767JMPNEARPTR
标号
例:JMP 0120H ;直接转向0120HJMP SHORTPTRLP1 ;转向标号LP1JMP NEARPTRLP2 ;转向标号LP2由于是段内转移,故转移后CS内容保持不变①段内直接转移50②段内间接转移
转移的目标地址由寄存器或存储单元的内容给出。例1:JMPSI若(SI)=1200H,则指令执行后,(IP)=1200H,于是转向代码段的偏移地址1200H处开始执行。注意:目标地址以段内偏移的形式给出,而不是相对于IP的位移量,所以它是一个16位的操作数。51例2:JMP[BX+DI]设指令执行前:(DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H;则指令执行后:(IP)=2350H在汇编语言中,段内间接寻址通常写成:
JMP WORDPTR[BX+DI]
表示所取得的目标地址是一个字。②段内直接转移52③段间直接转移指令中直接给出要转移目的的段地址和偏移地址。例:JMP 2000H:1000H
执行时,(IP)←1000H,(CS)←2000H注:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符FAR
PTR。
例:JMPFARPTRfar_label
其中的far_label为远类型的标号。53
转移的目的地址(段和偏移)在两个相邻的字存储单元中。例如:
JMPDWORDPTR[SI]
设指令执行前:(DS)=4000H,(SI)=1212H,(41212H)=1000H,(41214H)=4A00H
则指令执行后:(IP)=1000H,(CS)=4A00H
于是转到4B000H处开始执行指令。例中的DWORDPTR表示转移地址是一个双字。④段间间接转移54400001212+)41212DSSI0010004A
4121241213412144121510004A00IPCS
段间间接转移操作示意图1111111111101100JMPDWORDPTR[SI]的机器码DS:[SI]55可实现程序的条件分支。根据标志位的状态来决定是否进行分支转移。格式:
JXXlabel ;xx为条件名称缩写转移范围为-128~+127字节(段内短距转移)。主要的条件转移指令参见下表。(2)条件转移指令JXX实际指令只有16条,但却有30个助记符。采用多个助记符,只是为了方便记忆和使用。57①根据单个标志位设置的条件转移指令JB/JC;低于,或CF=1,则转移JNB/JNC/JAE;高于或等于,或CF=0,则转移JP/JPE;奇偶标志PF=1(偶),则转移JNP/JPO;奇偶标志PF=0(奇),则转移JZ/JE;结果为零(ZF=1),则转移JNZ/JNE;结果不为零(ZF=0),则转移JS;SF=1,结果为负则转移JNS;SF=0,结果为正则转移JO ;OF=1,则转移JNO ;OF=0,则转移例:
一带符号数存放于内存字节单元X,如果该数是奇数,则将该数乘4,否则将其变成奇数。DATASEGMENTXDB-51DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XTESTAL,00000001BJZEVEN;偶数转到EVENMOVCL,2SALX,CL;SHLX,CLJMPEND;无条件转移EVEN:ORX,00000001BEND:MOVAH,4CHINT21HCODEENDSENDSTART例:
一带符号数存放于内存字节单元X,将该数的绝对值存放于内存单元Y中。DATASEGMENTXDB-51YDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,X
TESTAL,10000000BJNSplus;正数转移NEGAL;0-(AL)---(AL)plus:MOVY,ALMOVAH,4CHINT21HCODEENDSENDSTART60这类指令主要用来判断两个数的大小。使用方法:
CMPdist,src;比较
Jxxlabel;根据比较结果转移
判断无符号数的大小
JA
大于则转移(dist>src)
转移条件为:CF=0∧ZF=0JB
小于或则转移(dist<src)
转移条件为:CF=1∨ZF=1
JAE
大于等于转移
JBE
小于等于转移②根据组合条件设置的条件转移指令61JG
;大于则转移(dist>src)
转移条件为:(SF⊕OF=0)∧ZF=0JGE
;大于或等于则转移(dist≥src)
转移条件为:(SF⊕OF=0)∨ZF=1JL
;小于则转移(dist<src)
转移条件为:(SF⊕OF=1)∧ZF=0JLE
;小于或等于则转移(dist≤src)
转移条件为:(SF⊕OF=1)∨ZF=1
判断有符号数的大小62③根据CX内容来决定是否转移的转移指令
JCXZlabel
若(CX)=0,则转移到label处开始执行。例:
在以DATA1为首址的内存数据段中,存放了200个16位带符号数,试将其中最大和最小的带符号数找出来,分别存放到以MAX和MIN为首的内存单元中。分析:为了寻找最大和最小的元素,可先取出数据块中的一个数据作为标准,暂且将它同时存放到MAX和MIN单元中,然后将数据块中的其他数据逐个分别与MAX和MIN中的数相比较,凡大于MAX者,取代原来MAX中的内容,凡小于MIN者,取代原来MIN中的内容,最后即可得到数据块中最大和最小的带符号数。
必须:比较带符号数的大小时,应该采用JG和JL等条件转移指令。根据要求可编程如下:
LEASI,DATA1;(SI)←数据块首址
MOVCX,200;(CX)←数据块长度
CLD ;清方向标志DF
LODSW;取一个16位带符号数到AXMOVMAX,AX;送MAX单元
MOVMIN,AX;送MIN单元
DECCX;(CX)←(CX)−1NEXT:
LODSW;取下一个16位带符号数
CMP
AX,MAX ;与MAX单元内容比较
JG GREA;大于MAX,则转GREA
CMP AX,MIN ;否则,与MIN单元内容比较
JL LESS ;小于MIN,则转LESS
JMPGOON ;否则,转GOONGREA:MOVMAX,AX ;MAX)←(AX)
JMPGOON ;转GOONLESS:MOVMIN,AX;(MIN)←(AX)GOON:DECCX;CX减1,若不等于零,转NEXT
JNZNEXT
HLT ;停止652.循环控制指令用在循环程序中以确定是否要继续循环。循环次数通常置于CX中。转移的目标应在距离本指令-128~+127的范围之内。循环控制指令不影响标志位。66(1)LOOP格式:LOOPlabel操作:(CX)-1→CX;若(CX)≠0,则转至label处执行;否则退出循环,执行LOOP后面的指令。
注:LOOP指令与下面的指令段等价:
DECCX JNZlabel67(2)LOOPZ(LOOPE)格式:LOOPZlabel操作:(CX)-1→CX;
若(CX)≠0∧ZF=1,则转至label处执行;否则退出循环,执行LOOP后面的指令。3)LOOPNZ(LOOPNE)格式:LOOPNZlabel操作:(CX)-1→CX;若(CX)≠0∧ZF=0,则转至label处执行;否则退出循环,执行LOOP后面的指令。例1:给1A000H开始的256个内存单元均减去1,若发现某个单元减为0则立即退出循环,其后的单元不再减1。程序段如下:(逻辑地址为1A00:0H)
MOVAX,1A00HMOVDS,AX;1A00H段
MOVDI,-1MOVCX,256GOON:INCDIDECBYTEPTR[DI]LOOPNZGOONHLT69例2:在8000H开始的长度为1000字节的字符串中查找’S’,若找到,把其偏移地址记录在ADDR中,否则ADDR单元置为0FFFFH。
MOVDI,8000HMOVCX,1000MOVAL,’S’MOVADDR,0FFFFHGOON:SCASBLOOPNZGOONJNZDONEDECDIMOVADDR,DIDONE:HLT703.过程调用和返回指令过程(子程序):一段具有特定功能的,供其它程序调用的公用程序。特点:调用子程序时,IP(CS)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(CS)。子程序执行结束后一般均要返回调用程序。一次定义,多次调用;可带参数调用,以完成不同的功能。优点:程序代码短,结构清晰,便于编程、调试、修改和阅读。两条相关指令:
子程序调用指令
CALL
子程序返回指令
RET71一般格式:CALL
sub;sub为子程序的入口根据子程序入口的寻址方式,子程序调用有四类①段内直接调用
子程序的偏移地址直接由CALL指令给出。格式:CALL
near_proc
CALL执行时,它首先将IP内容压栈,然后把指令中给出的位移量加到IP上。注:汇编以后的调用地址是相对于CALL的下一条指令的位移量。例:CALL0120H;子程序偏移地址由指令给出(1)调用指令CALL72位移量由汇编程序在汇编时进行计算,例:
CS:0102 CALL0120H ;3字节
CS:0105……则位移量为:0120-0105H=001BH于是CALL 0120H的机器码为E81B00CS:0102 E8CS:0103 1BCALL0120HCS:0104 00CS:0105……73子程序的偏移地址在寄存器或存储器中。格式:CALL
mem16/reg16CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP。例:
CALL BX;子程序地址由BX给出
CALL WORDPTR[SI];子程序地址在存储器中②段内间接调用CALLIPHIPL代码段数据段CALLWORDPTR[SI]指令的操作图示:假定:(DS)
=
8000H,(SI)
=
1200H81200H81201H75子程序的段地址和偏移地址直接由CALL指令给出。
格式:CALLfar_proc;far_proc为远过程的地址指令的操作为:
CS内容压栈
IP内容压栈
CS←段地址
IP←偏移地址例:CALL2000H:1000HCALLTIMER;TIMER为远过程③段间直接调用76子程序的段和偏移地址为存储器的连续4个单元中的内容。
格式:CALLmem32指令的操作为:
SP←(SP)-2((SP)+1,(SP))←(CS);CS压栈
CS←(mem32+2)SP←(SP)-2((SP)+1,(SP))←(IP);IP压栈
IP←(mem32)例:CALLDWORDPTR[DI]
调用地址在[DI],[DI]+1,[DI]+2,[DI]+3四个存储单元中。低字内容为偏移地址,高字内容为段地址。④段间间接调用77CALL代码段数据段IPHIPLCSHCSL[DI][DI]+1[DI]+2[DI]+3段间间接调用示意图CALLDWORDPTR[DI]
78例:下面的程序执行后,(AX)=?(DX)=?
CS:2000HMOVAX,2012H2003HMOVCX,200CH2006HPUSHCX2007HCALL4000H200AHADDAX,BX200CHADDAX,DX200EHHLT…………CS:4000HMOVBX,200AHPOPDX
RET79段内返回指令RET的操作为:
恢复子程序执行前IP的内容。段间返回指令RET的操作为:
恢复子程序执行前IP和CS的内容。
另有一种带立即数的返回指令“RETn”,其中n为偶数,表示从栈顶弹出地址后另外丢弃的字节数。例:RET4;返回后再丢弃栈顶的4个字节(2)返回指令RET804.中断指令8086/8088CPU在程序中允许安排一条中断指令来引起一个中断过程,这种中断叫内部中断,或叫软中断。被中断的指令地址处称为“断点”。有关中断的详细情况将在第六章讨论。中断指令共有三条:
(1)INTn执行类型n的中断服务程序,N=0~255(2)INTO执行溢出中断的中断服务程序
(3)IRET从中断服务程序返回调用程序81(1)INTn格式:
INTn说明:
n×4
=向量地址。该向量地址中的内容即为中断服务程序入口地址(段:偏移),入口地址也称为“中断向量”。0000:n×4XXHXXHYYHYYH中断服务程序入口的偏移地址(IP)中断服务程序入口的段地址(CS)中断类型码n=0〜255内存中断向量82INT指令的操作:将FLAGS压入堆栈;将INT指令下一条指令的地址压栈(即把CS和IP的内容压栈);取中断服务程序入口地址送入CS和IP。INT指令只影响IF和TF,对其余标志位无影响INT指令可用于调用系统服务程序,如INT21H83INT指令的操作例:INT21HIPLIPHCSLCSHSP=1200FLAGSLFLAGSHSP=11FA执行INT21H指令后保护断点堆栈执行INT21H指令前84INT指令的操作例(续):执行INT21H指令后,CS=?IP=?因为n=21H,所以n×4=84H。下图中,(0:0084H)=2000H:1123H所以:CS=2000HIP=1123H0000:0084H23H11H00H20HIP
CS0000:21H×485
INTO检查溢出标志OF,如果OF=1,则启动一个类型4的中断过程;如果OF=0,不做任何操作。通常INTO指令安排在有符号数算术运算指令后面。如:
IMUL DX INTO;若溢出,则启动INT4,否则往下执行
MOV RESULT,AX MOV RESULT+2,DX……(2)溢出中断INTO86用于从中断服务程序返回被中断的程序。IRET负责恢复断点(CS和IP)和恢复标志寄存器内容。任何中断服务程序不管是外部中断引起的,还是内部中断引起的,最后都要用IRET返回。IRET指令执行的操作为:栈顶内容弹出到IP栈顶内容弹出到CS栈顶内容弹出到FLAG(3)中断返回指令IRET873.3.6处理器控制指令881.标志操作指令
用来设置标志位的状态。(1)CF设置指令
CLC0→CFSTC1→CFCMCCF变反(2)DF设置指令
CLD0→DF(串操作的指针移动方向从低到高) STD1→DF(串操作的指针移动方向从高到低)
(3)IF设置指令
CLI0→IF(禁止INTR中断) STI1→IF(开放INTR中断)
89
执行HLT指令时,CPU进入暂停状态,设置该指令通常是为了等待中断。外部中断(包括IF=1时的可屏蔽中断请求INTR及非屏蔽中断请求NMI)或复位信号可让CPU退出暂停状态。
HLT不影响标志位。2.外部同步指令(1)暂停指令HLT(2)空操作指令NOP
NOP指令不做任何实质性的操作,但占用3个时钟周期,然后执行下一条指令。多用于延时或预留存储空间(占位置)。
90习题课(复习)1.设IBMPC微机内存中某个单元的物理地址是12345H,试完成下列不同的逻辑地址表示:(1)1234H:
H(2)____H:0345H答:(1)1234H:05H(2)1200H:0345H
逻辑地址与物理地址没有一一对应关系!2.某程序执行中,(SS)=0950H,(SP)=64H,该用户程序的堆栈底部物理地址是多少?
答:(SS)*10H+(SP)=09564H3.设堆栈段寄存器(SS)=3E4BH,程序中开辟的堆栈长度为200H个字节。试计算出堆栈的断基址,堆栈指针SP初始值(即堆栈中没有数据时的栈底)和SP初始值指向的物理地址。
答:物理地址为:3E4B0H,SP的初始值为200H,指向的物理地址为:3E6B1H4.设某用户程序(SS)=0925H,SP=30H,(AX)=1234,(DX)=5678H,问堆栈的地址范围是多少?如现有两条进展指令:
PUSHAXPUSHDS试问两指令执行后,栈顶的(SP)=?答:寻址范围:09250H~09280H,(SP)-4=2CH。5.试分别说明下列各指令中源操作数和目的操作数使用的寻址方式:ANDAX,0FFHANDBL,[0FFH]MOVDS,AXCMP[SI],CXMOVDS:[0FFH],CLSUB [BP][SI],AHADCAX,0ABH[BX]ORDX,-35[BX][DI]PUSHDSCLD答:目的操作数源操作数(1)寄存器寻址立即数寻址(2)寄存器寻址直接寻址(3)寄存器寻址寄存器寻址(4)寄存器间接寻址寄存器寻址(5)直接寻址寄存器寻址(6)基址变址寻址寄存器寻址(7)寄存器寻址寄存器相对寻址(8)寄存器寻址基址变址相对(9)无寄存器寻址
(10)隐含寻址注意:
寄存器寻址又称为“寄存器直接寻址”6.试分别指出下列各指令语句的语法是否有错,如有错,指明是什么错误。MOV[BX][BP],AXTEST[BP],BLADDSI,ABHANDDH,DLCMPCL,1234HSHR[BX][DI],3NOTCX,AXLEADS,35[SI]INCCX,1答:
(1)应将BP,BX其中之一该为SI或DI(2)正确(3)ABH改为0ABH(4)正确(5)是字操作,CL改为CX(6)移位数大于1时,应用CL(7)NOT指令只有一个操作数(8)LEA指令的源操作数应为一内存单元地址(9)此指令不用指出17.下面两条指令执行后,标志寄存器中CF,AF,ZF,SF和OF分别是什么状态?MOV DL,86ADD DL,0AAH答:CF=1AF=1ZF=0SF=0OF=18.在8086/8088CPU中可用于作地址指针的寄存器有哪些?
答:有BX,BP,SI,DI,IP,SP,DX9.已知(DS)=09lDH,(SS)=1E4AH,(AX)=1234H,(BX)=0024H,(CX)=5678H,(BP)=0024H,(SI)=0012H,(DI)=0032H,(09226H)=00F6H,(09228H)=1E40H,(1E4F6H)=091DH。下列各指令或程序段分别执行后的结果如何?(1)MOVCL,20H[BX][SI](2)MOV[BP][DI],CX(3)LEA BX,20H[BX][SI](4)MOVAX,2[BX](5)LDS SI,[BX][DI](6)MOV[SI],BX(7)XCHGCX,32H[BX](8)XCHG20H[BX][SI],AX99答(1)(CX)=56F6H;(2)(09226H)=5678H;(3)(AX)=1E40H;(4)(1E4F6H)=0024H;(5)(09226H)=1234H,(AX)=5678H.10.试按下列要求分别编制程序段:(1)把标志寄存器中符号位SF(b7位)置‘1’。
答:MOVAH,80HSAHF
这样正确吗?
(2)寄存器AL中高低四位互换。
答:MOVCL,4ROLAL,CL
3)现有三个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安全生产法律法规培训考试题附答案
- 2026年天津医学高等专科学校单招职业技能考试题库及答案详解(有一套)
- 2026年太原旅游职业学院单招职业适应性测试题库(含答案详解)
- 2026年四川航天职业技术学院单招职业倾向性测试题库带答案详解
- 2026年安徽工商职业学院单招综合素质考试题库(含答案详解)
- 养老院物资采购与发放制度
- 2026年天津交通职业学院单招职业倾向性测试题库附答案详解(满分必刷)
- 2026年太湖创意职业技术学院单招综合素质考试题库附参考答案详解(黄金题型)
- 2026年太湖创意职业技术学院单招职业技能考试题库附参考答案详解(考试直接用)
- 2026年大连汽车职业技术学院单招职业倾向性测试题库含答案详解(综合卷)
- 旅行社运营实务电子课件 2.1 走进旅行社门市
- 《健身气功八段锦》教案
- 乳腺良性肿瘤日间手术临床路径临床路径
- CBCC中国建筑色卡色
- (完整版)简单儿童对比涂色画画-可打印(干货)
- GB/T 16924-2008钢件的淬火与回火
- 中考语文专题复习专题一汉字读写课件
- 腹腔镜辅助下阴式子宫切除的课件
- 交管12123驾照学法减分题库200题(含答案完整版)
- 医院卒中中心护理组职责
- 露天煤矿边坡雷达管理制度 (试行)
评论
0/150
提交评论