汇编语言程序设计05IRVINE链接库与条件处理.ppt
汇编语言程序设计,_05_IRVINE函数库与条件处理大连理工大学软件学院_朱明2009年5月31日_ V1.1,第四章提问,当使用LOOP执行作为循环时,哪一个寄存器作为计数器使用?当该寄存器的值为多少时LOOP不再跳转?以下几段代码分别是什么形式的寻址?堆栈中数据的操作原则是什么?PUSHFD、PUSHAD分别对堆栈执行什么操作?在程序执行时的调用过程使用什么指令?该指令会将什么参数压入到堆栈中?,汇编语言程序设计-朱明,2,moval,value1,movesi,OFFSET value1moveax,esi,movesi,2moveax,valueesi,movesi,4movebx,value+esi,前章回顾,前章中的所讲述的部分内容 LOOP循环指令和JMP跳转指令 操作数间接寻址和变址操作数寻址 irvine链接库中少部分过程的介绍 前章中还讲述了和过程相关的内容 过程的定义、过程的书写方法 过程的调用、过程的返回 过程调用中参数的传递方法 IA-32处理器对于堆栈操作相关指令 过程化的程序设计方法和流程,汇编语言程序设计-朱明,3,前章回顾,外部链接库,IRVINE以外部链接库的形式存在 在链接阶段,链接库中的内容和源代码经过汇编生成的目标文件被链接在一起(可以通过反汇编观察)IRVINE链接库提供了大量常用的过程 DumpRegs:以十六进制的形式显示个寄存器的值以及EFLAGS中的各个标志位的值 WriteString:在标准输出上输出以空字符结尾的字符串 WriteInt:在标准输出上输出10进制的32位有符号数 ReadInt:从键盘读取10进制的32位有符号数 Clrscr:清除标准输出的内容并重新定位光标 Clrf:在标准输出上输出回车符和换行符,汇编语言程序设计-朱明,4,Section 1,问题处理,整数求和问题:写一个程序,要求用户从键盘输入3个32位整数,保存在数组中,并计算数组内元素的和并显示在屏幕上,汇编语言程序设计-朱明,5,代码框架,;-main PROC;-exitmain ENDP,;-GetNum PROC;-exitmain ENDP,;-ArraySum PROC;-exitmain ENDP,;-DispSum PROC;-exitmain ENDP,Section 1,;-main PROC;-exitmain ENDP,;-GetNum PROC;-exitmain ENDP,;-ArraySum PROC;-exitmain ENDP,;-DispSum PROC;-exitmain ENDP,完善代码,问题处理,main过程,汇编语言程序设计-朱明,6,main PROCcallClrscrmovesi,OFFSET arrsmovecx,LENGTHOF arrscallGetNumcallArraySumcallDispSumexitmain ENDP,Section 1,TITTLE.;Str1BYTE“Input a Signed Integer:”,0Str2BYTE“The Sum of Integers is:”,0arrsDWORD 3 DUP(?),;-GetNum PROC;-exitmain ENDP,;-ArraySum PROC;-exitmain ENDP,;-DispSum PROC;-exitmain ENDP,问题处理,GetSum过程,汇编语言程序设计-朱明,7,;-GetNum PROC;-pushadmovedx,OFFSET Str1L1:callWriteStringcallReadIntcallCrlfmovesi,eaxaddesi,4loopL1popadretGenNum ENDP,;-main PROC;-exitmain ENDP,;-ArraySum PROC;-exitmain ENDP,;-DispSum PROC;-exitmain ENDP,Section 1,问题处理,ArraySum过程,汇编语言程序设计-朱明,8,;-ArraySum PROC;-pushadmoveax,0L1:addeax,esiaddesi,4loopL1movesi,eaxpopadretArraySum ENDP,;-main PROC;-exitmain ENDP,;-GetNum PROC;-exitmain ENDP,;-DispSum PROC;-exitmain ENDP,Section 1,问题处理,DispSum过程 借用irvine链接库可以方便的处理问题,汇编语言程序设计-朱明,9,;-DispSum PROC;-pushedxmovedx,OFFSET Str2callWriteStringcallWriteIntcallcrlfpopedxretDispSum ENDPEND main,;-main PROC;-exitmain ENDP,;-ArraySum PROC;-exitmain ENDP,;-ArraySum PROC;-exitmain ENDP,Section 1,外部链接库,除了前面用到的DumpRegs、WriteString、Clrf、ReadInt、Clrscr之外,还有以下常用的过程:以制定的时间间隔将程序暂停Delay 将时间的值放入EAX中,延时时间为毫秒 在屏幕上显示一段内存的内容DumpMem 以16进制的形式在标准输出上输出以ESI为起始地址、以ECX为元素数目、以EBX为元素尺寸的内存单元,汇编语言程序设计-朱明,10,moveax,10000callDelay,movesi,OFFSET arr1movecx,LENGTHOF arr1movebx,TYPE arr1callDumpMem,Section 1,外部链接库,从标准输入读取一个字符ReadChar 从标准输入读取一个字符并保存在AL寄存器中 从标准输入读取32位16进制数ReadHex 从标准输入中读取一个32位的16进制整数,并保存在EAX寄存器中,但不会进行错误检查,汇编语言程序设计-朱明,11,charBYTE?callReadCharmovchar,al,hexsDWORD?callReadHexmovhexs,eax,Section 1,外部链接库,从标准输入读取一个字符串ReadString 从标准输入中读取一个字符串,在用户按下回车时结束,返回后EAX保存着字符串字节数使用前应设定EDX指向保存字符串的数组的偏移地址,ECX为要读入的字符串的最大长度,汇编语言程序设计-朱明,12,str1BYTE50 DUP(?)strlnDWORD?movedx,OFFSET str1movecx,SIZEOF str1callReadStringmovstrln,eax,Section 1,外部链接库,在标准输出上输出一个等待提示信息WaitMsg 该过程用于在屏幕上输出一条等待信息“Press any key to continue”在标准输出上以二进制形式输出整数WriteBin 该过程在屏幕上以分组的二进制的形式显示eax的整数 分组显示是指每组以4个二进制的方式显示,例如,汇编语言程序设计-朱明,13,callWaitMsg,Section 1,moveax,12345678hcallWriteBin,0001 0010 0011 0100 0101 0110 0111 1000,外部链接库,在标准输出上输出32位无符号整数WriteDec 该过程用于将EAX中的32位无符号整数的显示 在标准输出上以16进制的形式输出WriteHex 该过程在屏幕上以16进制形式显示EAX中的32位无符号整数的内容,该过程会在使用0补充32位显示 则显示的内容为,汇编语言程序设计-朱明,14,moveax,295callWriteDec,Section 1,moveax,1234hcallWriteHex,00001234,外部链接库,输出内容颜色控制的过程SetTextColor 设置当前输出字符的颜色以及背景颜色 字的颜色为最低字节的低4位,背景颜色为高4位 例如显示蓝底黄字的调用方式则为 设置后,字符将按照该颜色显示,汇编语言程序设计-朱明,15,Section 1,moveax,1EhcallSetTextColor,课堂练习,显示与循环程序外部函数库练习 调用SetTextColor过程设置颜色 调用WhiteChar过程显示字符“A”每行1种颜色背景,共计16行 每行16个字符,16种颜色,如图 可能需要使用PUSH和POP指令 使用LOOP指令作循环,汇编语言程序设计-朱明,16,课堂练习,逻辑运算,ALU能进行哪些运算?算术运算:ADD、SUB、MUL、IMUL 逻辑运算:AND、OR、XOR、NOT 上述四种逻辑运算的真值表分别是什么?MASM环境下四种指令的操作数,汇编语言程序设计-朱明,17,Section 2,ANDreg,regreg,memreg,immmem,regmem,imm,ORreg,regreg,memreg,immmem,regmem,imm,XORreg,regreg,memreg,immmem,regmem,imm,NOTregmem,逻辑运算,四种运算对于标值位的影响 TEST指令 与AND类似,但是不改变目的操作数而只影响标志位 CMP指令 与SUB类似,但是不改变目的操作数而只影响标志位 CMP指令对于标志位的影响与执行减法操作相同 逻辑运算有助于改变CPU标志位,汇编语言程序设计-朱明,18,AND复位 OF和CF可能设置 SF、ZF和PF,OR复位 OF和CF可能设置 SF、ZF和PF,XOR复位 OF和CF可能设置 SF、ZF和PF,NOT无任何影响,Section 2,条件跳转,任何复杂的条件结构都可以转换为基本的条件跳转 允许的条件跳转指令标志位判断 JC/JNC:如果进位标志位有效/无效则跳转 JZ/JNZ:如果零标值位有效/无效则跳转 JO/JNO:如果溢出标值位有效/无效则跳转 JS/JNS:如果溢出标值位有效/无效则跳转 JP/JNP:如果奇偶标值位有效/无效则跳转,汇编语言程序设计-朱明,19,条件设置指令条件判断指令 标号标号,cmpal,0jzL1;如果ZF=1则跳转L1:;跳转的目标L1,Section 2,条件跳转,任何复杂的条件结构都可以转换为基本的条件跳转 允许的条件跳转指令相等比较 JE:CMP比较的操作数相等则跳转 JNE:CMP比较的操作数不相等则跳转 JCXZ:CX的值为零时跳转 JECXZ:ECX的值为零时则跳转,汇编语言程序设计-朱明,20,条件设置指令条件判断指令 标号标号,cmpal,0jeL1;如果AL=0则跳转L1:;跳转的目标L1,Section 2,条件跳转,任何复杂的条件结构都可以转换为基本的条件跳转 允许的条件跳转指令无符号数比较 JA:如果(左操作数)大于(右操作数)则跳转 JNBE:如果不小于或等于则跳转,等同于JA JAE:如果(左操作数)大于或等于(右操作数)则跳转 JNB:如果不小于则跳转,等同于JAE JB:如果(左操作数)小于(右操作数)则跳转 JNAE:如果不大于或等于则跳转,等同于JB JBE:如果(左操作数)小于或等于(右操作数)则跳转 JNA:如果不大于则跳转,等同于JBE,汇编语言程序设计-朱明,21,Section 2,条件跳转,任何复杂的条件结构都可以转换为基本的条件跳转 允许的条件跳转指令有符号数比较 JG:如果(左操作数)大于(右操作数)则跳转 JNLE:如果不小于或等于则跳转,等同于JG JGE:如果(左操作数)大于或等于(右操作数)则跳转 JNL:如果不小于则跳转,等同于JGE JL:如果(左操作数)小于(右操作数)则跳转 JNGE:如果不大于或等于则跳转,等同于JL JLE:如果(左操作数)小于或等于(右操作数)则跳转 JNG:如果不大于则跳转,等同于JNE,汇编语言程序设计-朱明,22,Section 2,课堂练习,极其简单的条件判断与跳转练习 在数组中查找符合特定要求的字符串 例如:在数组中查找第一个非零值 找到则显示该值 找不到则返回错误信息“Not Found!”,汇编语言程序设计-朱明,23,比较字符串,符合?,ECX=0,输出字符串,Section 2,课堂练习,极其简单的条件判断与跳转练习 在数组中查找符合特定要求的字符串 例如:在数组中查找第一个非零值 找到则显示该值 找不到则返回错误信息“Not Found!”,汇编语言程序设计-朱明,24,比较字符串,符合?,ECX=0,输出字符串,Section 2,.dataIntArray SWORD 0,0,0,0,126,250,521,1FailMsg BYTE Not Found,0,课堂练习,在数组中查到特定的值,如第一个非零值 关键点,按顺序访问元素,与零作比较,条件跳转,汇编语言程序设计-朱明,25,mainPROCmovebx,OFFSET IntArraymovecx,LENGTHOF IntArray,操作数间接寻址访问数组元素,当前的元素:WORD PTR ebx,SWORD,下一个元素:addebx,2,进行比较操作,Section 2,当前元素与零比:cmpWORD PTR ebx,0,课堂练习,在数组中查到特定的值,如第一个非零值 关键点,按顺序访问元素,与零作比较,条件跳转,汇编语言程序设计-朱明,26,进行单个元素比较操作,Section 2,当前元素与零比:jmpWORD PTR ebx,0,L1:jmpWORD PTR ebx,0jnz;跳转到发现非零元素的标号addebx,2loopL1;下面是没有发现非零数据的处理,进行所有元素比较操作,课堂练习,关键程序清单(1),汇编语言程序设计-朱明,27,.dataIntArray SWORD 0,0,0,0,126,250,521,1FailMsg BYTE Not Found,0.codemainPROCmovebx,OFFSET IntArraymovecx,LENGTHOF IntArrayL1:cmpWORD PTR ebx,0jnzfoundaddebx,2loopL1failed:movedx,OFFSET FailMsgcallWriteStringjmpquit,Section 2,课堂练习,关键程序清单(2),汇编语言程序设计-朱明,28,.dataIntArray SWORD 0,0,0,0,126,250,521,1FailMsg BYTE Not Found,0.codemainPROCmovebx,OFFSET IntArraymovecx,LENGTHOF IntArrayL1:cmpWORD PTR ebx,0jnzfoundaddebx,2loopL1failed:movedx,OFFSET FailMsgcallWriteStringjmpquit,found:movsxeax,WORD PTR ebxcallWriteIntquit:callcrlfexitmainENDPENDmain,Section 2,条件结构,简单的条件结构就是由于条件表达式而引起的,汇编语言程序设计-朱明,29,开始,相等,程序块1,程序块2,Section 3,if(OP1=OP2)程序块1 else 程序块2,T,F,moveax,OP1cmpeax,OP2jeL2程序段2L2:程序段1,条件结构,复合表达式逻辑AND运算符 增加多一级比较过程 标号的直接跳转过程 类似”短路”过程?如果是逻辑OR运算符呢?,汇编语言程序设计-朱明,30,Section 3,if(A1 B1)AND(B1 C1)程序块1 else 程序块2,cmpA1,B1jaL1jmpnextL1:cmpB1,C1jaL2jmpnextL2:程序块1jmp;条件之外next:程序块2jmp;条件之外,条件结构,无论多复杂的条件结构,都可以通过转化为各种条件跳转,通过判定标志位来实现 以下是几个小练习,不作为作业提交的,汇编语言程序设计-朱明,31,Section 3,if(bx cx)X=1;,if(dx=cx)X=1;else X=2;,if(bxcx)AND(cxdx)X=1;elseX=2;,if(bxcx)OR(cxdx)X=1;elseX=2;,if(bxcx)AND(cxdx)OR(dxax)X=1;elseX=2;,决策伪指令,MASM系统中的决策伪指令(流控制伪指令)可以方便编写符合条件表达式,汇编语言程序设计-朱明,32,.IF 条件1过程1.ELSE过程N.ENDIF,moveax,6.IFeax Val1movresult,1.ENDIF,moveax,6cmpeax,val1jbeC0001movresult,1C0001:,Section 3,.IF 条件1过程1.ELSEIF 条件2过程2.ELSE过程N.ENDIF,决策伪指令,MASM系统中的决策伪指令(流控制伪指令)可以方便编写符合条件表达式,汇编语言程序设计-朱明,33,.REPEAT过程3.UNTIL 条件3,moveax,0.REPEATinceaxcallWriteDeccallCrlf.UNTIL eax=10,moveax,0.WHILE eax 10inceaxcallWriteDeccallCrlf.ENDW,Section 3,.WHILE 条件4过程4.ENDW,课堂练习,决策伪指令,汇编语言程序设计-朱明,34,.dataval1 DWORD2val2DWORD5val3DWORD9.codemoveax,val1movebx,val2movecx,val3,while(val1 vla2)val1+;if(val2=val3)X=2;elseX=3,.WHILE eax ebxinceax.ENDW,.IF ebx=ecxmovX,2.ELSEmovX,3.ENDIF,Section 2,回顾与练习,使用下表作为参考,编写一个程序,用户从键盘输入一个0100的分数,程序能对分数进行分级 本作业占成绩15%下次课上课之前发送至姓名_班级_学号,附件形式发送代码,汇编语言程序设计-朱明,35,回顾与练习,