资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,1,程序是指令的集合,指令代码在内存中,顺序存放,但指令的执行不一定是顺序的,在,Pentiun,系列中,指令的地址由,CS,中的选择子和,EIP,两个寄存器决定。,CS,和,EIP,两寄存器的内容决定了程序的流程,程序顺序执行和非顺序执行的概念,1 顺序执行,CPU,取来一条指令后,自动将,IP,的值加上该指令的字节数,,使,IP,顺序指向下一条指令,,CPU,取来紧接着的指令执行。,(此时,IP,的变化由,CPU,内部的硬件自动完成),2,通过,控制转移指令改变,CS,和,IP,的值,使程序产 生分支、调用结构。,例:比较(,AX)、(BX),的大小,将大数存于(,max),单元。,CMP AX,BX,JG,great,XCHG AX,BX,great:MOV max,AX,2 非顺序执行,3,转移指令的实质:改变,IP(,或,CS),的内容。,所有转移指令不会影响标志位。,分为,无条件转移,和,条件转移,两种。,1.转移指令,关于转移指令和调用指令的寻址,4,(1)无条件转移指令,-JMP,本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。根据设置,CS,、,IP,的方法,,JMP,指令分成,4种情况,。,段内,直接转移:,指令中给出的,8/16,位的位移量,加到,IP,。,CS,保持不变。,段内,间接转移:,REG/MEM,中的,16,位偏移地址,送,IP,。,CS,保持不变。,段间,直接转移,指令中给出的,16,位的段和,16,位的偏移地址,送到,CS,和,IP,。,段间,间接转移,MEM,中给出的,16,位的段和,16,位的偏移地址,送到,CS,和,IP,。,5,转移的目标地址由指令直接给出。,段内,转移,故转移后,CS,内容保持不变,只改变,IP,的值。,汇编语言中格式 位移量 转移范围,JMP,(,SHORT,),OPRD,8位 -128+127,JMP,(,NEAR PTR,),OPRD 16,位 -,32768,+,32767,OPR-,在汇编语言中使用符号地址。,在,机器语言,中,是一个,相对于当前,IP,的位移量,:,例:,JMP LPI ;,转向,LPI,JMP BBB;,转向,BBB,段内直接转移,6,JMP NEXT,指令本身占有两个字节,操作码占一个字节;8位位移量占有一个字节,=1050,H-1000H,源程序:,条件转移指令:,JMP,next,.,.,next:,MOV AL,03H,E9,50,H,.,.,B0,03,H,.,.,3000:1000,H,3000:1050,H,(,IP),当前,D,8,=50,H,(,IP)=(IP),当前+,D8,内存,例:代码段内有一条无条件转移指令,执行操作:(,IP)(IP),当前,+,D,8,qqq:,7,JMP SHORT OPR,8位位移量,D,8,的范围在(-128 127)之间,否则出错,JMP NEAR PTR OPR,指令本身占有三个字节,位移量为,D,16,,,占有两个字节,范围:-32768+32767,H。,可以转移到段内的任一位置。,8,段内间接转移,转移的目标地址由,寄存器,或,存储单元,的内容给出。,例,1,:,JMP SI,若指令执行前(,SI)=1200H,,则指令执行后,(,IP)=1200H,于是转向代码段的偏移地址,1200H,处执行。,9,例,2,:,JMP BX+DI,设指令执行前:,(,DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H,;,则指令执行后:(,IP)=2350H,在汇编语言中,段内间接寻址通常写成:,JMP,WORD PTR,BX+DI,表示所取得的目标地址是一个字。(只改变,IP),10,段间直接转移,在指令中直接给出要转移到的目的段地址和偏移地址。,例:,JMP2000:1000H,执行时,(,IP)1000H,(CS)2000H,注:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符,FAR PTR,。,例:,JMPFAR PTR far_label,其中的,far_label,为远类型的标号。,11,例:,C1 SEGMENT,JMP FAR PTR next_prog,C1 ENDS,C2 SEGMINT,next_prog:,C2 ENDS,FAR,远属性标号,标号与控制转移指令不在同一代码段中。,12,转移的目的地址,(,段和偏移,),在两个相邻的,字存储单元,中。例如:,JMPDWORD PTRSI,设指令执行前:(,DS)=4000H,(SI)=1212H,(41212H)=1000H,(41214H)=4A00H,则指令执行后:(,IP)=1000H,(CS)=4A00H,于是转到4,B000H,处开始执行指令。,例中的,DWORD PTR,表示转移地址是一个双字。,段间间接转移,13,4000,1212,+),41212,DS,SI,0,0,10,00,4,A,41212,41213,41214,41215,1000,4,A00,IP,CS,段间间接转移操作示意图,11111111,11101,100,JMP DWORD PTR SI,的机器码,DS:SI,14,条件转移指令根据标志位的状态或比较的结果来决定是否进行分支转移。,格式:,J,XX,label,;,xx,为条件名称缩写,8086,指令的转移范围为,-128+127,字节。,Pentiun,最大到,-32768,+,32767,(2)条件转移指令,-J,XX,条件转移指令可实现程序的条件分支。,15,以单个状态标志作为转移条件助记符转移条件,助记符,转移条件,助记符,转移条件,JZ/JE,ZF=1,JNZ/JNE,ZF=0,JS,SF=1,JNS,SF=0,JO,OF=1,JNO,OF=0,JP/JPE,PF=1,JNP/JPO,PF=0,JC,CF=1,JNC,CF=0,以,CX,的值为0作为转移条件,助记符,转移条件,JECX,ECX=0,JCXZ,CX=0,按转移条件不同,条件转移指令可以分为四大类:,16,助记符,转移条件,JA/JNBE,CFZF=0,高于/,不低于等于,JAE/JNB/JNC,CF=0,高于或等于/,不低于,/无进位,JB/JNAE/JC,CF=1,低于,/不高于等于/有进位,JBE/JNA,CFZF=1,低于或等于,/不高于,以两个无符号数比较的结果作为转移条件,以两个带符号数比较的结果作为转移条件,助记符,转移条件,JG/JNLE,(,SFOF)ZF=0,大于/,不小于等于,JGE/JNL,SFOF=0,大于或等于/,不小于,JL/JNGE,SFOF=1,小于,/不大于等于,JLE/JNG,(,SFOF)ZF=1,小于或等于,/不大于,17,2 条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移,,注意几点:,1 所有条件转移指令只能用段内直接寻址方式,都是相对转移,范围(-128+127)或(-,32768+32767,),。,3 条件转移指令不影响标志位,18,条件转移指令应用举例,:,例1:以十六进制数形式显示,BX,中的内容。,MOVBX,1234H,MOVCH,4 ;CH,做循环计数器,ROT:MOVCL,4;CL,做移位计数器,ROLBX,CL;,将最高4位移到低4位,MOVAL,BL,ANDAL,0FH;,取出低4位,ADDAL,30H;,转换为,ASCII,码,CMPAL,39H;,与,9,比较,JBE DISP,;,若(,AL),9,则转显示,ADDAL,7;,若(,AL),9,再加7转为,A-F,DISP:,MOVDL,AL,;(DL),字符,MOVAH,2,INT21H,;,显示输出,DECCH;4,个十六进制数显示完否?,JNZROT,;,没有,循环,MOVDL,48H,;H,MOVAH,2,INT21H,;,最后显示,H,19,ASCII,码,美国标准信息交换代码,20,例,2,:在,8000H,开始的长度为,1000,字节的字符串中查找,S,,若找到,把其偏移地址记录在,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,21,2.,子程序,调用和返回指令,特点,调用子程序时,,IP(CS),的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到,IP(CS),。,子程序执行结束后一般均要返回调用程序。,一次定义,多次调用;,可带参数调用,以完成不同的功能。,子程序(过程,),一段具有特定功能的,供其它程序调用的公用程序,两条相关指令:,子程序调用指令,CALL,子程序返回指令,RET,优点,程序代码短,结构清晰,便于编程、调试、修改和阅读。,22,NEAR,:调用指令,CALL,与过程在同一个代码段中,过程程序中具有独立功能的部分编写成独立程序模块。,过程定义格式:,过程名,PROC,类型,RET,过程名,ENDP,CALL,指令和,RET,指令都不影响条件码。,过程有两种类型:按过程与调用语句间的位置,FAR,:调用指令,CALL,与过程不在同一个代码段中,23,例:,NEAR,类型过程,code1 SEGMENT ;code,段,CALL subp,;,调用 指令,YYY:,MOV BX,AX,subp,PROC NEAR ;,过程定义,RET ;,返回,subp ENDP,code1 ENDS,24,一般格式:,CALL,sub,;,sub,为子程序的入口,子程序调用有两类。,段内调用 段间调用,段内直接调用,子程序的偏移地址直接由,CALL,指令给出。,格式:,CALL NEAR PTR DST,CALL,执行时:首先将,当前,IP,内容(返回地址),压栈,然后把机器指令中给出的位移量加到,IP,上,转到子程序的入口处去执行。,注:,返回地址-,CALL,指令的,下,一条指令的首地址。,(1)调用指令,CALL,25,例:,段内直接调用,code1 SEGMENT ;code,段,CALL subp,;,调用 指令,YYY:,MOV BX,AX,subp,PROC NEAR ;,过程定义,RET ;,返回,subp ENDP,code1 ENDS,问题:本例中的返回地址?,26,子程序的偏移地址在寄存器或存储器中,。,格式:,CALL,mem16/reg16,CALL,执行时,它首先将,IP,内容压栈,然后把指定的寄存器,/,存储器的内容送入,IP,。,例:,CALLAX ;,调用地址由,AX,给出,CALLWORD PTRSI;,调用地址由存储器给出,段内间接调用,27,CALL,IP,H,IP,L,代码段,数据段,对于,CALL WORD PTR SI,这条指令,若:,(,DS),=,8000H,,,(SI),=,1200H,则指令操作图示如下。,81200,H,81201,H,28,子程序的段地址和偏移地址直接由,CALL,指令给出。,格式:,CALL,FAR PTR DST;,执行操作:,SP(SP)-2,(,SP)-1,(SP)-2)(CS);,返回地址的段地址入栈,SP(SP)-2,(,SP)-1,(SP)-2)(IP);,返回地址的偏移地址入栈,(IP)DST,偏移地址,(,CS)DST,段地址,段间直接调用,29,CSEG1 SEGMENT,CALL FAR PTR PPP;AAA,处的,CS:IP,入栈,转,PPP,AAA:,CSEG1 ENDS,CSEG2 SEGMENT,PPP PROC FAR,RET,PPP ENDP,CSEG2 ENDS,段间直接调用举例,30,子程序的段和偏移地址为存储器
展开阅读全文