32位微机原理与接口技术钱晓捷PPT课件.ppt
《32位微机原理与接口技术钱晓捷PPT课件.ppt》由会员分享,可在线阅读,更多相关《32位微机原理与接口技术钱晓捷PPT课件.ppt(149页珍藏版)》请在三一办公上搜索。
1、第 4 章汇编语言程序设计,4.1 分支程序结构4.2 循环程序结构4.3 子程序结构4.4 Windows应用程序编程4.5 与C+语言的混合编程,4.1 分支程序结构,改变程序执行顺序、形成分支、循环、调用等程序结构是很常见的程序设计问题高级语言采用IF等语句表达条件,并根据条件是否成立转向不同的程序分支汇编语言需要首先利用比较CMP、测试TEST、加减运算、逻辑运算等影响状态标志的指令形成条件然后利用条件转移指令判断由标志表达的条件,并根据标志状态控制程序转移到不同的程序段,4.1.1 无条件转移指令,程序代码在代码段CS:指明代码段在主存中的段基地址EIP:给出将要执行指令的偏移地址程
2、序顺序执行,处理器自动增量EIP程序控制转移,EIP随之改变程序转移到另外的代码段,EIP和CS都改变控制转移类指令:改变EIP(有些也改变CS),即改变程序执行顺序(实现程序控制转移)的指令,本章学习控制转移类指令,1. 转移范围,段内转移在当前代码段范围内的程序转移不需更改CS,只要改变EIP(偏移地址)近转移(Near):32位近转移NEAR32,16位近转移NEAR16短转移(Short):转移范围在127-128字节段间转移从当前代码段跳转到另一个代码段需要更改CS(段地址)和EIP(偏移地址)远转移(Far): 48位远转移FAR32,32位远转移FAR16,2. 指令寻址方式,相
3、对寻址方式提供目标地址相对于当前指令指针EIP的位移量目标地址(转移后的EIP)当前EIP位移量相对寻址都是段内转移,最常用、最灵活直接寻址方式直接提供目标地址目标地址(转移后的CS和EIP)指令操作数间接寻址方式指示寄存器或存储单元目标地址来自寄存器或存储单元、间接获得寄存器间接寻址:用寄存器保存目标地址存储器间接寻址:用存储单元保存目标地址,目标地址目的地址转移地址,3. JMP指令,无条件转移:程序无条件改变执行顺序JMP指令相当于高级语言的goto语句JMP label;程序转向label标号指定的地址;段内相对寻址,段间直接寻址JMP reg32/reg16;程序转向寄存器指定的地址
4、;寄存器间接寻址JMP mem48/mem32/mem16;程序转向存储单元指定的地址;存储器间接寻址,JMP指令的4种类型,1. 段内转移、相对寻址标号指明目标地址,指令代码包含位移量2. 段内转移、间接寻址通用寄存器或主存单元包含目标指令偏移地址3. 段间转移、直接寻址标号包含目标指令的段地址和偏移地址4. 段间转移、间接寻址32位段用3字存储单元包含目标地址16位段用双字存储单元包含目标地址,MASM会根据存储模式等信息自动识别,例4-1无条件转移程序1,; 数据段0000000000000000nvardword ? ; 代码段00000000EB 01jmp labl1; 相对寻址0
5、000000290nop00000003E9 00000001labl1:jmp near ptr labl2; 相对近转移0000000890nop00000009B8 00000011 Rlabl2:mov eax,offset labl3,例4-1无条件转移程序2,0000000EFF E0jmp eax; 寄存器间接寻址0000001090nop00000011B8 00000022 Rlabl3:mov eax,offset labl400000016A3 00000000 Rmov nvar,eax0000001BFF 25 00000000 Rjmp nvar; 存储器间接寻址0
6、000002190noplabl4:,4.1.2 条件转移指令,根据指定的条件确定程序是否发生转移Jcc label;条件满足,发生转移;否则,顺序执行下条指令LABEL表示目标地址,采用段内相对寻址32位IA-32处理器:达到32位的全偏移量16位80 x86处理器:-128+127间的短转移条件转移指令不影响标志,但要利用标志cc表示利用标志判断的条件,16种、两类单个标志状态作为条件两数大小关系作为条件,转移条件cc:单个标志状态,JZ/JEZF=1Jump if Zero/EqualJNZ/JNEZF=0Jump if Not Zero/Not EqualJSSF=1Jump if S
7、ignJNSSF=0Jump if Not SignJP/JPEPF=1Jump if Parity/Parity EvenJNP/JPOPF=0Jump if Not Parity/Parity OddJOOF=1Jump if OverflowJNOOF=0Jump if Not OverflowJCCF=1Jump if CarryJNCCF=0Jump if Not Carry,多个助记符方便记忆,转移条件cc:两数大小关系,JB/JNAECF=1Jump if Below/Not Above or EqualJNB/JAECF=0Jump if Not Below/Above or
8、EqualJBE/JNACF=1或ZF=1Jump if Below/Not AboveJNBE/JACF=0且ZF=0Jump if Not Below or Equal/AboveJL/JNGESFOFJump if Less/Not Greater or EqualJNL/JGESF=OFJump if Not Less/Greater or EqualJLE/JNGSFOF或ZF=1Jump if Less or Equal/Not GreaterJNLE/JGSF=OF且ZF=0Jump if Not Less or Equal/Greater,1. 单个标志状态作为条件的条件转移指
9、令,JZ(JE)和JNZ(JNE):利用零位标志ZF判断结果是零(相等)还是非零(不等)JS和JNS:利用符号标志SF判断结果是负还是正JO和JNO:利用溢出标志OF判断结果是溢出还是没有溢出JP(JPE)和JNP(JPO):利用奇偶标志PF判断结果低字节“1”的个数是偶数还是奇数JC和JNC:利用进位标志CF判断结果是有进位(为1)还是无进位(为0),例4-2个数折半程序1,mov eax,885; 假设一个数据shr eax,1; 数据右移进行折半jnc goeven; 余数为0,即CF0条件成立,转移add eax,1; 否则余数为1,即CF1,进行加1操作goeven:call dis
10、puid; 显示结果,443,运行结果,例4-2个数折半程序2,mov eax,886; 假设一个数据shr eax,1; 数据右移进行折半jc goodd; 余数为1,即CF1条件成立,转移到分支体,进行加1操作jmp goeven; 余数为0,即CF0,不需要处理,转移到显示!goodd:add eax,1; 进行加1操作goeven:call dispuid; 显示结果,例4-2个数折半程序3,mov eax,887; 假设一个数据shr eax,1; 数据右移进行折半adc eax,0; 余数CF1,进行加1操作;余数CF0,没有加1call dispuid; 显示结果,mov eax
11、,888; 假设一个数据add eax,1; 个数加1rcr eax,1; 数据右移进行折半call dispuid; 显示结果,改进算法,消除分支,例4-3位测试程序1,; 数据段no_msgbyte Not Ready!,0yes_msgbyte Ready to Go!,0; 代码段mov eax,56h; 假设一个数据test eax,02h; 测试D1位(D11,其他位为0)jz nom; D10条件成立,转移mov eax,offset yes_msg; D11,显示准备好jmp done; 跳转过另一个分支体!nom:mov eax,offset no_msg; 显示没有准备好d
12、one:call dispmsg,例4-3位测试程序2,; 数据段no_msgbyte Not Ready!,0yes_msgbyte Ready to Go!,0; 代码段mov eax,56h; 假设一个数据test eax,02h; 测试D1位(D11,其他位为0)jnz yesm; D11条件成立,转移mov eax,offset no_msg; D10,显示没有准备好jmp done; 跳转过另一个分支体!yesm:mov eax,offset yes_msg; 显示准备好done:call dispmsg,例4-4奇校验程序,call readc; 键盘输入, AL返回值call
13、dispcrlf; 回车换行(用于分隔)call dispbb; 以二进制形式显示数据call dispcrlf; 回车换行(用于分隔)and al,7fh; 最高位置“0”、其他位不变; 同时标志PF反映“1”的个数jnp next; 个数为奇数,不需处理,转移or al,80h; 个数为偶数,最高位置“1”、其他位不变 next:call dispbb; 显示含校验位的数据,2. 两数大小关系作为条件的条件转移指令,无符号数用高(Above)、低(Below)低于(不高于等于):JB(JNAE)不低于(高于等于):JNB(JAE)低于等于(不高于):JBE(JNA)不低于等于(高于):JN
14、BE(JA)有符号数用大(Greater)、小(Less)小于(不大于等于):JL(JNGE)不小于(大于等于):JNL(JGE)小于等于(不大于):JLE(JNG)不小于等于(大于):JNLE(JG),例4-5数据比较程序1,; 数据段in_msg1byte Enter a number: ,0in_msg2byte Enter another number: ,0out_msg1byte Two numbers are equal: ,0out_msg2byte The less number is: ,0out_msg3byte 13,10,The greater number is:
15、,0; 代码段mov eax,offset in_msg1; 提示输入call dispmsgcall readsid; 输入第一个数据mov ebx,eax; 保存到EBXmov eax,offset in_msg2; 提示输入call dispmsgcall readsid; 输入第二个数据mov ecx,eax; 保存到ECX,例4-5数据比较程序2,cmp ebx,ecx; 二个数据进行比较jne nequal; 两数不相等,转移mov eax,offset out_msg1call dispmsg; 显示两数相等mov eax,ebxcall dispsid; 显示相等的数据jmp
16、done; 转移到结束nequal:jl first; EBX较小,不需要交换,转移xchg ebx,ecx; EBX保存较小数,ECX保存较大数,例4-5数据比较程序3,first:mov eax,offset out_msg2; 显示较小数call dispmsgmov eax,ebx; 较小数在EBX中call dispsidmov eax,offset out_msg3; 显示较大数call dispmsgmov eax,ecx; 较大数在ECX中call dispsid done:,4.1.3 单分支结构,只有一个分支的程序类似高级语言的IF-THEN语句结构注意采用正确的条件转移指
17、令当条件满足(成立),发生转移,跳过分支体条件不满足,顺序向下执行分支体条件转移指令与高级语言的IF语句正好相反IF语句是条件成立,执行分支体,例4-6求绝对值程序,; 代码段call readsid; 输入一个有符号数,从EAX返回值cmp eax,0; 比较EAX与0jge nonneg; 条件满足:EAX0,转移neg eax; 条件不满足:EAX0,为负数; 需求补得正值nonneg:call dispuid;分支结束,显示结果,示意图,单分支结构的流程图,返回,neg eax,例4-7字母判断程序,call readc; 输入一个字符,从AL返回值cmp al,A; 与大写字母A比较
18、jb done; 比大写字母A小,不是大写字母,转移cmp al,Z; 与大写字母Z比较ja done; 比大写字母Z大,不是大写字母,转移or al,20h; 转换为小写call dispcrlf; 回车换行call dispc; 显示小写字母done:,4.1.4 双分支结构,双分支程序结构有两个分支,条件为真执行一个分支;条件为假,执行另一个分支相当于高级语言的IF-THEN-ELSE语句顺序执行的分支体1最后一定要有一条JMP指令跳过分支体2JMP指令必不可少,实现结束前一个分支回到共同的出口作用双分支结构有时可以改变为单分支结构事先执行其中一个分支(选择出现概率较高的分支),例4-8
19、显示数据最高位程序1,; 数据段dvardword 0bd630422h; 假设一个数据; 代码段mov ebx,dvarshl ebx,1; EBX最高位移入CF标志jc one; CF1,即最高位为1,转移mov al,0; CF0,即最高位为0:AL0jmp two; 一定要跳过另一个分支one:mov al,1; AL1two:call dispc; 显示,示意图,双分支结构,双分支结构的流程图,返回,例4-8显示数据最高位程序2,mov ebx,dvarmov al,0; 假设最高位为0:AL0shl ebx,1; EBX最高位移入CF标志jnc two; CF0,即最高位为0,转移
20、mov al,1; CF1,即最高位为1,AL1two:call dispc; 显示,单分支结构,例4-9有符号数运算溢出程序,; 数据段dvar1dword 1234567890; 假设两个数据dvar2dword -999999999dvar3dword ?okmsgbyte Correct!,0; 正确信息errmsgbyte ERROR ! Overflow!,0; 错误信息; 代码段mov eax,dvar1 sub eax,dvar2; 求差jo error; 有溢出,转移mov dvar3,eax; 无溢出,保存差值mov eax,offset okmsg; 显示正确jmp di
21、sperror:mov eax,offset errmsg; 显示错误disp:call dispmsg,4.2 循环程序结构,三个部分组成:循环初始为开始循环准备必要的条件,如循环次数、循环体需要的初始值等;循环体重复执行的程序代码,其中包括对循环条件的修改等;循环控制判断循环条件是否成立,决定是否继续循环“先判断、后循环”的循环程序结构对应高级语言的WHILE语句“先循环、后判断”的循环程序结构对应高级语言的DO语句,示意图,循环程序结构的流程图,返回,4.2.1 循环指令,LOOP label;ECXECX1;若ECX0,循环到LABEL;否则,顺序执行JECXZ label;ECX0,
22、转移;否则顺序执行目标地址采用相对短转移实地址存储模型使用CX作为计数器,例4-10数组求和程序,mov ecx,lengthof array; ECX数组元素个数xor eax,eax; 求和初值为0mov ebx,eax; 数组指针为0again:add eax,arrayebx*(type array); 求和 inc ebx; 指向下一个数组元素loop againmov sum,eax; 保存结果call dispsid; 显示结果,4.2.2 计数控制循环,通过次数控制循环利用LOOP指令属于计数控制常见是“先循环、后判断”循环结构计数可以减量进行,即减到0结束计数可以增量进行,即
23、达到规定值结束,循环程序结构的关键是如何控制循环,例4-11简单加密解密程序1,; 数据段keybyte 234bufnum= 255bufferbyte bufnum+1 dup(0); 定义键盘输入需要的缓冲区msg1byte Enter messge: ,0msg2byte Encrypted message: ,0msg3byte 13,10,Original messge: ,0; 代码段mov eax,offset msg1; 提示输入字符串call dispmsgmov eax,offset buffer; 设置入口参数EAXcall readmsg; 调用输入字符串子程序pus
24、h eax; 字符个数保存进入堆栈,例4-11简单加密解密程序2,mov ecx,eax; ECX实际输入的字符个数,作为循环的次数xor ebx,ebx; EBX指向输入字符mov al,key; AL加密关键字encrypt:xor bufferebx,al; 异或加密inc ebxdec ecx; 等同于指令:loop encryptjnz encrypt; 处理下一个字符mov eax,offset msg2call dispmsgmov eax,offset buffer; 显示密文call dispmsg,例4-11简单加密解密程序3,op ecx; 从堆栈弹出字符个数,作为循环的
25、次数xor ebx,ebx; EBX指向输入字符mov al,key; AL解密关键字decrypt:xor bufferebx,al; 异或解密inc ebxdec ecxjnz decrypt; 处理下一个字符mov eax,offset msg3call dispmsgmov eax,offset buffer; 显示明文call dispmsg,示意图,简单加密解密程序运行实例,返回,4.2.3 条件控制循环,根据条件决定是否进行循环需要使用有条件转移指令实现多见“先判断、后循环”结构先行判断的条件控制循环程序很像双分支结构主要分支需要重复执行多次(JMP的目标位置是循环开始)另一个分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 32 微机 原理 接口 技术 钱晓捷 PPT 课件
链接地址:https://www.31ppt.com/p-1480039.html