第三章 指令系统(串、转移与其他指令)_第1页
第三章 指令系统(串、转移与其他指令)_第2页
第三章 指令系统(串、转移与其他指令)_第3页
第三章 指令系统(串、转移与其他指令)_第4页
第三章 指令系统(串、转移与其他指令)_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

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

文档简介

1、第第三章三章 80868086指令系统指令系统mov ax,12hcall displayJmp 1234h第3章 8086指令系统 23.3.4 串操作指令串操作指令串:串:顺序放在内存中的一组相同类型的数据。顺序放在内存中的一组相同类型的数据。串操作:串操作:对串中的元素进行相同的操作。对串中的元素进行相同的操作。串操作的寻址方式:串操作的寻址方式: 源操作数指针源操作数指针DS:SI (DS可跨越可跨越) 目的操作数指针目的操作数指针ES:DI每次串操作后:每次串操作后: 指令自动修改指令自动修改SI和和DI:字节字节1,字,字2。DF标志标志决定决定。 【指令:指令: CLD (置置D

2、F=0);STD (置置DF=1】串操作后,指针指向最后操作的元素的下一个元素串操作后,指针指向最后操作的元素的下一个元素)可实现两个存储单元之间的传送和比较可实现两个存储单元之间的传送和比较 有隐式和显式两种形式的指令有隐式和显式两种形式的指令第3章 8086指令系统 3l串操作的指针与方向串操作的指针与方向“A”“B”“C”“D” 源源: 数据段数据段 目的目的: 附加段附加段 DF=0DF=1DS:(SI)ES:(DI)结束后结束后DS:(SI)结束后结束后ES:(DI)第3章 8086指令系统 4MOVS ( MOVe String) 串传送串传送 CMPS (CoMPare Stri

3、ng) 串比较串比较 SCAS (SCAn String) 串扫描串扫描 LODS (LOaD from String) 取串取串 STOS (STOre into String) 存串存串 INS (INput from port to String) 输入输入 OUTS (OUTput String to port) 串输出串输出 与上述基本指令配合使用的前缀:与上述基本指令配合使用的前缀:REP (REPeat) 重复。重复。REPE/REPZ(REPeat while Equal) 相等则重复。相等则重复。REPNE/REPNZ(REPeat while Not Equal )不相等则

4、重复。)不相等则重复。l 串操作类指令串操作类指令第3章 8086指令系统 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指指向的附加段中的一个相应单元中去,同时根

5、据向的附加段中的一个相应单元中去,同时根据方向标志方向标志DF及数据类型自动修改及数据类型自动修改SI和和DI的值,以指向下一个单元。该的值,以指向下一个单元。该指令不影响标志位。指令不影响标志位。 串传送指令串传送指令MOVSB / MOVSW/MOVS例:例:将数据段中偏移地址为将数据段中偏移地址为2002H 开始的两个字符传开始的两个字符传送到目的地偏移地址为送到目的地偏移地址为1022H开始的单元中。开始的单元中。 1)字节传送)字节传送 (DF=0) CLD ;置置DF=0 MOV SI,2002H MOV DI,1022H MOVSB MOVSB 执行结束:执行结束: (SI)=2

6、004H,(DI)=1024H2)字传送)字传送 (DF=1) STD ;置置DF=1 MOV SI,2003H MOV DI,1023H MOVSW执行结束:执行结束: (SI)=2001H,(DI)=1021H3)显式字传送)显式字传送 (DF=0) MOV SI,2002H MOV DI,1022H MOVS WORD PTR DI,WORD PRT SI 第3章 8086指令系统 7下面程序段完成字传下面程序段完成字传送送 : : (4000:2000H) (8000:1000H)CLDMOV AX, 4000HMOV DS, AXMOV SI, 2000HMOV AX, 8000HM

7、OV ES, AXMOV DI, 1000HMOVSW l 段寄存器不能立即数,必须用段寄存器不能立即数,必须用AX中转中转第3章 8086指令系统 8 l 重复前缀重复前缀 有的串操作指令有的串操作指令(MOVS、STOS、LODS、INS和和OUTS)前面可加上重复前缀前面可加上重复前缀REP。当使用。当使用REP前缀时,前缀时,该指令重复执行,重复次数由该指令重复执行,重复次数由CX决定,每执行一次,决定,每执行一次,CX自动减自动减1。重复前缀重复前缀:REP (CX)0 时重复执行时重复执行REPE/REPZ (CX)0且且ZF=1时重复执行时重复执行REPNE/REPNZ (CX)

8、0且且ZF=0时重复执行时重复执行第3章 8086指令系统 9R E P执执 行行 流流 程程(C X )= (C X )-1R E P后后 的的串串 指指 令令YNC X = 0 ?l 重复前缀重复前缀REP执行过程:执行过程:(1)当当(CX)= 0 ,结束,结束REP,执,执行行REP下一条指令。下一条指令。(2)当当(CX)0,将将CX 减减1,执,执行行REP后的串指令,返回后的串指令,返回 (1)。例例: LEA DI, destination LEA SI, source MOV CX,20 REP MOVSB MOV AX,20u 只在只在(CX)=0时退出循环时退出循环第3章

9、 8086指令系统 10R E P Z 执执 行行 流流 程程(C X )= (C X )-1R E P Z 后后 的的串串 指指 令令YNYNC X = 0 ?Z F = 1 ?l当相等重复前缀当相等重复前缀REPZ执行过程:执行过程:(1) 当当(CX)=0 , 结束结束REPZ, 执行执行REPZ下一条指令;下一条指令;(2) 当当(CX)0,将,将CX 的内容减的内容减1,执行执行REPZ后的串指令;后的串指令;(3) 当当ZF = 1, 返回返回 (1) ;(4) 当当ZF1, 则结束则结束REPZ, 执行执行REPZ下一条指令。下一条指令。u (CX)减减1操作不影响标志操作不影响

10、标志u ZF标志由串操作决定标志由串操作决定第3章 8086指令系统 11R E P N Z 执执 行行 流流 程程(C X )= (C X )-1R E P N Z 后后 的的串串 指指 令令YNYNC X = 0 ?Z F = 0 ?l当不相等重复前缀当不相等重复前缀REPNZ执行过程:执行过程:(1) 当当(CX )=0 , 结束结束REPNZ,执行执行REPNZ下一条指令。下一条指令。(2)当当(CX)0,将,将CX 的内容减的内容减1,执行,执行REPNZ后的串指令。后的串指令。(3) 当当ZF = 0, 返回返回(1);(4) 当当ZF0, 则结束则结束REPNZ, 执行执行REP

11、NZ下一条指令。下一条指令。12例例1: 用用REP MOVS 进行数据块传送编程步骤进行数据块传送编程步骤: 设置传送方向设置传送方向 用用CLD 使使DF = 0,地址增加方向(正向),地址增加方向(正向) 用用STD 使使 DF = 1,地址减小方向(反向),地址减小方向(反向)设置源串地址设置源串地址 将源串首地址将源串首地址(DF=0)或末地址或末地址(DF=1)放入放入 DS:SI设置目的串地址设置目的串地址 将目的串首地址将目的串首地址(DF=0)或末地址或末地址(DF=1)放入放入 ES:DI设置串长度设置串长度 将串的长度(传送次数)放入将串的长度(传送次数)放入CX中中字节

12、传送字节传送 用用 REP MOVSB 字传送字传送 用用 REP MOVSW13例:例:若要将源串的若要将源串的100个字节数据传送到目标串单元中,个字节数据传送到目标串单元中,设源串首元素的偏移地址为设源串首元素的偏移地址为2500H,目标串首元素的偏,目标串首元素的偏移地址为移地址为1400H。 CLD ; DF=0,地址自动递增地址自动递增 MOV CX, 100 ;串长度,重复次数串长度,重复次数MOV SI,2500H ;源串首元素偏移地址源串首元素偏移地址MOV DI,1400H ;目标串首元素偏移地址目标串首元素偏移地址REP MOVSB ;重复传送,直到重复传送,直到CX=0

13、为止为止如采用字传送:如采用字传送:MOV CX, 50 MOV SI,2500H MOV DI,1400H REP MOVSW 14 串传送指令中:常用指令串传送指令中:常用指令 LEA获取偏移地址获取偏移地址l 用串传送指令实现将内存单元用串传送指令实现将内存单元MEM1的的200个个字节的数据传送到字节的数据传送到MEM2单元:单元: LEA SI,MEM1 LEA DI,MEM2 MOV CX,200 CLD REP MOVSB HLT15 例例: 编程将存放编程将存放在在 str1中的中的4字节字符串传送到字节字符串传送到str2定义定义的缓冲区中。的缓冲区中。DCBAstr1str

14、2;定义缓冲区定义缓冲区data1 SEGMENT str1 DB ABCD ;源串源串data1 ENDSdata2 SEGMENT str2 DB 4 DUP(?) ;目的缓冲区目的缓冲区data2 ENDS16CODE SEGMENTASSUME CS:CODE,DS,DATA1,ES,DATA2START: CLD ;DF=0,正方向传送正方向传送 MOV AX,data1 ;源串首地址的段值源串首地址的段值 DS MOV DS,AX LEA SI,str1 ;源串首地址的偏值源串首地址的偏值 SI MOV AX,data2 ;目的串首地址的段值目的串首地址的段值 ES MOV ES,

15、AX LEA DI,str2 ;目的串首地址的偏值目的串首地址的偏值 DI MOV CX, 4 ;串长度串长度 CX REP MOVSB ;串传送串传送 MOV AH,4CH INT 21HCODE ENDS END START17DC BA00H00H00H00HFC、 、 、F31234:0000str11235:0000str2A41236:0000程程 序序CLDREPMOVSBBdata1 SEGMENTstr1 DB ABCDdata1 ENDSdata2 SEGMENTstr2 DB 4 DUP(?)data2 EMDScode SEGMENT 、 CLD MOV AX,data

16、1 MOV DS,AX LEA SI,str1 MOV AX,data2 MOV ES,AX LEA DI,str2 MOV CX, 4 REP MOVSB 、code ENDS 假设程序经汇编、连接后,装入内存的情况如下假设程序经汇编、连接后,装入内存的情况如下:18DC BA00H00H00H00H1234:0000DS:SI1235:0000ES:DI(CX)=4执执行行 REP 前前各各寄寄存存器器的的设设置置执执行行一一次次 MOVSB 后后DC BAA00H00H00H1234:0001DS:SI1235:0001ES:DI(CX)=3执执行行完完 REP 后后DC BAABCD1

17、234:0004DS:SI1235:0004ES:DI(CX)=0程序执行结果:程序执行结果:第3章 8086指令系统 19 MOV AL, SI MOV ES:DI, AL INC SI INC DI next: JCXZ exit DEC CX MOVSB JMP next exit: .说明:说明:串指令可单独使用串指令可单独使用等价于等价于: MOVSB 等价于等价于: REP MOVSB第3章 8086指令系统 20 串比较指令串比较指令CMPSB / CMPSW/CMPS功能:功能:将由将由SI作为作为指针指针的源串中的的源串中的1个元素减去由个元素减去由DI作为指针的目标串中相对

18、应的作为指针的目标串中相对应的1个元素,不回送结果,个元素,不回送结果,只根据结果特征置标志位;并相应地修改只根据结果特征置标志位;并相应地修改SI和和DI内容内容指向下一个元素。指向下一个元素。指令执行的操作:指令执行的操作: CMPSB ; (DS):(SI)-(ES):(DI) ;(SI)1, (DI)1 CMPSW ; (DS):(SI+1)(SI)-(ES):(DI+1)(DI) ;(SI)2, (DI)2 指令也可写成:指令也可写成:CMPS dest, src比较的结果只反映在标志位上,串本身无变化。比较的结果只反映在标志位上,串本身无变化。本指令可用来检查两个串是否相等。本指令

19、可用来检查两个串是否相等。21l 用用 REPZ CMPS 进行串比较进行串比较 编程:编程: 设置比较方向设置比较方向 (STD或或CLD) 设置源串、目的串地址设置源串、目的串地址 将源串首地址将源串首地址(DF=0时时),或末地址(,或末地址(DF=1时)放时)放入入 DS、SI 将目的串首地址将目的串首地址(DF=0时时),或末地址(,或末地址(DF=1时)时)放入放入ES、DI 设置串长度设置串长度 将串的长度放入将串的长度放入CX中中 按按字节比较字节比较用用 REPZ CMPSB 按按字比较字比较用用 REPZ CMPSW22l 执行完执行完REPZ CMPS后,根据后,根据ZF

20、判断两串比较结果。判断两串比较结果。若若ZF=1, 两串相等,此时:两串相等,此时: CX=0, 表明串中所有元素已比较完毕表明串中所有元素已比较完毕 SI、DI指向串尾的下一单元。指向串尾的下一单元。若若ZF=0, 两串不等,此时:两串不等,此时: CX的值为剩下的未比较的元素个数。的值为剩下的未比较的元素个数。 SI、DI指向不相等元素的下一元素。指向不相等元素的下一元素。p 说明:在说明:在CMPS指令前加重复前缀指令前加重复前缀REPE/REPZ,用来确定两个串中的第用来确定两个串中的第1个不相同的数据。个不相同的数据。第3章 8086指令系统 23 串扫描串扫描SCASB / SCA

21、SW/SCAS功能:功能:用来从用来从目标串目标串中搜索(或查找)某个关键中搜索(或查找)某个关键字,要求将待查找的关键字事先置入字,要求将待查找的关键字事先置入(AL)或或(AX)中,取决于按字节还是字搜索。中,取决于按字节还是字搜索。操作:操作:将将AX或或AL中的关键字减去由中的关键字减去由(DI)所指向的所指向的目标串中的一个元素,不传送结果,只根据比较目标串中的一个元素,不传送结果,只根据比较结果置标志位,然后修改(结果置标志位,然后修改(DI)的内容指向下一)的内容指向下一个元素。个元素。第3章 8086指令系统 24执行的操作:执行的操作: 对字节:对字节:(AL)(ES):(D

22、I) DI1 对字:对字: (AX)(ES):(DI1)(DI) DI2该指令是比较(减法)操作,结果只影响标志该指令是比较(减法)操作,结果只影响标志位。位。要搜索的关键字放在要搜索的关键字放在AL(字节字节)或或AX(字字)中。中。本指令用于在串中查找指定的信息。本指令用于在串中查找指定的信息。 串扫描串扫描SCASB / SCASW第3章 8086指令系统 25SCAS指令加上重复前缀后,可对串进行连续扫描指令加上重复前缀后,可对串进行连续扫描比较:比较:若前缀为若前缀为REPZ,则表示比较结果相等,则表示比较结果相等 (ZF=1)且串且串未结束未结束(CX0),则继续比较。,则继续比较

23、。若前缀为若前缀为REPNZ,则表示比较结果不相等,则表示比较结果不相等(ZF=0)且串未结束且串未结束(CX0)就继续比较。就继续比较。 串扫描串扫描SCASB / SCASW26例:例: 用用REPNZ SCAS 在串中找关键字。在串中找关键字。编程步骤:编程步骤:设置查找方向设置查找方向设置串地址设置串地址:将串的首地址将串的首地址(DF=0时时),或末地址,或末地址(DF=1时)放入时)放入ES、DI中。中。设置关键字设置关键字: 将关键字放入将关键字放入AL (关键字为字节关键字为字节)或或 放放入入AX(关键字为字关键字为字)。设置串长度设置串长度 将串的长度放入将串的长度放入CX

24、中。中。查找字节查找字节用用 REPNZ SCASB 查找字查找字用用 REPNZ SCASW27执行完执行完REPNZ SCAS后,根据后,根据ZF判断查找结果。判断查找结果。若若 ZF=1, 则串中有关键字,此时:则串中有关键字,此时: (CX)的值为剩下的未搜索的元素个数,的值为剩下的未搜索的元素个数, (DI)指向关键字元素的下一元素,指向关键字元素的下一元素, 而关键字而关键字在在( DI )-1的位置的位置若若 ZF=0,则串中无关键字,此时:,则串中无关键字,此时: (CX)=0,表明串中所有元素已搜索完毕,表明串中所有元素已搜索完毕 (DI)指向串尾的下一单元。指向串尾的下一单

25、元。 串扫描串扫描SCASB / SCASW例:例:在在ES段的偏移段的偏移1000H开始处存有开始处存有10个个ASCII码。码。搜索搜索E,若找到则记下搜索次数及存放地址,若找到则记下搜索次数及存放地址,并在屏幕上显示并在屏幕上显示Y;若未找到则显示;若未找到则显示N。(见见右图右图)在屏幕上显示一个字符的在屏幕上显示一个字符的指令段如下:指令段如下: MOV DL, MOV AH,2 INT 21H 实现题目要求的程序段见下页实现题目要求的程序段见下页:1000H414243444546ABCDF. . .ES段E MOV DI, 1000H ;(DI)串偏移地址串偏移地址 MOV CX

26、, 0AH ;(CX)串长度串长度 MOV AL, E ;搜索关键字搜索关键字=E CLD ;从低地址到高地址进行搜索从低地址到高地址进行搜索 REPNZ SCASB ;若未找到若未找到, 继续搜索继续搜索 JZ FOUND ;找到找到, 转至转至FOUND MOV DL, N ;串中无串中无E,(DL)N JMP DONE ;转至转至DONEFOUND:DEC DI ;指针回退指针回退 MOV ADDR, DI ;ADDRE的地址的地址 SUB DI, 1000H MOV NUM, DI ;NUM搜索次数搜索次数 MOV DL, Y ;(DL)YDONE: MOV AH, 2 INT 21H

27、 ;显示字符显示字符 HLT 第3章 8086指令系统 30 串装入指令串装入指令LODSB / LODSW/LODS功能:功能:用来将用来将源串源串中由中由SI所指向的元素取到所指向的元素取到AX/AL寄存器中,修改寄存器中,修改SI的内容指向下一个元素。的内容指向下一个元素。说明:说明:该指令一般不加重复前缀,常用来和其他指该指令一般不加重复前缀,常用来和其他指令结合起来完成复杂的串操作功能。令结合起来完成复杂的串操作功能。第3章 8086指令系统 31字节装入:字节装入:LODSB ; (AL)(DS):(SI) ;(SI)1 字装入:字装入: LODSW ;(AX)(DS):(SI+1

28、)(SI) ; (SI)2 串装入指令通常不加重复前缀。串装入指令通常不加重复前缀。 LODSB等价于等价于: LODSW等价于等价于: MOV AL,SI MOV AX,SI INC SI INC SI INC SI 串装入指令串装入指令LODSB / LODSW/LODS第3章 8086指令系统 32 串存储指令串存储指令STOSB / STOSW/STOS 功能:功能:用来将用来将AX/AL寄存器中的寄存器中的1个字或字节写个字或字节写入由入由DI作为指针的目标串中,同时修改作为指针的目标串中,同时修改DI以指以指向串中的下一个元素。向串中的下一个元素。 说明:说明:该指令一般不加重复前

29、缀,常与其他指令该指令一般不加重复前缀,常与其他指令结合起来完成较复杂的串操作功能。若利用重复结合起来完成较复杂的串操作功能。若利用重复操作,可以建立一串相同的值。操作,可以建立一串相同的值。第3章 8086指令系统 33指令的操作为:指令的操作为: 对字节:对字节: STOSB ;(ES):(DI)(AL) ;( DI)1 对字:对字: STOSW ;(ES):(DI+1)(DI)(AX) ;( DI)2本指令用于把一块存储区域填充成某一初始值本指令用于把一块存储区域填充成某一初始值(即对存储区进行初始化)。(即对存储区进行初始化)。存储区域的首地址要预先设置到存储区域的首地址要预先设置到E

30、S:DI中。中。要存储到串中的数据要预先存到要存储到串中的数据要预先存到AL(AX)中。中。 串存储指令串存储指令STOSB / STOSW/STOS第3章 8086指令系统 34例例1 1:把从把从A000H开始的开始的2KB内存单元清零。内存单元清零。程序段如下:程序段如下: MOV DI,0A000H MOV AX,0 MOV CX,1024 CLD REP STOSWl 串存储指令应用串存储指令应用第3章 8086指令系统 35例例2:把把1000H开始的开始的100个存储单元填入个存储单元填入 ASCII码码2AH (“*”)。程序段如下:程序段如下:MOV DI, 1000H ;首

31、地址首地址 MOV AL, 2AH ; * MOV CX, 100 ;重复执行重复执行100次次 CLD ;增量修改增量修改DI REPSTOSBl 串存储指令应用串存储指令应用第3章 8086指令系统 36总是用总是用SI寄存器寻址源操作数,用寄存器寻址源操作数,用DI寄存器寻址寄存器寻址目的操作数。源操作数常存放在现行的数据段,隐目的操作数。源操作数常存放在现行的数据段,隐含段寄存器含段寄存器DS,但也允许段超越。目的操作数总是,但也允许段超越。目的操作数总是在现行的附加数据段,隐含段寄存器在现行的附加数据段,隐含段寄存器ES,不允许段,不允许段超越。超越。每一次操作以后修改地址指针,是增

32、量还是减量每一次操作以后修改地址指针,是增量还是减量取决于方向标志取决于方向标志DF。当。当(DF)=0时,地址指针增量,时,地址指针增量,即字节操作时地址指针加即字节操作时地址指针加1,字操作时地址指针加,字操作时地址指针加2。当当(DF)=1时,地址指针减量,即字节操作时地址指时,地址指针减量,即字节操作时地址指针减针减1,字操作是地址指针减,字操作是地址指针减2。l 字符串操作指令的共同特点:字符串操作指令的共同特点:第3章 8086指令系统 37 有的串操作指令可加重复前缀,指令按规定的操作有的串操作指令可加重复前缀,指令按规定的操作重复进行,重复操作的次数由重复进行,重复操作的次数由

33、CX寄存器决定。寄存器决定。若串操作指令的基本操作影响零标志若串操作指令的基本操作影响零标志ZF(如(如CMPS、SCAS),则可加重复前缀),则可加重复前缀REPEREPZ或或REPNEREPNZ,此时操作重复进行的条件不仅要求,此时操作重复进行的条件不仅要求(CX) 0,而 且 同 时 要 求而 且 同 时 要 求 Z F 的 值 满 足 重 复 前 缀 中 的 规 定的 值 满 足 重 复 前 缀 中 的 规 定(REPE/REPZ要求要求(ZF)=1,REPNE/REPNZ要求要求(ZF)=0)。)。 串操作汇编指令的格式可以写上操作数,也可以只串操作汇编指令的格式可以写上操作数,也可

34、以只在指令助记符后加上字母在指令助记符后加上字母“B”(字节操作)或(字节操作)或“W”(字操作)。加上字母(字操作)。加上字母“B”或或“W”后,指令助记符后,指令助记符后面不允许再写操作数。后面不允许再写操作数。l 字符串操作指令的共同特点(续):字符串操作指令的共同特点(续):第3章 8086指令系统 38串指令使用的一般方法串指令使用的一般方法设置源串地址设置源串地址设置目标串地址设置目标串地址设置串长度设置串长度设置操作方向设置操作方向DF串指令串指令MOV SI, 源串首地址源串首地址(或(或LEA SI, 源串)源串)MOV DI, 目的串首地址目的串首地址(或(或LEA DI,

35、 目的串)目的串)MOV CX, 串长度串长度CLD(或(或STD)串指令串指令第3章 8086指令系统 393.3.5 程序控制指令程序控制指令控制转移指令分为:控制转移指令分为:转移指令转移指令循环控制指令循环控制指令调用和返回指令调用和返回指令中断指令中断指令40在在8086/8088中,指令的地址由中,指令的地址由CS和和IP决定。决定。DSESSSCSIP数据暂存器数据暂存器PSW标志标志寄存器寄存器执行部件控制电路执行部件控制电路指令译码器指令译码器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器组寄存器组指指令令队队列列总线总线接口接口控制控制电路电路运运算

36、算器器地地址址加加法法器器、指令指令1指令指令2指令指令3指令指令4、数据数据1数据数据2数据数据3、地址总线地址总线AB数据总线数据总线DB控制总线控制总线CB地地址址译译码码器器41C CS和和IP两寄存器的内容决定了程序的流程两寄存器的内容决定了程序的流程 l 8086/8088 中中CS和和IP的变化规则:的变化规则: 1) reset复位后复位后 (CS)=FFFFH, (IP)=0, 8088从内存从内存FFFF:0000H处取第一条指令执行处取第一条指令执行;改变改变CS和和IP寄存器的值,就改变了程序执行的流程。寄存器的值,就改变了程序执行的流程。第一条指令第一条指令在内存的在

37、内存的ROM区区。422) 非控制转移指令,非控制转移指令,指令本身对指令本身对CS和和IP均无操作,均无操作, 形成顺序执行结构。形成顺序执行结构。BB0001B12090指令指令1指令指令2指令指令3CS:IP顺序执行结构:顺序执行结构: 顺序存放,顺序执行顺序存放,顺序执行t程序是指令的集合程序是指令的集合t指令在内存中顺序存放指令在内存中顺序存放t对非控制转移指令,对非控制转移指令, CPU取来一条指令后,取来一条指令后, 自动将自动将IP的值加上该指令的字节数,的值加上该指令的字节数, 使使IP顺序指向下一条指令,顺序指向下一条指令, CPU接着取来紧连着的指令执行。接着取来紧连着的

38、指令执行。 (此时此时IP的变化由的变化由CPU内部的硬件自动完成内部的硬件自动完成)433) 控制转移指令控制转移指令: 以以CS和和IP为主要操作对象为主要操作对象改变改变CS和和IP的值,使程序产生分支、调用结构。的值,使程序产生分支、调用结构。指令指令1指令指令2指令指令3指令指令439D87D0287C3A30020CS:IP分支结构、调用结构分支结构、调用结构: 顺序存放,非顺序执行顺序存放,非顺序执行 CMP AX, BX JGE great XCHG AX, BX great: MOV max, AX 控制转移指令控制转移指令JGE可以改变可以改变IP的值的值, 使程序非顺序执

39、行。使程序非顺序执行。第3章 8086指令系统 44l转移指令的实质:改变转移指令的实质:改变IP(或或CS)的内容。的内容。 所有转移指令不会影响标志位。所有转移指令不会影响标志位。 分为无条件转移和条件转移两种。分为无条件转移和条件转移两种。1. 转移指令转移指令第3章 8086指令系统 45l 目标地址的寻址方式(目标地址的寻址方式(JMP指令)指令)直接寻址方式:直接寻址方式: 转移地址直接在指令的机器代码中给出。转移地址直接在指令的机器代码中给出。间接寻址方式:间接寻址方式: 转移地址在寄存器或主存单元中,并通过它们来转移地址在寄存器或主存单元中,并通过它们来间接寻址。间接寻址。第3

40、章 8086指令系统 46段内转移段内转移 (不需要改变不需要改变CS的值的值) 近转移(近转移(near):在当前代码段在当前代码段64KB范围内转范围内转移,不需要更改移,不需要更改CS段地址,只要改变段地址,只要改变IP偏移地址。偏移地址。短转移短转移(short):如果转移距离可用一个字节(如果转移距离可用一个字节(-128 +127)来表示。)来表示。段间转移(段间转移(需要改变需要改变CS的值的值) 远转移(远转移(far ): 从当前代码段跳转到另一个代码从当前代码段跳转到另一个代码段,需要更改段,需要更改CS段地址和段地址和IP偏移地址。目标地址偏移地址。目标地址必须用一个必须

41、用一个32位数表达(位数表达(32位远指针),是逻辑位远指针),是逻辑地址。地址。l目标地址的范围(目标地址的范围(JMP指令)指令)第3章 8086指令系统 47l目标地址的范围(目标地址的范围(JMP指令)的使用指令)的使用实际编程时,汇编程序会根据目标地址的距离,实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移。自动处理成短转移、近转移或远转移。程序员也可以用操作符程序员也可以用操作符 short/near ptr 或或 far ptr 进行强制指定转移的类型。进行强制指定转移的类型。第3章 8086指令系统 48(1) 无条件转移指令无条件转移指令 JMP 本

42、指令无条件转移到指定的目标地址,以执行从该本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。根据设置地址开始的程序段。根据设置CS、IP的方法,的方法,JMP指指令分成令分成4种情况。种情况。 段内直接转移:段内直接转移: JMP disp 指令中给出的指令中给出的8/16位的位移量位的位移量加到加到IP。CS保持不变。保持不变。 段内间接转移:段内间接转移: JMP reg/mem reg/mem中的中的16位偏移地址送位偏移地址送IP。CS保持不变。保持不变。 段间直接转移段间直接转移: JMP 段地址段地址:偏移地址偏移地址 指令中给出的指令中给出的16位的段和位的段和16位

43、偏移地址送给位偏移地址送给CS和和IP。 段间间接转移段间间接转移: JMP mem32 mem32中的中的16位的段和位的段和16位的偏移地址送给位的偏移地址送给CS和和IP。第3章 8086指令系统 49转移的目标地址由指令直接给出。指令中给出的目标转移的目标地址由指令直接给出。指令中给出的目标地址实际上是一个地址实际上是一个相对于相对于IP的位移量的位移量:位移量位移量 转移范围转移范围 汇编语言中格式汇编语言中格式 8位位 -128+127 JMP SHORT PTR 标号标号 16位位 -32768+32767 JMP NEAR PTR 标号标号 例:例:JMP0120H ;直接转向

44、直接转向0120H JMPSHORT PTR LP1 ;转向标号转向标号LP1 JMPNEAR PTR LP2 ;转向标号转向标号LP2由于是段内转移,故转移后由于是段内转移,故转移后CS内容保持不变内容保持不变 段内直接转移段内直接转移第3章 8086指令系统 50段内间接转移段内间接转移 转移的目标地址由寄存器或存储单元的内容给出。转移的目标地址由寄存器或存储单元的内容给出。 例例1: JMP SI 若若(SI)=1200H,则指令执行后,则指令执行后,(IP)=1200H,于是,于是转向代码段的偏移地址转向代码段的偏移地址1200H处开始执行。处开始执行。注意:注意:目标地址以段内偏移的

45、形式给出,而不是相对目标地址以段内偏移的形式给出,而不是相对于于IP的位移量,所以它是一个的位移量,所以它是一个16位的操作数。位的操作数。第3章 8086指令系统 51例例2:JMP BX+DI设指令执行前设指令执行前: (DS)=3000H,(BX)=1300H, (DI)=1200H,(32500H)=2350H; 则指令执行后则指令执行后:(IP)=2350H在汇编语言中在汇编语言中,段内间接寻址通常写成:段内间接寻址通常写成: JMP WORD PTR BX+DI 表示所取得的目标地址是一个字。表示所取得的目标地址是一个字。 段内直接转移段内直接转移第3章 8086指令系统 52段间

46、直接转移段间直接转移指令中直接给出要转移目的的段地址和偏移地址。指令中直接给出要转移目的的段地址和偏移地址。 例:例:JMP 2000H:1000H 执行时执行时,(IP)1000H,(CS)2000H注注:直接地址为符号地址时,段间直接转移指令中的符接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符号地址前应加操作符 FAR PTR。 例:例:JMP FAR PTR far_label 其中的其中的far_label为远类型的标号。为远类型的标号。第3章 8086指令系统 53 转移的目的地址转移的目的地址( (段和偏移段和偏移) )在两个相邻的字存储在两个相邻的字存储单元中。单元

47、中。例如:例如: JMP DWORD PTR SI 设指令执行前设指令执行前: (DS)=4000H,(SI)=1212H, (41212H)=1000H,(41214H)=4A00H 则指令执行后则指令执行后: (IP)=1000H,(CS)=4A00H 于是转到于是转到4B000H处开始执行指令。处开始执行指令。 例中的例中的DWORD PTR表示转移地址是一个双字。表示转移地址是一个双字。段间间接转移段间间接转移第3章 8086指令系统 54400001212+) 41212DSSI0010004A 4121241213412144121510004A00IPCS 段间间接转移操作示意图

48、段间间接转移操作示意图1111111111101100JMP DWORD PTR SI的机器码的机器码DS:SI第3章 8086指令系统 55可实现程序的条件分支。可实现程序的条件分支。根据标志位的状态来决定是否进行分支转移。根据标志位的状态来决定是否进行分支转移。格式:格式: JXX label ;xx为条件名称缩写为条件名称缩写 转移范围为转移范围为-128-128+127+127字节字节( (段内短距转移)。段内短距转移)。主要的条件转移指令参见下表。主要的条件转移指令参见下表。(2) 条件转移指令条件转移指令 JXX实际指令只有实际指令只有16条,但却有条,但却有30个助记符。个助记符

49、。采用多个助记符,只是为了方便记忆和使用。采用多个助记符,只是为了方便记忆和使用。第3章 8086指令系统 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, 结果为负结果为负则转移则转移JN

50、S ;SF=0,结果为正则转移结果为正则转移JO ;OF=1,则转移则转移JNO ;OF=0,则转移则转移例例: 一带符号数存放于内存字节单元一带符号数存放于内存字节单元X,如果该数是奇,如果该数是奇数,则将该数乘数,则将该数乘4,否则将其变成奇数。,否则将其变成奇数。DATA SEGMENT X DB -51DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,X TEST AL,00000001B JZ EVEN ;偶数转到偶数转到 EVEN MOV CL,2SAL X,CL ;SHL

51、X,CLJMP END ;无条件转移无条件转移EVEN: OR X,00000001BEND: MOV AH,4CHINT 21HCODE ENDSEND START 例例: 一带符号数存放于内存字节单元一带符号数存放于内存字节单元X,将该数的绝对值,将该数的绝对值存放于内存单元存放于内存单元Y中。中。DATA SEGMENT X DB -51 Y DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,X TEST AL,10000000BJNS plus ; 正数转移正数转移 NE

52、G AL ;0-(AL)-(AL) plus: MOV Y,AL MOV AH,4CH INT 21H CODE ENDSEND START第3章 8086指令系统 60这类指令主要用来判断两个数的大小。使用方法:这类指令主要用来判断两个数的大小。使用方法: CMP dist,src ;比较比较 Jxx label ;根据比较结果转移根据比较结果转移 判断无符号数的大小判断无符号数的大小l JA 大于则转移(大于则转移(distsrc) 转移条件为转移条件为: CF=0ZF=0lJB 小于或则转移(小于或则转移(dist src) 转移条件为转移条件为: CF=1ZF=1 JAE 大于等于转移

53、大于等于转移 JBE 小于等于转移小于等于转移 根据组合条件设置的条件转移指令根据组合条件设置的条件转移指令第3章 8086指令系统 61lJG ;大于则转移大于则转移(distsrc) 转移条件为转移条件为: (SF OF=0)ZF=0lJGE ;大于或等于则转移大于或等于则转移(distsrc) 转移条件为转移条件为: (SF OF=0)ZF=1lJL ;小于则转移小于则转移(distsrc) 转移条件为转移条件为: (SF OF=1)ZF=0lJLE ;小于或等于则转移小于或等于则转移(distsrc) 转移条件为转移条件为: (SF OF=1)ZF=1 判断有符号数的大小判断有符号数的

54、大小第3章 8086指令系统 62根据根据CX内容来决定是否转移的转移指令内容来决定是否转移的转移指令 JCXZ label 若若(CX)=0,则转移到则转移到label处开始执行。处开始执行。例: 在以在以DATA1为首址的内存数据段中,存放了为首址的内存数据段中,存放了200个个16位带符号数,试将其中最大和最小的位带符号数,试将其中最大和最小的带符号数带符号数找找出来,分别存放到以出来,分别存放到以MAX和和MIN为首的内存单元中为首的内存单元中。分析:分析:为了寻找最大和最小的元素,可先取出数据块为了寻找最大和最小的元素,可先取出数据块中的一个数据作为标准,暂且将它同时存放到中的一个数

55、据作为标准,暂且将它同时存放到MAX和和MIN单元中,然后将数据块中的其他数据逐个分别与单元中,然后将数据块中的其他数据逐个分别与MAX和和MIN中的数相比较,凡大于中的数相比较,凡大于MAX者,取代原者,取代原来来MAX中的内容,凡小于中的内容,凡小于MIN者,取代原来者,取代原来MIN中中的内容,最后即可得到数据块中最大和最小的带符号的内容,最后即可得到数据块中最大和最小的带符号数。数。 必须:比较带符号数的大小时,应该采用比较带符号数的大小时,应该采用JG和和JL等等条件转移指令。根据要求可编程如下:条件转移指令。根据要求可编程如下: LEA SI,DATA1 ;(SI)数据块首址 MO

56、V CX,200 ;(CX)数据块长度 CLD ;清方向标志DF LODSW ;取一个16位带符号数到AX MOV MAX,AX ;送MAX单元 MOV MIN,AX ;送MIN单元 DEC CX ;(CX)(CX) 1 NEXT: LODSW ;取下一个16位带符号数 CMP AX,MAX ;与MAX单元内容比较 JG GREA ;大于MAX,则转GREA CMP AX,MIN ;否则,与MIN单元内容比较 JL LESS ;小于MIN,则转LESS JMP GOON ;否则,转GOONGREA:MOV MAX,AX ;MAX)(AX) JMP GOON ;转GOONLESS: MOV MI

57、N,AX ;(MIN)(AX)GOON: DEC CX ;CX减1,若不等于零,转NEXT JNZ NEXT HLT ;停止第3章 8086指令系统 652. 循环控制指令循环控制指令用在循环程序中以确定是否要继续循环。用在循环程序中以确定是否要继续循环。循环次数通常置于循环次数通常置于CX中。中。转移的目标应在距离本指令转移的目标应在距离本指令-128+127的范围之的范围之内。内。循环控制指令不影响标志位。循环控制指令不影响标志位。第3章 8086指令系统 66(1)LOOP格式:格式:LOOP label操作:操作:(CX)-1CX; 若若(CX)0,则转至则转至label处执行;处执行

58、; 否则退出循环否则退出循环,执行执行LOOP后面的指令。后面的指令。 注:注:LOOP指令与下面的指令段等价:指令与下面的指令段等价: DEC CX JNZ label第3章 8086指令系统 67(2) LOOPZ (LOOPE)格式:格式:LOOPZ label操作:操作:(CX)-1CX; 若(CX)0ZF=1,则转至label处执行; 否则退出循环,执行LOOP后面的指令。3)LOOPNZ (LOOPNE)格式:格式:LOOPNZ label操作:操作:(CX)-1CX; 若(CX)0ZF=0,则转至label处执行; 否则退出循环,执行LOOP后面的指令。例例1:给:给1A000H

59、开始的开始的256个内存单元均减去个内存单元均减去1,若,若 发发现某个单元减为现某个单元减为0则立即退出循环,其后的单元不再则立即退出循环,其后的单元不再减减1。程序段如下。程序段如下:(逻辑地址为:(逻辑地址为1A00:0H) MOV AX, 1A00H MOV DS, AX ; 1A00H段段 MOV DI, -1 MOV CX, 256 GOON: INC DI DEC BYTE PTRDI LOOPNZ GOON HLT 第3章 8086指令系统 69例例2:在在8000H开始的长度为开始的长度为1000字节的字符串中查找字节的字符串中查找S,若,若找到,把其偏移地址记录在找到,把其

60、偏移地址记录在ADDR中,否则中,否则ADDR单元置单元置为为0FFFFH。 MOV DI, 8000H MOV CX, 1000 MOV AL, S MOV ADDR, 0FFFFH GOON: SCASB LOOPNZ GOON JNZ DONE DEC DI MOV ADDR,DI DONE: HLT 第3章 8086指令系统 703. 过程调用和返回指令过程调用和返回指令l过程过程(子程序子程序):一段具有特定功能的,供其它程序:一段具有特定功能的,供其它程序调用的公用程序。调用的公用程序。 特点:特点:调用子程序时,调用子程序时,IP(CS)的内容被压入堆栈栈顶。从的内容被压入堆栈栈

温馨提示

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

评论

0/150

提交评论