您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第三章汇编程序的设计方法
第三章汇编程序的设计方法§3-1顺序程序设计一、乘法指令1、无符号数乘法指令MUL格式:MUL源(mem、reg)功能:累加器(AL/AX)内容与源操作数相乘,结果存于AX/DX+AX。有符号数乘法无符号数乘法字节乘法AL源×AX字乘法AX源×DXAX隐含寻址例:MULBX;AX×BX的积存于DX+AXMULBYTEPTR[SI];AL×SI间接寻址的mem单元中的数据,乘积存于AX说明:运算结果影响CF、OF,对AF、PF、SF、ZF未定义若乘积的AH/DX≠0,则CF=OF=1,说明AH/DX中有数据否则,CF=OF=0。2、有符号数乘法指令IMUL说明:除了对象是有符号数,其余思路、格式等与MUL相同。例:计算AL=FEH,CL=11H的积。MULCLIMULCL注:运算结果影响CF、OF。CF=OF=0,说明积的高半部分是符号扩展;CF=OF=1,说明积的高半部分有有效数据;另:同样两个数,用MUL、IMUL指令后,运算结果不同。∴无符号数用MUL,有符号数用IMUL看书例P81结果:FEH×11H=10DEH,CF=OF=1结果:FEH×11H=FFDEH,CF=OF=0二、除法指令看书图,对比乘法指令学习。三、扩展指令1、字节转换为字CBW功能:按AL的符号位扩展到整个AH中。字节除法之前,用该指令产生双字节被除数。例:MOVAL,24HCBW例:MOVAL,84HCBW规则:当AL<80H时,AH=00HAL≥80H时,AH=FFH结果:AX=0024H结果:AX=FF84H2、字转换为双字CWD功能:按AX的符号位扩展到整个DX中。字除法之前,用该指令产生双字被除数。规则:当AX<8000H时,DX=0000HAX≥8000H时,DX=FFFFH四、综合程序举例看书P84例§3-2分支程序设计分支程序:根据不同条件转向不同程序段执行的结构。转移指令一、无条件转移指令JMP1、直接转移指令(1)段内直接转移格式:JMP标号说明:标号——也称符号地址,它表示转移的目的地。例:JMP2500H无条件转移指令条件转移指令段内转移段间转移直接间接直接间接转去执行CS:2500H单元的指令(2)段间直接转移格式:功能:将指令操作码后连续两个字作为立即数,用来修改CS:IP的内容,然后转向新的CS:IP指向的地址。例:JMP8000H:1200H操作码00120080IPCS计算出物理地址=81200H,程序转向从该单元开始的指令继续执行2、间接转移指令(1)段内间接转移说明:转移地址为指令指定的16位reg或mem,可采用各种寻址方式。格式:JMP目标例:JMPBXJMPWORDPTR[BX+DI](2)段间间接转移例:JMPDWORDPTR[BX]功能:转向[BX]指向的32位存储器地址,将连续4个单元的内容低字送IP,高字送CS。,程序转向新的CS:IP指向的单元存储的指令继续执行。总结:区分段内段间:看指令中给出的地址是几个一个地址(16位)——段内二个地址(32位)——段间区分直接间接:看指令中的地址是直接给出(立即数/标号),还是间接放在寄存器或存储器中。二、条件转移指令格式:JcondOPRD功能:当满足一定的条件时,转移到指定的地址,否则,将顺序执行下条指令。说明:当条件cond成立,(IP)+偏移地址→IP当条件cond不成立,(IP)+2→IP所有条件转移指令都是直接寻址方式的短转移。1、简单的条件转移指令仅根据一个可测试标志位实现转移的指令。注:G——大于L——小于E——等于N——不A——高于B——低于指令助记符功能标志设置JE/JZ相等/等于0转移ZF=1JNE/JNZ不相等/不等于0转移ZF=0JCJNCJSJNSJOJNOJP/JPEJNP/JPO表3—1简单的条件转移指令2、无符号数条件转移指令3、符号数条件转移指令三、分支程序举例看P96例3.7画出程序流程图指令助记符功能标志设置JB/JNAE低于/不高于等于转移CF=1且ZF=0JNB/JAE不低于/高于等于转移CF=0或ZF=1JA/JNBE高于/不低于等于转移CF=0且ZF=0JNA/JBE不高于/低于等于转移CF=1或ZF=1表3—2无符号数条件转移指令§3-3循环程序设计一、基本结构循环一般由4部分构成:1、循环初态(初始化/准备)循环工作部分初态循环结束条件初态2、循环体:就是要求重复执行的程序段部分,是循环程序的主体。(设置地址指针、某些标志位等,使某些寄存器清0)(一般置以循环次数,eg:上例中CX=8)3、循环的修改:修改结束条件。常见的就是计数的,当循环了一定次数后,就结束循环,在微机中,常用一个内部寄存器,作为计数器,通常给这个计数器赋予循环次数初值,每循环一次令其减1,当计数器减为0时,就停止循环。4、循环的控制:每循环一次,就检查循环结束条件,满足条件就停止循环,顺序向下执行。否则,跳转到循环主体的开始,继续循环。二、重复控制指令1、格式:LOOPshort—lable说明:(1)指令执行:CX-1→CX,若CX≠0则程序跳转到short—lable指向的指令执行;否则退出循环。(2)循环次数在CX中。(3)转移的目标地址是以当前IP为中心的-128~+127的范围内,故称为短/近转移。∴LOOP=DECCXJNZshort-lable2、LOOPZ/LOOPE指令格式同LOOP指令3、LOOPNZ/LOOPNE指令格式同LOOP指令ZF=1或CX=0计数非0且结果非0循环LOOPNZ/LOOPNEshort—lableZF=0或CX=0计数非0且结果为0循环LOOPZ/LOOPEshort—lableCX=0计数非0循环LOOPshort—lable结束条件功能格式三、循环程序设计方式及举例1、计数控制的循环程序例:编写程序,统计字变量W中有多少位1,并将结果存入字节变量N中。最高位=1?N+1Y修改判断结束NYNEND开始MOVN,0MOVCX,16AGAIN:SHLW,1JNCNOINCINCNNOINC:LOOPAGAIN例:书P97例3.10MOVCX,4MOVSI,0ANDAX,AXAGAIN:MOVAL,BYTEPTRX[SI]ADCAL,BYTEPTRY[SI]MOVZ[SI],ALINCSILOOPAGAINMOVZ[SI],0RCLZ[SI],1ret§3-4串处理程序设计规定:源串的偏移地址由SI,段地址取自DS;目的串的偏移地址由DI,段地址取自ES。源串和目的串的偏移地址指针的移动方向由方向标志DF确定。DF=0,SI、DI增量DF=1,SI、DI减量一、方向标志修改指令1、置1指令格式:STD功能:将DF=1,则串操作时SI/DI的内容自动减量。2、清0指令格式:CLD功能:将DF=0,则串操作时SI/DI的内容自动增量。二、串操作指令1、串传送指令(1)格式:MOVS目的串,源串MOVSB/MOVSW功能:从DS:SI指向的源操作数中取一字节/字,传送到ES:DI所指向的目的操作数中,并根据方向标志DF对SI/DI进行增量/减量修改,以指向下一个字节/字。例:MOVSBMOVSWMOVSES:BYTEPTR[DI],DS:[SI](2)重复前缀REP格式:REPMOVS/MOVSB/MOVSW功能:每完成1次串传送,CX减1,继续重复串传送,直到CX=0为止。执行:a、CX-1→CX;b、如CX=0则退出REP,否则继续执行;c、执行其后的MOVS串指令;d、重复a~c。将(DS:[SI])→ES:[DI],且SI+1,DI+1将(DS:[SI])→ES:[DI](DS:[SI+1])→ES:[DI+1],且SI再加1,DI再加1该指令前期准备:a、将数据段中的源串首址送入SI;b、将(将要存放数据串的)附加段中的目的串首址送入DI;c、串长度送CX中;d、建立方向标志。例:自1000H地址开始有一字符串,串长36H个字节,编程将该串传送到1200H地址开始的存储区中。CLD,令DF=0STD,令DF=1MOVSI,1000HMOVDI,1200HMOVCX,36HCLDREPMOVSBret上述程序执行完后,(SI)=?(DI)=?(CX)=?2、串比较指令(1)格式:CMPS目的串,源串CMPSB/CMPSW功能:取DS:SI指向的源串的一字节/字,减去ES:DI所指向的目的串的一字节/字,不回送结果,只影响标志位,并同时修改SI、DI以指向下一个字节/字。(2)当相等/为零时重复串操作格式:REPE/REPZCMPS/CMPSB/CMPSW功能:CX=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则继续执行;(3)当不相等/不为零时重复串操作格式:REPNE/REPNZCMPS/CMPSB/CMPSW功能:CX=0或ZF=1(即某次比较的结果两个操作数相等)时退出,否则继续执行;3、串扫描指令(1)格式:SCAS目的串SCASB/SCASW功能:用AL/AX中的内容减去ES:DI所指向的目的串中的一字节/字,不回送结果,只影响标志位,并同时修改DI以指向下一个字节/字。(2)格式:REPE/REPZREPNE/REPNZ功能:注:源串隐含SCAS/SCASB/SCASWMOVAX,8000HMOVES,AXMOVDI,1000HMOVCX,32HCLDMOVAL,12HREPNESCASBDECDIMOVBX,DI例:从8000H:1000H开始存放将一个50字节的字符串,从中找出数据12H,将存放此数据的单元的偏移地址存到BX4、从源串中取串指令格式:LODS/LODSB/LODSW功能:从DS:SI指向的源串中取一个字节/字,送到AL/AX,同时修改SI指向下一字节/字。5、往目的串中存串指令格式:STOS/STOSB/STOSW功能:将AL/AX中的一字节/字存入到ES:DI指向的目的串去,同时修改DI指向下一字节/字。注:以上存、取串指令一般不加重复前缀,不影响标志位。例:将存储器中一个50字节的非零数组中的正、负数分开,数组存放的首地址为1000H,存放正、负数的首址是2000H、3000H。注:目的串隐含注:源串隐含CLDMOVSI,1000HMOVDI,2000HMOVBX,3000HMOVCX,32HLOOP1:LODSBTESTAL,80HJNZLLSTOSBJMPLRLL:XCHGBX,DISTOSBXCHGDI,BXLR:LOOPLOOP1ret§3-5子程序设计一、子程序的概念子程序是完成确定功能的独立的程序段,它可以被其他程序调用,在完成确定功能后,又可自动返回到调用程序处。程序X…………………..调用程序Y程序Y…………………..调用返回X是Y的主程序,Y是X的子程序调用程序Z程序Z…………………..调用返回二、参数传递主程序在调用子程序时,应为子程序提供运算所需的初始数据,而子程序返回时,也将运算结果提供给主程序,这些问题称为主程序与子程序间的参数传递。1、寄存器法:把参数放在CPU内部的reg中,通过reg来传递相应的信息。2、堆栈法:3、参数赋值法:三、子程序调用指令与返回指令1、调用指令CALL主程序子程序入口参数出口参数直接间接段内段间段内段间(1)直接段内调用格式:CALLNEAR—PROC(NEAR型过程的符号地址)执行:a、IPH→[SP-1]IPL→[SP-2];b、SP-2→SP;c、被调用子程序的16位偏移量→IP。(2)直接段间调用格式:CALLFAR—PROC(FAR型过程的符号地址/程序名)执行:a、CSH→[SP-1]、CSL→[SP-2]IPH→[SP-3]、IPL→[SP-4];b、SP-4→SP;c、被调用子程序所在代码段段基址→CS被调用子程序在所在代码段内的偏移量→IP。例:CALL3000H:2100H保护断点保护断点(3)间接段内调用入口地址由16reg/16men提供格式:CALL16reg/1
本文标题:第三章汇编程序的设计方法
链接地址:https://www.777doc.com/doc-2182345 .html