计算机硬件技术基础:第3章 指令系统4_第1页
计算机硬件技术基础:第3章 指令系统4_第2页
计算机硬件技术基础:第3章 指令系统4_第3页
计算机硬件技术基础:第3章 指令系统4_第4页
计算机硬件技术基础:第3章 指令系统4_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

1、 第第3章章寻址方式和指令系统寻址方式和指令系统3.3.5 控制转移类指令控制转移类指令 控制转移类指令用于实现分支、循环、控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令过程等程序结构,是仅次于传送指令的常用指令的常用指令重点掌握:重点掌握: JMP/Jcc/LOOP/JCXZ CALL/RET 控制转移类指令通过控制转移类指令通过改变改变IP(和(和CS)值,值,实现程序执行顺序的改变实现程序执行顺序的改变目标地址的寻址范围:段内目标地址的寻址范围:段内寻寻址址段内转移段内转移近转移(近转移(NEAR)在 当 前 代 码 段在 当 前 代 码 段 6 4 K B 范 围

2、内 转 移范 围 内 转 移( 32KB范围)范围)不需要更改不需要更改CS段地址,段地址,只要改变只要改变IP偏偏移地址移地址段内转移段内转移短转移(短转移(SHORT)转移范围可以用一个字节表达,在段转移范围可以用一个字节表达,在段内内128127范围的转移范围的转移代码段代码段代码段代码段目标地址的寻址范围:段间目标地址的寻址范围:段间寻寻址址段间转移段间转移远转移(远转移(FAR)从当前代码段跳转到另一个代码段,从当前代码段跳转到另一个代码段,可以在可以在1MB范围范围需要需要更改更改CS段地址和段地址和IP偏移地址偏移地址目标地址必须用一个目标地址必须用一个32位数表达,叫位数表达,

3、叫做做32位远指针,它就是逻辑地址位远指针,它就是逻辑地址代码段代码段代码段代码段 实际编程时,汇编程序会根据目标地址的实际编程时,汇编程序会根据目标地址的属性,属性,自动处理自动处理成短转移、近转移或远转移成短转移、近转移或远转移 程序员可用操作符程序员可用操作符short、near ptr 或或far ptr 强制成为需要的转移类型强制成为需要的转移类型目标地址的寻址方式目标地址的寻址方式相对寻址方式相对寻址方式指令代码中提供目的地址指令代码中提供目的地址相对相对于当前于当前IP的位移的位移量,转移到的目的地址(转移后的量,转移到的目的地址(转移后的IP值)就是值)就是当前当前IP值加上位

4、移量值加上位移量直接寻址方式直接寻址方式指令代码中提供目的逻辑地址,转移后的指令代码中提供目的逻辑地址,转移后的CS和和IP值值直接直接来自指令操作码后的目的地址操作数来自指令操作码后的目的地址操作数间接寻址方式间接寻址方式指令代码中指示寄存器或存储单元,目的地址指令代码中指示寄存器或存储单元,目的地址从寄存器或存储单元中从寄存器或存储单元中间接间接获得获得用标号表达用标号表达用标号表达用标号表达用寄存器或存储器操作数表达用寄存器或存储器操作数表达控制转移指令分为控制转移指令分为5类类:1. 无条件转移无条件转移2. 调用与返回调用与返回3. 条件转移条件转移4. 循环转移循环转移5.中断中断

5、一、一、 无条件转移指令无条件转移指令 格式:格式:JMP 目标标号目标标号 ;无条件转移到目标单元无条件转移到目标单元 指令标号指令标号直接转移,段内直接转移,段内/段间段间 REG间接转移,段内间接转移,段内 (16位通用位通用) 内存内存间接转移,段内间接转移,段内/段间段间 如目标单元在当前代码段内,如目标单元在当前代码段内,只修改只修改IP段内转移段内转移 目标单元在其它代码段中,目标单元在其它代码段中,修改修改IP和和CS段间转段间转移移转移分成两类:段内或段间转移。转移分成两类:段内或段间转移。无条件转移指令有五种格式:无条件转移指令有五种格式: q 段内直接短转移段内直接短转移

6、q 段内直接近转移段内直接近转移q 段内间接转移段内间接转移q 段间直接远转移段间直接远转移q 段间间接转移段间间接转移无条件地将控制转移到指令中规定的目的地。无条件地将控制转移到指令中规定的目的地。目标地址可以是:直接方式目标地址可以是:直接方式/间接方式给出。间接方式给出。 JMP指令不影响标志位。指令不影响标志位。1. 段内直接转移段内直接转移转移的目标标号转移的目标标号直接出现在指令中直接出现在指令中格式:格式:JMP DST ; IPIP+disp(偏移量)(偏移量) 目标地址目标地址 可使用符号地址可使用符号地址 DST 在汇编语言中使用符号地址。在汇编语言中使用符号地址。 在机器

7、语言中存放位移量在机器语言中存放位移量disp disp=DSTJMP指令的下一条指令地址(指令的下一条指令地址(IP)(补码)(补码) 1. 段内直接转移段内直接转移 若偏移量若偏移量disp为为8位,转移范围位,转移范围(128127) 段内直接短转移段内直接短转移符号地址前加操作符符号地址前加操作符SHORT格式格式 :JMP SHORT DST;IPIP+disp8 8位位移量位位移量disp8,占有一个字节。而指令本身占有,占有一个字节。而指令本身占有两个字节两个字节。 若偏移量若偏移量disp为为16位,转移范围为整个位,转移范围为整个CS段内任一位置段内任一位置(32KB)段内直

8、接近转移段内直接近转移 符号地址前加操作符符号地址前加操作符NEAR PTR格式:格式:JMP NEAR PTR DST ;IPIP+disp16 可以省略可以省略位移量为位移量为disp16范围:范围:-32768+32767H,占有两个字节。,占有两个字节。 而指令本身占有而指令本身占有三个字节三个字节。可以转移到段内的任一位置。可以转移到段内的任一位置。1. 段内直接转移段内直接转移例例1:JMP 2000H ;直接转移到直接转移到2000H去执行指令去执行指令JMP SHORT LPI ;段内短转移,转向符号地址段内短转移,转向符号地址 LPI处处JMP NEAR PTR KKK ;段

9、内近转移,转向符段内近转移,转向符 号地址号地址KKK处处 例例2 例例3例如:代码段内有一条无条件转移指令在汇编语言中使用符号地址。例如:代码段内有一条无条件转移指令在汇编语言中使用符号地址。JMP SHORT NEXT指令执行过程:指令执行过程:NEXT在汇编语言中使用符号地址在汇编语言中使用符号地址(IP)(IP)当前当前+D8源程序 :源程序 :条件转移指令:JMP SHORT 条件转移指令:JMP SHORT nextnext. next:next:MOV AL,03HMOV AL,03HOPOP50H50H.OPOP03H03H.3000:1000H3000:1000H3000:1

10、050H3000:1050H(IP)(IP)当前当前D D8 8=50H=50H=1050H-1000H=1050H-1000H(IP)=(IP)当前+D8(IP)=(IP)当前+D8内存内存8位位移量位位移量D8的范围在(的范围在(-128 127)之间)之间,否则出错。否则出错。 源程序 : 源程序 :next :next :. -128-128.条件转移指令:条件转移指令:JMP SHORT JMP SHORT nextnext.+127+127. next:next: MOV AL,03HMOV AL,03H如:如:tager: JMP tagerJMP SHORT tager tag

11、er:2. 段内间接转移段内间接转移 (CS)不变,只改变不变,只改变(IP)格式:格式:JMP DST; IP(EA) 寄存器寄存器IPREG16 内存单元内存单元IP(EA+1),(EA) (除立即数以外的任何一种寻址方式)(除立即数以外的任何一种寻址方式)例:例:JMP BX JMP WORD PTR BX+25H若若(DS)=2000H,(BX)=0100H(20125H)=34H,(20126H)=12H则第一条指令执行的结果是则第一条指令执行的结果是: IP=0100H 第二条指令执行的结果是第二条指令执行的结果是: IP=1234H3. 段间直接转移段间直接转移 (CS) 、 (

12、IP)都改变都改变JMP FAR PTR DST ;IPDST的段内偏移地址的段内偏移地址 CSDST所在段的段地址所在段的段地址 直接给直接给seg16:offset16数值表达式数值表达式 符号地址前加符号地址前加FAR PTR符号地址与指令不在同一个段里。符号地址与指令不在同一个段里。在机器语言中则要指定转向地址的偏移地址和段地址在机器语言中则要指定转向地址的偏移地址和段地址指令本身占有指令本身占有5个字节个字节:用用1个字节存放操作码,个字节存放操作码, 用用2个字分别存放符号地址的段值、偏移值。个字分别存放符号地址的段值、偏移值。3. 段间直接转移段间直接转移 (CS) 、 (IP)

13、都改变都改变例例1:DST用数值表达式表示用数值表达式表示 JMP F000H:005BH;可省略可省略FAR属性说明属性说明 CSF000H, IP005BH3. 段间直接转移段间直接转移例例2:DST用符号地址表示用符号地址表示CSEG1 SEGMENT JMP FAR PTR PROGCSEG1 ENDSCSEG2 SEGMENTPROG: .CSEG2 ENDSFAR 远属性标号远属性标号, 标号与控制转移指令不在同一段中。标号与控制转移指令不在同一段中。在汇编语言中,在机器语言中存放如下:在汇编语言中,在机器语言中存放如下:例:例: C1 SEGMENT JMP FAR PTR ne

14、xt_prog C1 ENDS C2 SEGMINT next_prog: C2 ENDSE AE A5 05 00 20 20 00 02 02 0OPOP码码新新(IP)=0250H(IP)=0250H新新(CS)=2000H(CS)=2000HJMPJMP指令指令C1C1段段C2C2段段20000H20000Hnext_prognext_prog: :20250H20250H2000:0250H4. 段间间接转移段间间接转移 (CS) 、 (IP)都改变都改变格式:格式:JMP DWORD PTR DST ;IP(EA) 双字数据双字数据 CS(EA+2) 可以使用存储器可以使用存储器

15、(除立即数和寄存器以外的任何一种寻址方式)(除立即数和寄存器以外的任何一种寻址方式) 例:例:JMP DWORD PTR BX若若(DS)=2000H,(BX)=0100H(20100H)=1000H,(20102H)=4A00H则执行后:则执行后:IP=1000H,CS=4A00H 程序从程序从4B000H单元开始继续执行指令。单元开始继续执行指令。 JMP指令对标志位无影响。指令对标志位无影响。二、二、 条件转移指令条件转移指令条件转移指令条件转移指令Jcc根据上一条指令所设置的条件根据上一条指令所设置的条件码确定程序是否发生转移。其通用格式为码确定程序是否发生转移。其通用格式为:Jcc

16、label;条件满足条件满足,发生转移发生转移;IPIP8位位移量位位移量;否则,顺序执行否则,顺序执行label是一个标号、一个是一个标号、一个8位位移量,表示位位移量,表示Jcc指令指令后的那条指令的偏移地址,到目标指令的偏移地后的那条指令的偏移地址,到目标指令的偏移地址的地址位移址的地址位移label只支持段内直接短转移只支持段内直接短转移(-128127) 所有条件转移指令都是所有条件转移指令都是相对转移相对转移形式,形式,范围范围(-128+127)。当需往一个较远地方进行条件转移时,当需往一个较远地方进行条件转移时,选用条件转移转到附近一个单元,选用条件转移转到附近一个单元,然后,

17、再用无条件转移转到较远的目的地。然后,再用无条件转移转到较远的目的地。 条件转移指令中,相当一部分指令是在比较完二个数大小条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移,后,根据结果而决定是否转移, 条件转移指令不影响标志位条件转移指令不影响标志位Jcc指令的分类指令的分类Jcc指令不影响标志,但要利用标志(指令不影响标志,但要利用标志(表表3.2)根据利用的标志位不同,分成三种情况:根据利用的标志位不同,分成三种情况: 判断单个标志位状态判断单个标志位状态 比较无符号数高低比较无符号数高低 比较有符号数大小比较有符号数大小 Jcc指令实际虽然只有指令实际虽然只有

18、18条,但却有条,但却有30个助记符个助记符 采用多个助记符,目的是为了方便记忆和使用采用多个助记符,目的是为了方便记忆和使用 以单个状态标志作为转移条件助记符以单个状态标志作为转移条件助记符 转移条件转移条件 适用于:适用于:测试某种运算结果,并根据不同的状测试某种运算结果,并根据不同的状态标志产生程序分支,以便做不同的处理。态标志产生程序分支,以便做不同的处理。例例1:ADD AX, BXJC TOO_BIG;若加法有进位转至若加法有进位转至TOO-BIG 处理处理SUB AL, BLJZ ZERO;若减法结果为若减法结果为0,转至转至ZERO处处 理理例题例题 判断单个标志位状态判断单个

19、标志位状态题目:题目:将将AX中存放的无符号数除以中存放的无符号数除以2,如,如果是奇数则加果是奇数则加1后除以后除以2问题:问题:如何判断如何判断AX中的数据是奇数还是偶中的数据是奇数还是偶数?数?解答:解答:判断判断AX最低位是最低位是“0”(偶数),还(偶数),还是是“1”(奇数)。可以用位操作类指令(奇数)。可以用位操作类指令例题例题 判断单个标志位状态判断单个标志位状态1:用逻辑与指令将除最低位外的其他位变成用逻辑与指令将除最低位外的其他位变成0,保,保留最低位不变。判断这个数据是留最低位不变。判断这个数据是0,AX就是偶数;就是偶数;否则,为奇数否则,为奇数2:将最低位用移位指令移

20、至进位标志,判断进位将最低位用移位指令移至进位标志,判断进位标志是标志是0,AX就是偶数;否则,为奇数就是偶数;否则,为奇数3:将最低位用移位指令移至最高位(符号位),将最低位用移位指令移至最高位(符号位),判断符号标志是判断符号标志是0,AX就是偶数;否则,为奇数就是偶数;否则,为奇数例题例题 解答解答1 用用JZ指令实现指令实现 test ax,01h ;测试;测试AX的最低位的最低位D0(不用(不用AND指指 令,以免改变令,以免改变AX) jz even ;标志;标志ZF1,即,即D00:AX内是偶内是偶 数,程序转移数,程序转移 add ax,1 ;标志;标志ZF0,即,即D01:A

21、X内的奇内的奇 数,加数,加1even:shr ax,1;AXAX2 用右移一位的方法实现除以用右移一位的方法实现除以2。例题例题 解答解答2 用用JNC指令实现指令实现mov bx,axshr bx,1 ;将;将AX的最低位的最低位D0移进移进CFjnc even ;标志;标志CF0,即,即D00:AX内是内是 偶数,程序转移偶数,程序转移add ax,1 ;标志;标志CF1,即,即D01:AX内的内的 奇数,加奇数,加1even:shr ax,1 ;AXAX2还可用还可用SAR、ROR和和RCR指令指令例题例题 解答解答3 用用JNS指令实现指令实现mov bx,axror bx,1 ;将

22、;将AX的最低位的最低位D0移进最高位移进最高位 (符号位(符号位SF)jns even ;标志;标志SF0,即,即D00:AX内是内是 偶数,程序转移偶数,程序转移add ax,1 ;标志;标志SF1,即,即D01:AX内的内的 奇数,加奇数,加1even:shr ax,1 ;AXAX2错误!错误!循环移位指令不影响循环移位指令不影响SF等标志等标志ADD BX,0;增加一条指令;增加一条指令例例 判断是否为字母判断是否为字母Y;寄存器;寄存器AL中是字母中是字母Y(含大小写),则令(含大小写),则令AH0,否则令否则令AH1cmp al,y;比较;比较AL与小写字母与小写字母yje nex

23、t;相等,转移;相等,转移cmp al,Y ;不相等,;不相等,;继续比较;继续比较AL与大写字母与大写字母Yje next;相等,转移;相等,转移mov ah,-1;不相等,令;不相等,令AH1jmp done;无条件转移指令;无条件转移指令next:mov ah,0;相等的处理:令;相等的处理:令AH0done:2. 比较无符号数高低比较无符号数高低无符号数的大小用高(无符号数的大小用高(Above)、低()、低(Below)表示,需要利用表示,需要利用CF确定高低、利用确定高低、利用ZF标志确定相标志确定相等(等(Equal)两数的高低分成两数的高低分成4种关系,对应种关系,对应4条指令

24、条指令JB(JNAE):目的操作数低于(不高于等于)源操作数):目的操作数低于(不高于等于)源操作数JNB(JAE):目的操作数不低于(高于等于)源操作数):目的操作数不低于(高于等于)源操作数JBE(JNA):目的操作数低于等于(不高于)源操作数):目的操作数低于等于(不高于)源操作数JNBE(JA):目的操作数不低于等于(高于)源操作数):目的操作数不低于等于(高于)源操作数JA/JNBECF=0且且ZF=0高于高于/JAE/JNBCF=0或或ZF=1 高于或等于高于或等于/JB/JNAECF=1且且ZF=0 /不高于不等于不高于不等于JBE/JNACF=1或或ZF=1 /不高于不高于 以

25、两个无符号数比较的结果作为转移条件以两个无符号数比较的结果作为转移条件2. 比较无符号数高低比较无符号数高低P126 表表3.2中的中的1114条指令条指令 根据两个无符号数相比较所产生的状态标志根据两个无符号数相比较所产生的状态标志CF和和ZF决定是否转移。决定是否转移。 例:例: MOV AL,0FEH ;FEH和和01H为无符号数为无符号数 CMP AL,01H ;无符号数无符号数 0FEH01H JA ABOVE ;转移到转移到ABOVE3. 比较有符号数大小比较有符号数大小判断有符号数的大(判断有符号数的大(Greater)、小()、小(Less),),需要组合需要组合OF、SF标志

26、、并利用标志、并利用ZF标志确定相等标志确定相等与否与否两数的大小分成两数的大小分成4种关系,分别对应种关系,分别对应4条指令条指令JL(JNGE):目的操作数小于(不大于等于)源操作数):目的操作数小于(不大于等于)源操作数JNL(JGE):目的操作数不小于(大于等于)源操作数):目的操作数不小于(大于等于)源操作数JLE(JNG):目的操作数小于等于(不大于)源操作数):目的操作数小于等于(不大于)源操作数JNLE(JG):目的操作数不小于等于(大于)源操作数):目的操作数不小于等于(大于)源操作数 以两个带符号数比较的结果作为转移条件以两个带符号数比较的结果作为转移条件JG/JNLESF

27、 OF=0且且ZF=0 大于大于/JGE/JNLSF OF=0或或 ZF=1 大于或等于大于或等于/JL/JNGESF OF=1且且ZF=0 /不大于不等于不大于不等于JLE/JNGSF OF=1或或ZF=1 /不大于不大于3. 比较有符号数大小比较有符号数大小P126 表表3.2中的最后中的最后4条指令条指令 SF,OF,ZF例:例: MOV AL,0FEH ;FEH和和01H为有符号数为有符号数 CMP AL,01H ;有符号数有符号数 0FEH01H JG GREATER ;不转移到不转移到GREATER 测试两数是否相等,均可以用测试两数是否相等,均可以用JE/JZ 或或JNE/JNZ

28、 条件转移指令对标志位无影响。条件转移指令对标志位无影响。例例 求较大值求较大值cmp ax,bx;比较比较AX和和BXjae next;若若AXBX,转移,转移xchg ax,bx ;若若AXBX,交换,交换next:mov wmax,ax如果如果AX和和BX存放的是有符号数,存放的是有符号数,则条件转移指令应采用则条件转移指令应采用JGE指令指令例例 求较大值(另解)求较大值(另解)cmp ax,bx ;比较比较AX和和BXjae nextmov wmax, bx ;若若AXBX,wmaxBXjmp donenext:mov wmax,ax;若若AXBX,wmaxAXdone: 例例 求较

29、大值(另解对比)求较大值(另解对比)cmp ax,bx ;比较比较AX和和BXjbe nextmov wmax, ax ;若若AXBX,wmaxAXjmp donenext:mov wmax,bx ;若若AXBX,wmaxBXdone: 例例 求符号数的最大值求符号数的最大值设数据区设数据区1000H开始的区域中开始的区域中,存放着存放着50个字节的符号数。要求个字节的符号数。要求找出其中最大的一个数并存到找出其中最大的一个数并存到0FFFH单元单元。 MOV BX, 1000H MOV AL, BX MOV CX, 49L1: INC BX CMP AL, BX JGE L2 ;BX-1 B

30、X,转转L2 MOV AL, BX ;BX-150,YEStoo_high, NO 做做X-Y , 溢出溢出overflow ,否则求,否则求|XY|resultMOV AX,X CMP AX,50 JG too_high ;大于转大于转too_highSUB AX,YJO overflow ;溢出转溢出转overflowJNS nonneg ; SF=0转转nonneg NEG AX nonneg: MOV result ,AXtoo_high:overflow:三、循环指令三、循环指令一段代码序列多次重复执行就是循环一段代码序列多次重复执行就是循环8086/8088设计有针对设计有针对CX

31、计数器的计数循环指令计数器的计数循环指令LOOP label;循环指令循环指令;首先;首先CXCX1;然后判断;若;然后判断;若CX0,转移,转移JCXZ label;为为0循环指令循环指令:如果:如果CX0,则转移,则转移label操作数采用操作数采用段内直接短转移段内直接短转移(-128+127) (相对转移)还有还有LOOPZ/LOOPE和和LOOPNZ/LOOPNE两条两条指令指令dec cxjnz label1. LOOP 指令指令格式格式: LOOP 目标标号目标标号 ;CXCX-1,CX 0则循环则循环DEC CX JNZ 目标标号目标标号 Y N CX循环次数循环次数 循环体循

32、环体 CXCXCX- -1 1 CX0 0 1. LOOP 指令指令 MOV CX,NBEGIN: 循环体循环体 DEC CX JNZ BEGIN MOV CX,NBEGIN: 循环体循环体 LOOP BEGIN 例例 LOOP 指令指令例例1: 有一个首地址为有一个首地址为ARRAY的的M字数组字数组,试编写一个程试编写一个程序求出该数组的内容之和序求出该数组的内容之和(不考虑溢出不考虑溢出),并把结果存,并把结果存入入TOTAL中。中。 MOV CX, M;字数组个数送入字数组个数送入CX MOV AX, 0 MOV SI, AX;0送送SISTART_LOOP: ADD AX,ARRAY

33、SI ;将一个数组元素和送入将一个数组元素和送入AX ADD SI, 2;修改数组指针修改数组指针 LOOP START_LOOP ;若若CX不为不为0则重复循环则重复循环 MOV TOTAL, AX;结果送结果送TOTAL循环指令循环指令2.LOOPE/LOOPZ指令指令有附加条件的循环指令有附加条件的循环指令格式格式: LOOPE/LOOPZ 目标标号目标标号 ;CXCX-1,若若CX0且且ZF=1,则循环则循环 3.LOOPNE/LOOPNZ指令指令格式格式: LOOPNE/LOOPNZ 目标标号目标标号 ;CXCX-1,若若CX0且且ZF=0,则循环则循环4.JCXZ指令指令格式格式:

34、 JCXZ 目标标号目标标号;CX=0,则循环则循环 不影响不影响CX的内容的内容例例 LOOPZ 指令指令 在字符串中查找第一个非在字符串中查找第一个非A字符,并将该非字符,并将该非A字符的偏字符的偏移地址存放在移地址存放在BX中;如果找不到,那么使中;如果找不到,那么使BX=0FFFFH。 MOVAL,A DECDINEXT:INC DI CMP AL,DI LOOPE NEXT MOV BX,DI JNE OK MOV BX,1OK: HLT例例 LOOPZ 指令指令 检查检查64kB内存单元的读写性能内存单元的读写性能.为此为此,依次向每个内存单依次向每个内存单元写入指定的数据元写入指

35、定的数据01010101B,然后读出来进行比较然后读出来进行比较,若正确则若正确则转入处理正确的程序段转入处理正确的程序段,否则转入出错处理程序段否则转入出错处理程序段. MOV CX, 0000H ;设置计数器初值设置计数器初值 MOV BX, 0000H ;设置地址指针设置地址指针 MOV AL, 01010101B ;校验码校验码55HAGAIN: MOV BYTE PTR BX, AL INC BX CMP BYTE PTRBX-1, AL LOOPZ AGAIN JCXZ OKERROR: 出错处理出错处理OK: 正确处理正确处理例例 LOOPNE 指令指令 确定字符串的长度。在确定

36、字符串的长度。在STRING为始地址的字符串中搜为始地址的字符串中搜索字符串结束符索字符串结束符$,并将字符串的长度并将字符串的长度(不包括不包括$)放入放入STRLN单元中单元中;如果连续如果连续100个字节单元中无个字节单元中无$符则在符则在STRLN单元中填入单元中填入0FFH。LEA DI, STRINGMOV AL, $MOV CX, 100DEC DIL1:INC DICMP AL, DILOOPNE L1 ;ALDI且且CX-10,JMP L1JZ DONE1;AL=DI JMP DONE1MOV AL,0FFH;cant find$例例 LOOPNE 指令指令JMP DONE2

37、DONE1:MOV BX, 100SUB BX, CX;决定长度决定长度DEC BL;不包括不包括$MOV AL, BLDONE2:MOV STRLN, AL ;存储结果存储结果INT 20H例例 数据块传送(字节)数据块传送(字节)mov cx,400h;设置循环次数:;设置循环次数:1K1024400Hmov si,offset sbuf;设置循环初值:;设置循环初值:SI指向数据段源缓冲区开始指向数据段源缓冲区开始mov di,offset dbuf;DI指向附加段目的缓冲区开始(附加段)指向附加段目的缓冲区开始(附加段)again:mov al,si;循环体:实现数据传送;循环体:实现

38、数据传送mov es:di,al;每次传送一个字节;每次传送一个字节inc si;SI和和DI指向下一个单元指向下一个单元inc diloop again;循环条件判定:循环次数减;循环条件判定:循环次数减1,不为,不为0转移(循环)转移(循环)例例 数据块传送(字)数据块传送(字)mov cx,200h;设置循环次数:;设置循环次数:1K2200Hmov si,offset sbuf;设置循环初值:;设置循环初值:SI指向数据段源缓冲区开始指向数据段源缓冲区开始mov di,offset dbuf;DI指向附加段目的缓冲区开始(附加段)指向附加段目的缓冲区开始(附加段)again:mov a

39、x,si;循环体:实现数据传送;循环体:实现数据传送mov es:di,ax;每次传送一个字;每次传送一个字add si,2;指向下一个(字)单元;指向下一个(字)单元add di,2loop again;循环条件判定:循环次数减;循环条件判定:循环次数减1,不为,不为0转移(循环)转移(循环)循环指令说明:循环指令说明: LOOP退出循环条件是(退出循环条件是(CX)=0 LOOPZ和和LOOPNZ提供了提前结束循环的可能提供了提前结束循环的可能, 不一定要等到不一定要等到(CX)=0才退出循环。才退出循环。 在串中查找字符,查到了,就可退出,在串中查找字符,查到了,就可退出,可用可用LOO

40、PNZ,不相等时继续查找。,不相等时继续查找。比较两串时,当有字符不等,就可退出,说明两字符串不等。比较两串时,当有字符不等,就可退出,说明两字符串不等。可用可用LOOPZ,当相等时继续比较。,当相等时继续比较。执行完执行完 LOOPNZ或或LOOPZ后,根据后,根据ZF标志的值判断结果标志的值判断结果对查找字符,对查找字符,ZF=1,说明找到;否则没有找到。说明找到;否则没有找到。 对串比较,对串比较,ZF=1, 说明两串相等;否则不等。说明两串相等;否则不等。 例:例: 在在string字符串中查找空格字符,串长度为字符串中查找空格字符,串长度为N。用条件转移:用条件转移: JZ MOV

41、CX, N MOV AX, SEG string MOV DS, AX LEA BX,string MOV AL,20H next: CMP AL,BX JZ find INC BX DEC CX JNZ next 未找到处理未找到处理 Find: 找到处理找到处理 修改偏址修改偏址BXYNAL 关键字关键字CX 串长度串长度NDS:BX 串首址串首址判判BX是关键字?是关键字? (CX) (CX)- -1找到处理找到处理未找到处理未找到处理 (CX) = 0 ?YN结束出口结束出口用条件转移:用条件转移: JNZ MOV CX, N MOV AX, SEG string MOV DS, AX

42、 LEA BX, string MOV AL,20H next: CMP AL,BX JZ findINC BX DEC CX JNZ next 未找到处理未找到处理JMP exit find: 找到处理找到处理exit: 结束出口结束出口用循环指令用循环指令:LOOP NZ nextMOV CX, NMOV AX, SEG stringMOV DS, AXLEA BX, string MOV AL,20H next: CMP AL, BX INC BXLOOP NZ nextJZ find未找到处理未找到处理 JMP exit find: 找到处理找到处理exit: 结束出口结束出口DEC

43、BXnext : INC BXCMP AL,BX LOOP NZ nextJZ find未找到处理未找到处理 JMP exit find: 找到处理找到处理exit: 结束出口结束出口思考:思考: 去掉指令去掉指令JMP exit ,程序执行结果会怎样?,程序执行结果会怎样? PUSH F、POPF可否去掉?若要去掉,程序如何修改?可否去掉?若要去掉,程序如何修改? 执行完执行完LOOPNZ后,可否根据后,可否根据CX=0来来判断查找结果判断查找结果? 有人认为有人认为CX=0,即,即说明没找到说明没找到,对吗?,对吗? MOV CX,28H MOV SI,0FFHNEXT1:INC SI C

44、MP BYTE PTR SI,0 LOOPZ NEXT1 ;当;当ZF=1、(、(CX)0循环;循环; 当当ZF=0,或(,或(CX)=0结束循环。结束循环。 JNZ OKK ;当找到非零元素转;当找到非零元素转OKK。 CALL DISPLAY1;当找不到非零元素转;当找不到非零元素转DISPLAY1OKK: CALL DISPLAY2用用LOOPZ和和LOOPNZ指令提供提前结束循环的可能性。指令提供提前结束循环的可能性。有时需要字符串中查找一个字符,找到后可提前结束循环,有时需要字符串中查找一个字符,找到后可提前结束循环,用用LOOPZ、LOOPNZ来处理。来处理。例:例:40个元素构成

45、的数组,找出第一个非零元素。个元素构成的数组,找出第一个非零元素。DISPLAY1 RETDISPLAY2 RET四、子程序指令(调用与返回)四、子程序指令(调用与返回)子程序是完成特定功能的一段程序子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,当主程序(调用程序)需要执行这个功能时,采用采用CALL调用指令转移到该子程序的起始调用指令转移到该子程序的起始处执行处执行当运行完子程序功能后,采用当运行完子程序功能后,采用RET返回指令返回指令回到主程序继续执行回到主程序继续执行演示演示 转移转移指令指令有去无回有去无回 子程序子程序调用需要返回调用需要返回,其中利用堆栈保

46、存返回地址其中利用堆栈保存返回地址1. 子程序调用指令子程序调用指令CALLCALL指令分成指令分成4种类型(类似种类型(类似JMP)CALL label;段内调用、直接寻址;段内调用、直接寻址CALL r16/m16;段内调用、间接寻址;段内调用、间接寻址CALL far ptr label ;段间调用、直接寻址;段间调用、直接寻址CALL far ptr mem ;段间调用、间接寻址;段间调用、间接寻址注意:注意:CALL指令不采用段内直接指令不采用段内直接短短调用方式调用方式1. 子程序调用指令子程序调用指令CALLCALL指令需要保存返回地址:指令需要保存返回地址:n段内调用段内调用入

47、栈偏移地址入栈偏移地址IPSPSP2,SS:SPIPn段间调用段间调用入栈偏移地址入栈偏移地址IP和段地址和段地址CSSPSP2,SS:SPCSSPSP2,SS:SPIP 段内直接调用段内直接调用 目标地址在指令中给出目标地址在指令中给出格式:格式:CALL NEAR PTR DST ; SPSP2 ;断点地址断点地址 SP+1,SPIP 进栈进栈 IPIP+16位偏移量位偏移量 ;子程序子程序 入口地址入口地址 装入装入其中,其中,NEAR PTR可省略可省略 DST子程序名子程序名 或子程序首址或子程序首址 相对调用指令相对调用指令 Disp16机器指令中的位移量(转向地址机器指令中的位移

48、量(转向地址/入口地址和返回地址之差)。入口地址和返回地址之差)。 位移量为位移量为Disp16范围范围-32768+32767H,占有两个字节。,占有两个字节。工作过程如下:工作过程如下:例:例: 过程过程 code SEGMENT ;code段段 CALL subp ;调用调用 指令指令 YYY入栈入栈 ,Disp16 =subp-yyy XXX: PROC NEAR ;过程定义过程定义 RET ;返回返回 subp ENDP code ENDS例:两个数据变量例:两个数据变量X与与Y相乘相乘,子程序可以直接访问子程序可以直接访问模块中的变量。模块中的变量。DATASG SEGMENT X

49、 DW 100 Y DW 10DATASG ENDSCODESG SEGMENT MAIN PROC FAR ASSUME CS:CODESG, DS:DATA SG START: CALL subp RET MAIN ENDPsubp PROC NEAR MOV AX,XMOV BX,Y MUL BXRETsubp ENDCODESG ENDS END START 段内间接调用段内间接调用格式:格式:CALL NEAR PTR DST ; SPSP2 ;断点地址断点地址 SP+1,SPIP 进栈进栈 IP(EA) ;转向子程序入口转向子程序入口 DST REG16 内存单元内存单元(除立即数

50、以外的任何一种寻址方式)(除立即数以外的任何一种寻址方式) 例:例:CALL BX ;EA在在BX中中CALL WORD PTR BX ;EA在字存储单元中在字存储单元中 绝对调用指令绝对调用指令 段间直接调用段间直接调用格式:格式:CALL FAR PTR DST ; SP SP-2其中:其中:DST为另一为另一 SP+1,SP CS ;断点地址断点地址段中某子程序的段中某子程序的 SP SP-2 进栈进栈标号(或入口地标号(或入口地 SP+1,SP IP址址 IP 偏移地址偏移地址 ;子程序入口子程序入口 CS段地址段地址 地址装入地址装入例:例: CALL 1000H:0100H ;IP

51、=0100H CS=1000H CALL FAR PTR SUBPROC 绝对调用指令绝对调用指令例例 : CSEG1 SEGMENT CALL FAR PTR subp;处的处的CS:IP入栈转入栈转subp : CSEG1 ENDSCSEG2 SEGMENT subp PROC RET subp ENDP CSEG2 ENDS 段间间接调用段间间接调用格式:格式:CALL DWORD PTR DST ; SP SP-2 SP+1,SPCS SPSP-2 SP+1,SPIP IP(EA) CS (EA+2)例:例:CALL DWORD PTR DI ;IPDI CSDI+2CALL 指令对标

52、志位无影响。指令对标志位无影响。 实际应用中,实际应用中,较多采用直接寻址方式较多采用直接寻址方式,DST为为调用的子程序调用的子程序(过程过程)名。名。 如:如:CALL NEAR PTR 子程序子程序(过程过程)名名CALL FAR PTR 子程序子程序(过程过程)名名2. RET( Reture from procedure)返回返回 RET返回指令返回指令放在子程序的末尾放在子程序的末尾使子程序在功能完成后返回调用程序继续执行。使子程序在功能完成后返回调用程序继续执行。*为能准确返回为能准确返回 ,返回指令类型与调用指令类型相对应。,返回指令类型与调用指令类型相对应。段内返回段内返回段

53、间返回段间返回 段内带立即数返回段内带立即数返回段间带立即数返回段间带立即数返回在子程序调用时,返回地址入栈在子程序调用时,返回地址入栈 返回时:将返回地址出栈返回时:将返回地址出栈 (IP)(段内或段间)。)(段内或段间)。 (CS)(段间)。)(段间)。段内返回:段内返回: 当过程被定义为当过程被定义为NEAR时时格式:格式: RET; 机器码:机器码: C3H或者或者C2H (IP)(SP+1),(SP) (SP)(SP)+2段间返回:段间返回: 当过程被定义为当过程被定义为FAR时时格式:格式: RET; 机器码:机器码: CBH或或CAH (IP)(SP)+1,(SP) (SP)(S

54、P)+2 (CS)(SP)+1,(SP) (SP)(SP)+22. RET 返回指令返回指令可归纳为可归纳为: RET ; 近(近(NEAR) IP断点(偏)出栈断点(偏)出栈 SP SP+2 远(远(FAR) CS:IP 断点出栈断点出栈 SP SP+42. RET 返回指令返回指令 RET n 带立即数返回带立即数返回 ; RET SPSP+nn16位立即数,或数值表达式,称为弹出位立即数,或数值表达式,称为弹出(POP)值。值。 例:例: ;子程序;子程序 MOV AX, N1 PUSH AX PROG-A PROC NEAR MOV AX, N2 PUSH AX RET 4 CALL

55、PROG-A PROG-A ENDP MOV SUM,AX 例例 十六进制转换为十六进制转换为ASCII码的子程序码的子程序;子程序:;子程序:将将DLDL低低4 4位的一位位的一位1616进制数进制数转换转换成成ASCIIASCII码码htoaschtoascprocprocand dl,0fhand dl,0fh;只取;只取DLDL的低的低4 4位位or dl,30hor dl,30h;DLDL高高4 4位变成位变成3 3cmpcmp dl,39h dl,39h;是;是0 09 9,还是,还是0Ah0Ah0Fh ?0Fh ?jbe htoendjbe htoend;是;是0 09 9,转移

56、,转移add dl,7add dl,7;是;是0Ah0Ah0Fh0Fh,加上,加上7 7htoendhtoend: : retret;子程序返回;子程序返回htoaschtoascendpendp;主程序:调用;主程序:调用子程序子程序mov dl,28hcall htoasc例例:学习使用学习使用 段内、段间直接调用指令的使用及堆栈情况段内、段间直接调用指令的使用及堆栈情况主程序主程序 MAIN在一个代码段中在一个代码段中子程序子程序 PRO-A PRO-B PRO-C 在另一个代码段在另一个代码段程序调用关系程序调用关系:另一个代码段另一个代码段 PRO-A PRO-B CALL near

57、 ptr PRO-B CALL near ptr PRO-C (IP)=2500H (IP)=4000H CALL near ptr PRO-C RET (IP)=3700H PRO-C RET RET (SP)=0100H MAINCALL far ptr PRO-A(CS)=0500H (IP)=1000H 栈顶TOS栈顶TOS0100H0100H0500H0500H1000H1000H00FCH00FCH0500H0500H1000H1000H2500H2500H00FAH00FAHSPSP(1)(1)SPSPTOSTOSSPSP(2)(2)(3)(3)TOSTOS4000H4000H2

58、500H2500H1000H1000H0500H0500H00F8H00F8H4000H4000H2500H2500H1000H1000H0500H0500H4000H4000H2500H2500H1000H1000H00FAH00FAH0500H0500H00FCH00FCHTOSTOSTOSTOSTOSTOSSPSPSPSPSPSP(4)(4)(5)(5)(6)(6)4000H4000H3700H3700H1000H1000H0500H0500H4000H4000H3700H3700H1000H1000H0500H0500H4000H4000H3700H3700H1000H1000H050

59、0H0500H00FAH00FAH00FCH00FCH0100H0100HTOSTOSSPSPSPSPSPSP(9)(9)(8)(8)(7)(7)TOSTOSTOSTOS堆栈情况:堆栈情况: 操作数操作数执行操作执行操作符号地址符号地址 (SHORT)(IP) (IP)当前当前+ 8位位移量位位移量符号地址符号地址 ( NEAR属性属性)(IP) (IP)当前当前+ 16位位移量位位移量reg (16位)或位)或 mem ( DW类型类型 )(IP) ( reg ) 或或(IP) (mem)符号地址符号地址 ( FAR属性属性)(IP) 符号地址的偏值符号地址的偏值 (CS) 符号地址的段值符

60、号地址的段值mem ( DD类型类型 )(IP) ( mem ), (CS) (mem+2 ) 当前当前IP的值为控制转移指令下一条指令的偏移地址。的值为控制转移指令下一条指令的偏移地址。 位移量位移量 = 符号地址的偏移量符号地址的偏移量 - 当前当前IP的值。的值。 符号地址(目标地址)符号地址(目标地址)= 当前当前IP的值的值 + 位移量位移量 指令格式:指令格式: JMP 操作数操作数 由由CS是否变化、以及操作数类型决定情况如下表是否变化、以及操作数类型决定情况如下表转移方式转移方式CS操作数操作数跳转范围跳转范围段内直接短段内直接短 方方 式式不变不变符号地址符号地址(SHORT

温馨提示

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

评论

0/150

提交评论