《微机应用05文档资料》由会员分享,可在线阅读,更多相关《微机应用05文档资料(96页珍藏版)》请在金锄头文库上搜索。
1、第第5章章 控制转移和程序结构控制转移和程序结构制作 钱晓捷微型计算机原理及应用微型计算机原理及应用20062006年年钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,200620062第5章 控制转移和程序结构5.1 5.1 目标地址寻址方式目标地址寻址方式5.1.15.1.1转移范围转移范围5.1.25.1.2寻址方式寻址方式5.1.3 5.1.3 无条件转移指令无条件转移指令5.2 5.2 分支程序结构分支程序结构5.2.1 5.2.1 条件转移指令条件转移指令5.2.2 5.2.2 单分支结构单分支结构5.2.3 5.2.3 双分支结构双分支
2、结构5.2.4 5.2.4 多分支结构多分支结构5.3 5.3 循环程序结构循环程序结构5.3.1 5.3.1 循环指令循环指令5.3.2 5.3.2 计数控制循环计数控制循环5.3.3 5.3.3 条件控制循环条件控制循环5.4 5.4 子程序结构子程序结构5.4.1 5.4.1 子程序指令子程序指令5.4.2 5.4.2 子程序设计子程序设计5.4.3 5.4.3 参数传递参数传递5.4.4 5.4.4 程序模块程序模块钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,200620063目标地址l程序代码在代码段程序代码在代码段CSCS:指明代码段
3、在主存中的开始位置、即段基地址:指明代码段在主存中的开始位置、即段基地址EIPEIP:给出将要执行指令的偏移地址:给出将要执行指令的偏移地址l程序顺序执行,微处理器自动增量程序顺序执行,微处理器自动增量EIPEIPl程序控制转移,程序控制转移,EIPEIP随之改变随之改变l程序转移到另外的代码段,程序转移到另外的代码段, EIPEIP和和CSCS都将改变都将改变l控控制制转转移移类类指指令令:改改变变EIPEIP(有有些些也也改改变变CSCS),即即改改变程序执行顺序(实现程序控制转移)的指令变程序执行顺序(实现程序控制转移)的指令l目目标标地地址址寻寻址址方方式式:改改变变CSCS和和EIP
4、EIP寄寄存存器器,或或者者说说如如何指明目的地、即目标地址的方法何指明目的地、即目标地址的方法目标地址目标地址目的地址目的地址转移地址转移地址钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,200620064转移范围l段内转移段内转移在当前代码段范围内的程序转移在当前代码段范围内的程序转移不需更改不需更改CSCS,只要改变只要改变EIPEIP(偏移地址)(偏移地址)近转移近转移(NearNear):):1616位段是位段是1616位近转移位近转移NEAR16NEAR16,3232位段是位段是3232位近转移位近转移NEAR32NEAR32短转移(短
5、转移(ShortShort):转移范围在):转移范围在127127-128-128字节字节l段间转移段间转移从当前代码段跳转到另一个代码段从当前代码段跳转到另一个代码段需要更改需要更改CSCS(段地址)和(段地址)和EIPEIP(偏移地址)(偏移地址)远转移远转移(FarFar):):1616位段是位段是3232位远转移位远转移FAR16FAR16,3232位段是位段是4848位远转移位远转移FAR32FAR32钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,200620065目标地址寻址方式l相对寻址方式相对寻址方式提供目标地址相对于当前指令指针提
6、供目标地址相对于当前指令指针EIPEIP的位移量的位移量目标地址(转移后的目标地址(转移后的EIPEIP)当前)当前EIPEIP位移量位移量相对寻址都是段内转移,最常用、最灵活相对寻址都是段内转移,最常用、最灵活l直接寻址方式直接寻址方式直接提供目标地址直接提供目标地址目标地址(转移后的目标地址(转移后的CSCS和和EIPEIP)指令操作数)指令操作数l间接寻址方式间接寻址方式指示寄存器或存储单元指示寄存器或存储单元目标地址来自寄存器或存储单元、间接获得目标地址来自寄存器或存储单元、间接获得寄存器间接寻址:用寄存器保存目标地址寄存器间接寻址:用寄存器保存目标地址存储器间接寻址:用存储单元保存目
7、标地址存储器间接寻址:用存储单元保存目标地址钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,200620066无条件转移指令JMPl无条件转移:程序无条件改变执行顺序无条件转移:程序无条件改变执行顺序lJMPJMP指令相当于高级语言的指令相当于高级语言的gotogoto语句语句JMP labelJMP label; ;程序转向程序转向labellabel标号指定的地址标号指定的地址; ;段内相对寻址,段间直接寻址段内相对寻址,段间直接寻址JMP reg16/reg32JMP reg16/reg32; ;程序转向寄存器指定的地址程序转向寄存器指定的地址
8、; ;寄存器间接寻址寄存器间接寻址JMP mem16/mem32JMP mem16/mem32; ;程序转向存储单元指定的地址程序转向存储单元指定的地址; ;存储器间接寻址存储器间接寻址钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,200620067JMP指令的4种类型1. 1. 段内转移、相对寻址段内转移、相对寻址标号指明目标地址,指令代码包含位移量标号指明目标地址,指令代码包含位移量2. 2. 段内转移、间接寻址段内转移、间接寻址通用寄存器或主存单元包含目标指令的偏移地址通用寄存器或主存单元包含目标指令的偏移地址3. 3. 段间转移、直接寻址段
9、间转移、直接寻址标号包含目标指令的段地址和偏移地址标号包含目标指令的段地址和偏移地址4. 4. 段间转移、间接寻址段间转移、间接寻址1616位段用双字存储单元包含目标地址位段用双字存储单元包含目标地址3232位段用位段用3 3字存储单元包含目标地址字存储单元包含目标地址MASM会根据存储模式等信息自动识别会根据存储模式等信息自动识别演示演示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,200620068例题5-1无条件转移程序-1; ;数据段数据段00000000 00000000nvarnvardw ?dw ? ; ;代码段代码段00100010
10、 EB 01 EB 01jmpjmp labl1 labl100120012 90 90nopnop00130013 B8 FF02 B8 FF02labl1:labl1:mov mov ax,typeax,type labl1 labl100160016 E9 0001 E9 0001jmpjmp near near ptrptr labl2 labl200190019 90 90nopnop001A001A B8 0020 R B8 0020 Rlabl2:labl2:mov mov ax,offsetax,offset labl3 labl3001D001D FF E0 FF E0jmp
11、jmp ax ax001F001F 90 90nopnop00200020 B8 002B R B8 002B Rlabl3:labl3:mov mov ax,offsetax,offset labl4 labl400230023 A3 0000 R A3 0000 Rmov nvar,axmov nvar,ax00260026 FF 26 0000 R FF 26 0000 R jmpjmp nvar nvar002A002A 90 90nopnop 相对短转移相对短转移 相对近转移相对近转移 寄存器间接近转移寄存器间接近转移 存储器间接近转移存储器间接近转移钱晓捷,微型计算机原理及应用,清
12、华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,200620069例题5-1无条件转移程序-2; ;数据段数据段00020002 00000000 00000000fvarfvardddd ? ?; ;代码段代码段002B002B B8 FF05 B8 FF05labl4:labl4:mov mov ax,typeax,type far far ptrptr labl5 labl5002E002E EA - 0034 R EA - 0034 Rjmpjmp far far ptrptr labl5 labl500330033 90 90nopnop00340034 B8 0047
13、R B8 0047 Rlabl5:labl5:mov mov ax,offsetax,offset labl6 labl600370037 A3 0002 R A3 0002 Rmov word ptr fvar,axmov word ptr fvar,ax003A003A BA - R BA - Rmov dx,seg labl6mov dx,seg labl6003D003D 89 16 0004 R 89 16 0004 R mov word ptr fvar+2,dxmov word ptr fvar+2,dx00410041 FF 2E 0002 R FF 2E 0002 R jmp
14、jmp fvarfvar00450045 90 90nopnop00460046labl6:labl6: 存储器间接远转移存储器间接远转移 直接远转移直接远转移调试调试钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200610条件转移指令Jccl根据指定的条件确定程序是否发生转移根据指定的条件确定程序是否发生转移JccJcc label label; ;条件满足,发生转移;否则,顺序执行下一条指令条件满足,发生转移;否则,顺序执行下一条指令lLABELLABEL表示目标地址,采用段内相对寻址方式表示目标地址,采用段内相对寻址方式1616位位
15、80x8680x86微处理器:只是微处理器:只是-128-128+127+127间的短转移间的短转移3232位位IA-32IA-32微处理器:达到微处理器:达到3232位的全偏移量位的全偏移量l条件转移指令不影响标志,但要利用标志条件转移指令不影响标志,但要利用标志lcccc表示利用标志判断的条件,表示利用标志判断的条件,1616种、两类种、两类单个标志状态作为条件单个标志状态作为条件两数大小关系作为条件两数大小关系作为条件钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200611转移条件cc:单个标志状态JZ/JEJZ/JEZF=1ZF=
16、1 Jump if Zero/EqualJump if Zero/EqualJNZ/JNEJNZ/JNEZF=0ZF=0 Jump if Not Zero/Not EqualJump if Not Zero/Not EqualJSJSSF=1SF=1 Jump if SignJump if SignJNSJNSSF=0SF=0 Jump if Not SignJump if Not SignJP/JPEJP/JPEPF=1PF=1 Jump if Parity/Parity EvenJump if Parity/Parity EvenJNP/JPOJNP/JPOPF=0PF=0 Jump if
17、 Not Parity/Parity OddJump if Not Parity/Parity OddJOJOOF=1OF=1 Jump if OverflowJump if OverflowJNOJNOOF=0OF=0 Jump if Not OverflowJump if Not OverflowJCJCCF=1CF=1 Jump if CarryJump if CarryJNCJNCCF=0CF=0 Jump if Not CarryJump if Not Carry钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200612转移条件c
18、c:两数大小关系JB/JNAEJB/JNAECF=1CF=1Jump if Below/Not Above or EqualJump if Below/Not Above or EqualJNB/JAEJNB/JAECF=0CF=0Jump if Not Below/Above or EqualJump if Not Below/Above or EqualJBE/JNAJBE/JNACF=1CF=1或或ZF=1ZF=1Jump if Below/Not AboveJump if Below/Not AboveJNBE/JAJNBE/JACF=0CF=0且且ZF=0ZF=0Jump if No
19、t Below or Equal/AboveJump if Not Below or Equal/AboveJL/JNGEJL/JNGESFOFSFOFJump Jump if if Less/Not Less/Not Greater Greater or or EqualEqualJNL/JGEJNL/JGESF=OFSF=OF Jump if Not Less/Greater or EqualJump if Not Less/Greater or EqualJLE/JNGJLE/JNGZFOFZFOF或或ZF=1ZF=1Jump Jump if if Less Less or or Equ
20、al/Not Equal/Not GreaterGreaterJNLE/JGJNLE/JGSF=OFSF=OF且且 ZF=0ZF=0 Jump Jump if if Not Not Less Less or or Equal/GreaterEqual/Greater多个助记符方便记忆多个助记符方便记忆钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200613单个标志状态作为条件lJZ(JE)JZ(JE)和和JNZ(JNE)JNZ(JNE):利用零位标志:利用零位标志ZFZF判断结果是零(相等)还是非零(不等)判断结果是零(相等)还是非零(不
21、等)lJSJS和和JNSJNS:利用符号标志:利用符号标志SFSF判断结果是负还是正判断结果是负还是正lJOJO和和JNOJNO:利用溢出标志:利用溢出标志OFOF判断结果是溢出还是没有溢出判断结果是溢出还是没有溢出lJP(JPE)JP(JPE)和和JNP(JPO)JNP(JPO):利用奇偶标志:利用奇偶标志PFPF判断结果低字节判断结果低字节“1”1”的个数是偶数还是奇数的个数是偶数还是奇数lJCJC和和JNCJNC:利用进位标志:利用进位标志CFCF判断结果是有进位(为判断结果是有进位(为1 1)还是无进位(为)还是无进位(为0 0)钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微
22、型计算机原理及应用,清华大学出版社,2006200614例题5-2实现指令CBW功能的程序-1l80868086指令指令CBWCBW(等于(等于IA-32IA-32指令指令MOVSX AX,ALMOVSX AX,AL)如果如果ALAL最高位为最高位为0 0,则设置,则设置AHAH0 0如果如果ALAL最高位为最高位为1 1,则设置,则设置AHAHFFHFFHl如何判断如何判断ALAL最高位是最高位是“0”0”,还是,还是“1”1”涉及一个位,可采用位操作类指令涉及一个位,可采用位操作类指令保留最高位不变,其他位变成保留最高位不变,其他位变成0 0逻辑与逻辑与“80H”80H”结果为结果为0 0
23、,ALAL最高位最高位0 0;否则是;否则是1 1运算结果是否为运算结果是否为0 0,零位标志,零位标志ZFZF反映反映JZJZ或或JNZJNZ指令判断并转移指令判断并转移演示演示TEST指令生成条件指令生成条件钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200615例题5-2实现指令CBW功能的程序-2mov mov al,bvaral,bvar; ;取出要判断的数据取出要判断的数据test al,80htest al,80h; ;测试最高位测试最高位jzjz next1 next1; ;最高位为最高位为0 0(ZFZF1 1),转移到
24、标号),转移到标号NEXT1NEXT1mov ah,0ffhmov ah,0ffh; ;最高位为最高位为1 1,顺序执行:设置,顺序执行:设置AHAHFFHFFHjmpjmp done done; ;无条件跳过另一个分支无条件跳过另一个分支next1:next1:mov ah,0mov ah,0; ;最高位为最高位为0 0转移到此执行:设置转移到此执行:设置AHAH0 0done:done:等于零转移等于零转移钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200616例题5-2实现指令CBW功能的程序-3mov mov al,bvaral,
25、bvar; ;取出要判断的数据取出要判断的数据test al,80htest al,80h; ;测试最高位测试最高位jnzjnz next2 next2; ;最高位为最高位为1 1(ZFZF0 0),转移到标号),转移到标号NEXT2NEXT2mov ah,0mov ah,0; ;最高位为最高位为0 0,顺序执行:设置,顺序执行:设置AHAH00H00Hjmpjmp done done; ;无条件跳过另一个分支无条件跳过另一个分支next2:next2:mov ah,0ffhmov ah,0ffh; ;最高位为最高位为1 1转移到此执行:设置转移到此执行:设置AHAHFFHFFHdone:do
26、ne:不等于零转移不等于零转移钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200617例题5-2实现指令CBW功能的程序-4mov mov al,bvaral,bvar; ;取出要判断的数据取出要判断的数据cmpcmp al,0 al,0; ;与与0 0比较比较jnsjns next3 next3; ;最高位为最高位为0 0(SFSF0 0),转移到标号),转移到标号NEXT3NEXT3mov ah,0ffhmov ah,0ffh; ;最高位为最高位为1 1,顺序执行:设置,顺序执行:设置AHAHFFHFFHjmpjmp done don
27、e; ;无条件跳过另一个分支无条件跳过另一个分支next3:next3:mov ah,0mov ah,0; ;最高位为最高位为0 0转移到此执行:设置转移到此执行:设置AHAH00H00Hdone:done:符号为正转移符号为正转移钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200618例题5-3实现奇偶校验程序-1l奇奇偶偶校校验验是是数数据据通通信信、存存储储等等过过程程中中最最常常用用的的校验方法校验方法l奇奇校校验验:使使包包括括校校验验位位在在内内的的数数据据中中为为“1”1”的个数恒为奇数的个数恒为奇数l偶偶校校验验:使使包包
28、括括校校验验位位在在内内的的数数据据中中为为“1”1”的个数恒为偶数(包括的个数恒为偶数(包括0 0)l奇奇偶偶校校验验只只能能检检测测出出奇奇数数个个位位出出错错的的情情况况,不不能纠错能纠错l实现奇偶校验非常简单实现奇偶校验非常简单硬件上使用异或等电路硬件上使用异或等电路软件上使用异或等指令,奇偶校验标志软件上使用异或等指令,奇偶校验标志PFPF钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200619例题5-3实现奇偶校验程序-2mov ah,1mov ah,1;1;1号功能号功能intint 21h 21h; ;键盘输入,返回值在键
29、盘输入,返回值在ALALand al,7fhand al,7fh; ;最高位置最高位置“0”0”,标志,标志PFPF反映反映“1”1”的个数的个数jnpjnp next1next1; ;个数为奇数,则转向个数为奇数,则转向NEXT1NEXT1or al,80hor al,80h; ;最高位置最高位置“1”1”、其他位不变、其他位不变 next1:next1:mov mov Tdata,alTdata,al; ;保存待发送的数据保存待发送的数据功能编号功能编号 AHAH01H01H出口参数出口参数 ALALASCIIASCII字符字符功能说明功能说明 键盘输入一个字符(回显)键盘输入一个字符(回
30、显)个数为奇数转移个数为奇数转移钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200620例题5-3实现奇偶校验程序-3mov ah,1mov ah,1;1;1号功能号功能intint 21h 21h; ;键盘输入,返回值在键盘输入,返回值在ALALand al,7fhand al,7fh; ;最高位置最高位置“0”0”,标志,标志PFPF反映反映“1”1”的个数的个数jpjp next2next2; ;个数为偶数,转向个数为偶数,转向NEXT2NEXT2jmpjmp donedone; ;个数为奇数,转向保存个数为奇数,转向保存next2
31、:next2: or al,80hor al,80h; ;最高位置最高位置“1”1”、其他位不变、其他位不变 done:done:mov mov Tdata,alTdata,al; ;保存待发送的数据保存待发送的数据个数为偶数转移个数为偶数转移 何不合二为一何不合二为一jnp done钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200621例题5-4统计“1”位个数程序-1mov ah,1mov ah,1intint 21h 21h; ;输入一个字符输入一个字符xorxor ah,ahah,ah; ;用用AHAH寄存器记录寄存器记录1 1
32、的个数,故先清的个数,故先清0 0mov ecx,8mov ecx,8;ASCII;ASCII码有码有8 8位,进行位,进行8 8次循环判断次循环判断again:again:shlshl al,1 al,1; ;从高位开始从高位开始jncjnc next next; ;不为不为1 1,无需处理,无需处理inc ahinc ah; ;为为1 1,个数加,个数加1 1next:next:loop againloop again钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200622例题5-4统计“1”位个数程序-2mov ah,1mov ah
33、,1intint 21h 21h; ;输入一个字符输入一个字符xorxor ah,ahah,ah; ;用用AHAH寄存器记录寄存器记录1 1的个数,故先清的个数,故先清0 0again:again:cmpcmp al,0 al,0; ;也可用也可用“TEST AL,0FFH”TEST AL,0FFH”jeje done doneshrshr al,1 al,1; ;从低位开始从低位开始jncjnc next next; ;不为不为1 1,无须处理,无须处理inc ahinc ah; ;为为1 1,个数加,个数加1 1next:next:jmpjmp again againdone:done:好
34、在哪里好在哪里?钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200623两数大小关系作为条件l无符号数用高(无符号数用高(AboveAbove)、低()、低(BelowBelow)低于(不高于等于):低于(不高于等于):JBJB(JNAEJNAE)不低于(高于等于):不低于(高于等于):JNBJNB(JAEJAE)低于等于(不高于):低于等于(不高于):JBEJBE(JNAJNA)不低于等于(高于):不低于等于(高于):JNBEJNBE(JAJA)l有符号数用大(有符号数用大(GreaterGreater)、小()、小(LessLess)
35、小于(不大于等于):小于(不大于等于):JLJL(JNGEJNGE)不小于(大于等于):不小于(大于等于):JNLJNL(JGEJGE)小于等于(不大于):小于等于(不大于):JLEJLE(JNGJNG)不小于等于(大于):不小于等于(大于):JNLEJNLE(JGJG)钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200624例题5-5比较两数大小程序mov ax,wvar1mov ax,wvar1; ;取第一个数据取第一个数据cmpcmp ax,wvar2 ax,wvar2; ;与第二个数据比较与第二个数据比较jeje equalequ
36、al; ;两数相等,转移两数相等,转移jnbjnb firstfirst; ;第一个数据大,转移第一个数据大,转移mov mov dx,offsetdx,offset msg2 msg2; ;第二个数据大第二个数据大jmpjmp donedonefirst:first:mov mov dx,offsetdx,offset msg1 msg1jmpjmp donedoneequal:equal:mov mov dx,offsetdx,offset msg0 msg0done:done:mov ah,9mov ah,9; ;显示结果显示结果intint 21h 21h无符号数无符号数 有符号数有符
37、号数钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200625例题5-6求绝对值程序; ;数据段数据段dvardvardddd 0bd630422h 0bd630422h; ;有符号数据有符号数据resultresultdddd ? ?; ;保存绝对值保存绝对值; ;代码段代码段mov mov eax,dvareax,dvarcmpcmp eax,0 eax,0; ;比较比较EAXEAX与与0 0jgejge nonnegnonneg; ;条件满足:条件满足:AX0AX0,转移,转移negneg eaxeax; ;条件不满足:条件不满足:A
38、XAX0 0,为负数,需求补得正值,为负数,需求补得正值nonnegnonneg: : mov mov result,eaxresult,eax; ;分支结束,保存结果分支结束,保存结果单分支单分支IF-THEN结构结构演示演示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200626例题5-7BCD码显示程序mov mov dl,BCDdl,BCD; ;取取BCDBCD码码test dl,0f0htest dl,0f0h; ;如果高位是如果高位是0 0,不显示,不显示jzjz one oneshrshr dl,4 dl,4;BCD;BCD
39、码高位右移为低位码高位右移为低位or dl,30hor dl,30h; ;转换为转换为ASCIIASCII码码mov ah,2mov ah,2; ;显示显示intint 21h 21hmov mov dl,BCDdl,BCD; ;取取BCDBCD码码and dl,0fhand dl,0fh; ;只取二进制低只取二进制低4 4位位one:one:or dl,30hor dl,30h; ;转换低位为转换低位为ASCIIASCII码码mov ah,2mov ah,2; ;显示显示intint 21h 21hadd dl,30hadd dl,30h钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,
40、微型计算机原理及应用,清华大学出版社,2006200627例题5-8显示数据最高位程序-1; ;数据段数据段dvardvardddd 0bd630422h 0bd630422h ; ;有符号数据有符号数据; ;代码段代码段mov mov ebx,dvarebx,dvarshlshl ebx,1 ebx,1;EBX;EBX最高位移入最高位移入CFCF标志标志jcjc one one;CF;CF1 1,最高位为,最高位为1 1,转移,转移mov dl,0mov dl,0;CF;CF0 0,最高位为,最高位为0 0:DL0DL0jmpjmp two two; ;一定要跳过另一个分支体一定要跳过另一个
41、分支体one:one:mov dl,1mov dl,1;DL1;DL1two:two:mov ah,2mov ah,2intint 21h 21h; ;显示显示双双分支分支IF-THEN-ELSE结构结构演示演示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200628例题5-8显示数据最高位程序-2; ;数据段数据段dvardvardddd 0bd630422h 0bd630422h ; ;有符号数据有符号数据; ;代码段代码段mov mov ebx,dvarebx,dvarmov dl,0mov dl,0; ;假设最高位为假设最高位为0
42、 0:DL0DL0shlshl ebx,1 ebx,1;EBX;EBX最最 高高 位位 移移 入入 CFCF标标 志志jncjnc two two;CF;CF0 0,即最高位为,即最高位为0 0、与假设相同,转移、与假设相同,转移mov dl,1mov dl,1;CF;CF1 1,最高位为,最高位为1 1,DL1DL1two:two:mov ah,2mov ah,2intint 21h 21h; ;显示显示IF-THEN结构结构钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200629例题5-8显示数据最高位程序-3; ;数据段数据段dva
43、rdvardddd 0bd630422h 0bd630422h ; ;有符号数据有符号数据; ;代码段代码段mov mov ebx,dvarebx,dvarmov dl,0mov dl,0shlshl ebx,1 ebx,1;EBX;EBX最高位移入最高位移入CFCF标志标志adcadc dl,0 dl,0; ;最高位为最高位为0 0,CFCF0 0,DL0DL0000 0; ;最高位为最高位为1 1,CFCF1 1,DL1DL1001 1mov ah,2mov ah,2; ;显示显示intint 21h 21h顺序结构顺序结构钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原
44、理及应用,清华大学出版社,2006200630例题5-9有符号数运算溢出程序; ;代码段代码段mov eax,dvar1 mov eax,dvar1 sub eax,dvar2sub eax,dvar2; ;求差求差jo errorjo error; ;有溢出,转移有溢出,转移mov dvar3,eaxmov dvar3,eax; ;无溢出,保存差值无溢出,保存差值lea dx,okmsglea dx,okmsg; ;显示正确显示正确jmp dispjmp disperror:error:lea dx,errmsglea dx,errmsg; ;显示错误显示错误disp:disp:mov ah
45、,9mov ah,9intint 21h 21h钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200631分支程序结构l单分支程序结构单分支程序结构选选好好条条件件转转移移指指令令:当当条条件件满满足足,发发生生转转移移,跳跳过过分支体;条件不满足,顺序执行分支体分支体;条件不满足,顺序执行分支体l双分支程序结构双分支程序结构顺序执行的分支体要有顺序执行的分支体要有JMPJMP指令跳过另一个分支体指令跳过另一个分支体l多分支结构多分支结构分支处理中又有分支,具有多个分支走向分支处理中又有分支,具有多个分支走向可用单分支和双分支实现多个分支结
46、构可用单分支和双分支实现多个分支结构or or ah,ahah,ahjzjz function0 function0decdec ah ahjzjz function1 function1AH=0fuction0YNAH=1fuction1YNAH=2fuction2YN钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200632例题5-10利用地址表实现多分支程序-1; ;数据段数据段msgmsgdb Input number(19): ,$db Input number(19): ,$crlfcrlfdb 0dh,0ah,$db 0dh,
47、0ah,$msg1msg1db Chapter 1 ,0dh,0ah,$db Chapter 1 ,0dh,0ah,$msg9msg9db Chapter 9,0dh,0ah,$db Chapter 9,0dh,0ah,$tabletabledw disp1,disp2,disp3,disp4,disp5dw disp1,disp2,disp3,disp4,disp5dw disp6,disp7,disp8,disp9dw disp6,disp7,disp8,disp9; ;入口地址表入口地址表地址表地址表分支分支1地址地址分支分支2地址地址标号偏移地址标号偏移地址 offset disp1演
48、示演示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200633例题5-10利用地址表实现多分支程序-2; ;代码段代码段start1:start1: mov mov dx,offsetdx,offset msgmsg; ;提示输入数字提示输入数字mov ah,9mov ah,9intint 21h 21hmov ah,1mov ah,1; ;等待按键等待按键intint 21h 21hpush axpush axmov mov dx,offsetdx,offset crlfcrlf; ;回车换行回车换行mov ah,9mov ah,9in
49、tint 21h 21hpop axpop ax;AL;AL数字的数字的ASCIIASCII码码演示演示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200634例题5-10利用地址表实现多分支程序-3cmpcmp al,1 al,1; ;数字数字 1 9 9?jaja start1 start1and ax,000fhand ax,000fh;ASCII;ASCII码转换成数字码转换成数字decdec ax axshlshl ax,1 ax,1; ;乘以乘以2 2mov mov bx,axbx,axjmpjmp tablebxtableb
50、x ; ;段内存储器间接转移:段内存储器间接转移:IPTABLEIPTABLEBXBXdisp1:disp1:mov mov dx,offsetdx,offset msg1 msg1; ;分支程序分支程序1 1jmpjmp start2 start2演示演示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200635例题5-10利用地址表实现多分支程序-4jmpjmp tablebxtablebx ;IPTABLE;IPTABLEBXBX; ;地址寻址方式:存储器间接转移地址寻址方式:存储器间接转移; ;数据寻址方式:数据寻址方式:寄存器相对
51、寻址寄存器相对寻址mov mov ax,offsetax,offset table tableadd add bx,axbx,axjmpjmp word word ptrbxptrbx ;IPBX;IPBX; ;数据寻址方式:数据寻址方式:寄存器间接寻址寄存器间接寻址mov mov ax,bxax,bx jmpjmp ax ax;IPAX;IPAX; ;数据寻址方式:数据寻址方式:寄存器寻址寄存器寻址演示演示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200636循环程序结构循环的初始状态循环的初始状态循环的工作部分循环的工作部分及修改部
52、分及修改部分计数控制循环计数控制循环条件控制循环条件控制循环初始化初始化循环体循环体修改部分修改部分Y YN N控制条件控制条件钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200637循环指令LOOP labelLOOP label;ECXECX;ECXECX1 1;若;若ECX0ECX0,循环到,循环到LABELLABEL;; ;否则,顺序执行否则,顺序执行JECXZ labelJECXZ label;ECX;ECX0 0,转移;否则顺序执行,转移;否则顺序执行JCXZ labelJCXZ label;CX;CX0 0,转移;否则顺序执
53、行,转移;否则顺序执行l3232位段使用位段使用ECXECX(1616位段使用位段使用CXCX)作为计数器)作为计数器l目标地址采用相对短转移目标地址采用相对短转移DEC ECXDEC ECXJNZ labelJNZ label钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200638例题5-11数组求和程序-1mov mov ecx,lengthofecx,lengthof array arrayxorxor eax,eaxeax,eax; ;求和初值为求和初值为0 0mov mov ebx,eaxebx,eax; ;数组指针为数组指针为
54、0 0again:again:movzxmovzx edx,arrayebxedx,arrayebx*(type array)*(type array)add add eax,edxeax,edx; ;求和求和 inc inc ebxebxloop againloop againmov mov sum,eaxsum,eax; ;保存结果保存结果循环初始循环初始循环体循环体循环控制循环控制演示演示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200639例题5-11数组求和程序-2mov mov ecx,lengthofecx,lengtho
55、f array arrayxorxor eax,eaxeax,eax; ;求和初值为求和初值为0 0jecxzjecxz done done; ;数组元素为数组元素为0 0,不,不再进行求和再进行求和mov mov ebx,eaxebx,eax; ;数组指针为数组指针为0 0again:again:movzxmovzx edx,arrayebxedx,arrayebx*(type array)*(type array)add add eax,edxeax,edx; ;求和求和 inc inc ebxebxloop againloop againdone:done:mov mov sum,eax
56、sum,eax; ;保存结果保存结果钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200640字符串输入功能功能编号功能编号 AHAH0AH0AH入口参数入口参数 DSDXDSDX键盘输入缓冲区逻辑地址键盘输入缓冲区逻辑地址(段地址(段地址偏移地址)偏移地址) 功能说明功能说明 读读取取从从键键盘盘输输入入的的一一个个字字符符串串(有有回回显显),直到按下回车键。直到按下回车键。键键盘盘输输入入缓缓冲冲区区的的第第1 1个个字字节节是是缓缓冲冲区区字字节节大大小小(最最大大为为255255),第第2 2个个字字节节在在调调用用结结束束时时被
57、被功功能能调调用用填填进进输输入入的的字字符符个个数数,第第3 3个个字字节节开开始始存存放放输输入入字字符符的的ASCIIASCII码码,最最后后是回车字符(是回车字符(0DH0DH)。)。 钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200641例题5-12输入字符串大小写转换程序-1; ;数据段数据段keynumkeynum= 255= 255keybufkeybufdb db keynumkeynum; ;键盘输入缓冲区键盘输入缓冲区db 0db 0db db keynumkeynum dup(0) dup(0); ;代码段代码段
58、mov mov dx,offsetdx,offset keybufkeybuf; ;设置入口参数设置入口参数DXDXmov ah,0ahmov ah,0ahintint 21h 21h; ;用户用回车键结束用户用回车键结束mov dl,0ahmov dl,0ah; ;回车后再进行换行回车后再进行换行mov ah,2mov ah,2intint 21h 21h输入输入“Hi”,回车,缓冲区:,回车,缓冲区:FF 02 48 69 0D 00 钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200642例题5-12输入字符串大小写转换程序-2mo
59、v mov bx,offsetbx,offset keybuf+1 keybuf+1 ; ;输入字符个数输入字符个数mov mov cl,bxcl,bx mov ch,0mov ch,0; ;作为循环的次数作为循环的次数again:again:inc bxinc bx;BX;BX指向输入字符指向输入字符mov mov dl,bxdl,bx ; ;取出一个字符取出一个字符cmpcmp dl,adl,a ; ;小于小写字母小于小写字母“a”a”jbjb dispdispcmpcmp dl,zdl,z ; ;大于小写字母大于小写字母“z”z”jaja dispdisp; ;直接去显示直接去显示sub
60、 dl,20hsub dl,20h; ;小写字母转换为大写字母小写字母转换为大写字母dispdisp: :mov ah,2mov ah,2; ;显示一个字符显示一个字符intint 21h 21hloop againloop again; ;循环循环计数控制循环计数控制循环演示演示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200643循环控制l计数控制循环计数控制循环通过次数控制循环,常用通过次数控制循环,常用LOOPLOOP指令实现指令实现l条件控制循环条件控制循环根据条件决定是否进行循环,需用条件转移指令根据条件决定是否进行循环,需
61、用条件转移指令l“先判断、后循环先判断、后循环”的循环程序结构的循环程序结构循环控制在进入循环之前进行循环控制在进入循环之前进行l“先循环、后判断先循环、后判断”的循环程序结构的循环程序结构循环之后进行循环条件判断循环之后进行循环条件判断示意图示意图钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200644例题5-13记录字符串特定字符个数程序mov mov esi,offsetesi,offset string stringxorxor ebx,ebxebx,ebx;EBX;EBX用于记录空格数用于记录空格数again:again:mov
62、 mov al,esial,esi cmpcmp al,0 al,0jzjz done donecmpcmp al,20h al,20h; ;空格的空格的ASCIIASCII码是码是20H20Hjnejne next next; ;不相等、不是空格,转移不相等、不是空格,转移inc bxinc bx; ;相等、是空格,个数加相等、是空格,个数加1 1next:next:inc inc esiesijmpjmp again again; ;继续循环继续循环done:done:mov mov space,ebxspace,ebx; ;保存结果保存结果条件控制循环条件控制循环钱晓捷,微型计算机原理及
63、应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200645例题5-14剔除字符串中特定字符程序mov esi,offset stringmov esi,offset stringoutlp:outlp:cmp byte ptr esi,$cmp byte ptr esi,$ ; ;外循环外循环jz donejz done; ;为为“$”“$”字符字符,结束结束again:again:cmp byte ptr esi, cmp byte ptr esi, ; ;检测是否是空格检测是否是空格jnz nextjnz next; ;不是空格继续循环不是空格继续循环mov
64、edi,esimov edi,esi; ;是空格,剔除空格分支是空格,剔除空格分支inlp:inlp:inc ediinc edi; ;该分支是循环程序该分支是循环程序mov al,edimov al,edi; ;前移一个位置前移一个位置mov edi-1,almov edi-1,alcmp byte ptr edi,$cmp byte ptr edi,$ ; ;内循环内循环jnz inlpjnz inlpjmp againjmp again; ;内循环结束处内循环结束处next:next:inc esiinc esi; ;继续对后续字符处理继续对后续字符处理jmp outlpjmp outl
65、p; ;外循环结束处外循环结束处done:done:. .先循环后判断先循环后判断先判断后循环先判断后循环多重循环多重循环钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200646子程序结构l子子程程序序:与与主主程程序序分分开开的的、完完成成特特定定功功能能的一段程序的一段程序l当当主主程程序序(调调用用程程序序)执执行行调调用用指指令令CALLCALL调调用子程序用子程序l子子程程序序(被被调调用用程程序序)执执行行返返回回指指令令RETRET返返回回主程序主程序CALL label主程序主程序RET子程序子程序回到回到CALL指令后的
66、指令后的指令处指令处返回地址返回地址钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200647子程序调用指令CALLlCALLCALL指令用在主程序中,实现子程序的调用指令用在主程序中,实现子程序的调用l分成段内调用(近调用)和段间调用(远调用)分成段内调用(近调用)和段间调用(远调用)l目标地址采用相对寻址、直接寻址或间接寻址目标地址采用相对寻址、直接寻址或间接寻址l入栈返回地址:将入栈返回地址:将CALLCALL下一条指令的地址压入堆栈下一条指令的地址压入堆栈1616位段段内位段段内:16:16位偏移地址,段间:再加位偏移地址,段间:再
67、加1616位段地址位段地址3232位位段段段段内内:3232位位偏偏移移地地址址,段段间间:再再将将1616位位段段选选择择器器零零位扩展为位扩展为3232位保存到堆栈位保存到堆栈CALL labelCALL label; ;调用标号指定的子程序调用标号指定的子程序CALL reg16/reg32CALL reg16/reg32; ;调用寄存器指定地址的子程序调用寄存器指定地址的子程序CALL mem16/mem32CALL mem16/mem32; ;调用存储单元指定地址的子程序调用存储单元指定地址的子程序钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出
68、版社,2006200648子程序返回指令RETlRETRET指令用在子程序结束,实现返回主程序指令用在子程序结束,实现返回主程序RETRET; ;无参数返回:出栈返回地址无参数返回:出栈返回地址RET i16RET i16; ;有参数返回:出栈返回地址,有参数返回:出栈返回地址,ESPESPESPESPi16i16MASM会会根根据据存存储储模模式式等等信信息息确确定定子子程程序的远近调用,并相应产生返回指令序的远近调用,并相应产生返回指令钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200649过程定义lMASMMASM利用过程定义伪指令
69、获得子程序信息利用过程定义伪指令获得子程序信息 过程名过程名 PROCPROC ; ;过程体过程体过程名过程名 ENDPENDP; ;过程名过程名为符合语法的标识符为符合语法的标识符lPROCPROC后面可加参数:后面可加参数:NEARNEAR或或FARFARl简化段定义源程序格式中,通常不需指定简化段定义源程序格式中,通常不需指定微型、小型和紧凑存储模式:默认属性微型、小型和紧凑存储模式:默认属性NEARNEAR中型、大型和巨型存储模式:默认属性中型、大型和巨型存储模式:默认属性FARFAR钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,20062
70、00650例题5-15十六进制转换为ASCII码程序-1; ;代码段代码段( (主程序主程序) )mov mov ax,wvarax,wvarmov cx,4mov cx,4; ;共共4 4位十六进制数位十六进制数again:again:rolrol ax,4 ax,4push axpush axcall call htoaschtoasc; ;调用子程序调用子程序mov ah,2mov ah,2mov mov dl,aldl,alintint 21h 21h; ;显示一个字符显示一个字符pop axpop axloop againloop again子程序名子程序名 HTOASCHTOASC
71、入口参数入口参数 ALAL1 1位十六进制数位十六进制数( (低低4 4位位) )出口参数出口参数 ALALASCIIASCII码码功能说明功能说明 十六进制数转换为十六进制数转换为ASCIIASCII码码子程序功能子程序功能不关心实现不关心实现钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200651例题5-15十六进制转换为ASCII码程序-2; ;代码段代码段( (子程序子程序) )htoaschtoascprocproc; ;过程定义过程定义and al,0fhand al,0fh; ;只取只取ALAL的低的低4 4位位or al,
72、30hor al,30h;AL;AL高高4 4位变成位变成3 3cmpcmp al,39h al,39h; ;是是0 09 9,还是,还是A AF Fjbejbe htoendhtoendadd al,7add al,7; ;是是A AF F,再加上,再加上7 7htoendhtoend: : retret; ;子程序返回子程序返回htoaschtoascendpendp; ;过程结束过程结束子程序名子程序名 HTOASCHTOASC入口参数入口参数 ALAL1 1位十六进制数位十六进制数( (低低4 4位位) )出口参数出口参数 ALALASCIIASCII码码功能说明功能说明 十六进制数转
73、换为十六进制数转换为ASCIIASCII码码子程序功能子程序功能钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200652子程序设计1.1.利用过程定义,获得子程序名和调用属性利用过程定义,获得子程序名和调用属性2.2.RETRET指令返回主程序,指令返回主程序,CALLCALL指令调用子程序指令调用子程序3.3.压入和弹出操作要成对使用,保持堆栈平衡压入和弹出操作要成对使用,保持堆栈平衡4.4.开始保护寄存器,返回前相应恢复开始保护寄存器,返回前相应恢复5.5.安排在代码段的主程序之外安排在代码段的主程序之外6.6.子程序允许嵌套和递归子
74、程序允许嵌套和递归7.7.即可共用一个数据段,也可具有独立数据段即可共用一个数据段,也可具有独立数据段最好有完整的注释最好有完整的注释难点是参数传递难点是参数传递钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200653例题5-16字符串显示程序-1; ;数据段数据段msgmsgdb Well, I made it !,0db Well, I made it !,0; ;代码段代码段( (主程序主程序) )mov mov si,offsetsi,offset msgmsg; ;主程序提供显示字符串主程序提供显示字符串call call dp
75、stridpstri; ;调用子程序调用子程序子程序名子程序名 DPSTRIDPSTRI入口参数入口参数 DS:SIDS:SI字符串首地址字符串首地址功能说明功能说明 显示字符串(以显示字符串(以0 0结尾)结尾)钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200654例题5-16字符串显示程序-2; ;代码段代码段( (子程序子程序) )dpstridpstri procproc; ;子程序:显示字符串子程序:显示字符串push axpush ax ; ;寄存器保护寄存器保护dps1:dps1:movmov alal,si,si ; ;
76、取显示字符取显示字符cmpcmp al,0 al,0; ;是结尾,则显示结束是结尾,则显示结束jzjz dps2 dps2call call dpchardpchar; ;调用字符显示子程序调用字符显示子程序inc inc sisijmpjmp dps1 dps1dps2:dps2:pop axpop ax ; ;寄存器恢复寄存器恢复retretdpstridpstri endpendp子程序名子程序名 DPCHARDPCHAR入口参数入口参数 ALALASCIIASCII码码功能说明功能说明 显示字符显示字符子程序嵌套子程序嵌套钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机
77、原理及应用,清华大学出版社,2006200655例题5-16字符串显示程序-3dpchardpcharprocproc; ;子程序显示字符子程序显示字符push axpush ax; ;顺序入栈,保护寄存器顺序入栈,保护寄存器push push dxdxmov ah,2mov ah,2mov mov dl,aldl,al; ;显示一个字符显示一个字符intint 21h 21hpop pop dxdx; ;逆序出栈,恢复寄存器逆序出栈,恢复寄存器pop axpop axretretdpchardpcharendpendp子程序名子程序名 DPCHARDPCHAR入口参数入口参数 ALALASC
78、IIASCII码码功能说明功能说明 显示字符显示字符钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200656例题5-17寄存器内容显示程序-1; ;数据段数据段dvardvardddd 1234abcdh 1234abcdhregdregddb EAX=db EAX=; ;代码段代码段mov mov ebx,offsetebx,offset regdregdmov ecx,4mov ecx,4; ;显示显示4 4个字符个字符dregd1:dregd1: mov ah,2mov ah,2mov mov dl,ebxdl,ebx intint
79、 21h 21hinc inc ebxebxloop dregd1loop dregd1钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200657例题5-17寄存器内容显示程序-2mov ecx,8mov ecx,8; ;共共8 8位十六进制数位十六进制数mov mov eax,dvareax,dvardregd2:dregd2: rolrol eax,4 eax,4push push eaxeaxcall call htoaschtoasc; ;调用子程序调用子程序mov ah,2mov ah,2mov mov dl,aldl,alint
80、int 21h 21h; ;显示一个字符显示一个字符pop pop eaxeaxloop dregd2loop dregd2子程序名子程序名 HTOASCHTOASC入口参数入口参数 ALAL1 1位十六进制数位十六进制数( (低低4 4位位) )出口参数出口参数 ALALASCIIASCII码码功能说明功能说明 十六进制数转换为十六进制数转换为ASCIIASCII码码子程序功能子程序功能不关心实现不关心实现钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200658例题5-17寄存器内容显示程序-3htoaschtoascprocprocp
81、ush push ebxebxmov mov ebx,offsetebx,offset ASCIIASCII and al,0fhand al,0fh; ;取得一位十六进制数取得一位十六进制数xlatxlat ASCIIASCII; ;换码:换码:ALCS:EBXALCS:EBXALAL pop pop ebxebxretret; ;子程序的局部数据子程序的局部数据( (在代码段在代码段CS)CS)ASCIIASCIIdb 30h,31h,32h,33h,34hdb 30h,31h,32h,33h,34hdb 35h,36h,37h,38h,39hdb 35h,36h,37h,38h,39hd
82、b 41h,42h,43h,44h,45h,46hdb 41h,42h,43h,44h,45h,46hhtoaschtoascendpendp钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200659子程序的参数传递l主程序与子程序间通过参数传递建立联系主程序与子程序间通过参数传递建立联系入口参数入口参数( (输入参数输入参数) ):主程序:主程序子程序子程序出口参数出口参数( (输出参数输出参数) ):子程序:子程序主程序主程序l传递参数的多少反映程序模块间的耦合程度传递参数的多少反映程序模块间的耦合程度l参数的具体内容参数的具体内容数据
83、本身(传递数值)数据本身(传递数值)数据的存储地址(传递地址,传递引用)数据的存储地址(传递地址,传递引用)l参数传递方法:寄存器、变量或堆栈参数传递方法:寄存器、变量或堆栈钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200660寄存器传递参数l最简单和常用的参数传递方法最简单和常用的参数传递方法l把参数存于约定的寄存器把参数存于约定的寄存器少量数据直接传递数值少量数据直接传递数值大量数据只能传递地址大量数据只能传递地址l带有出口参数的寄存器不能保护和恢复带有出口参数的寄存器不能保护和恢复l带带有有入入口口参参数数的的寄寄存存器器可可以以
84、保保护护、也也可可以以不不保保护,但最好能够保持一致护,但最好能够保持一致本书程序和本书程序和DOSDOS功能调用没有保护功能调用没有保护例如:反映功能号的例如:反映功能号的AXAX再如:再如:0909号调用的偏移地址号调用的偏移地址DXDX钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200661例题5-18有符号十进制数输入程序-1l算法如下:算法如下:1.1.首首先先判判断断输输入入正正数数还还是是负负数数,并并用用一一个个寄寄存存器器记记录下来;录下来;2.2.接接着着输输入入0 09 9数数字字(ASCIIASCII码码),并并减
85、减30H30H转转换换为为二进制数;二进制数;3.3.然然后后将将前前面面输输入入的的数数值值乘乘1010,并并与与刚刚输输入入的的数数字字相加得到新的数值;相加得到新的数值;4.4.重复重复2 2、3 3步,直到输入一个非数字字符结束;步,直到输入一个非数字字符结束;5.5.如如果果是是负负数数进进行行求求补补,转转换换成成补补码码;否否则则直直接接将将数值保存数值保存钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200662例题5-18有符号十进制数输入程序-2mov mov ecx,countecx,countmov mov ebx,
86、offsetebx,offset array arrayagain:again:call call readsidreadsid; ;输入一个数据输入一个数据mov mov ebx,ebx,eaxeax; ;存放出口参数存放出口参数add ebx,4add ebx,4call call dpcrlfdpcrlf; ;光标回车换行光标回车换行loop againloop again子程序名子程序名 READSIDREADSID出口参数出口参数 EAXEAX3232位二进制补码位二进制补码功能说明功能说明 有符号十进制数输入有符号十进制数输入钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微
87、型计算机原理及应用,清华大学出版社,2006200663例题5-18有符号十进制数输入程序-3readsidreadsid procproc; ;输入有符号十进制数子程序输入有符号十进制数子程序push ebxpush ebx; ;说明:负数用说明:负数用“- -”引导引导push ecxpush ecxpush edxpush edxxor ebx,ebxxor ebx,ebx;EBX;EBX保存结果保存结果xor ecx,ecxxor ecx,ecx;ECX;ECX为正负标志为正负标志:0 0为正,为正,- -1 1为负为负子程序名子程序名 READSIDREADSID出口参数出口参数 E
88、AXEAX3232位二进制补码位二进制补码功能说明功能说明 有符号十进制数输入有符号十进制数输入钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200664例题5-18有符号十进制数输入程序-4mov ah,1mov ah,1; ;输入一个字符输入一个字符int 21hint 21hcmp al,+cmp al,+; ;是是“”,继续输入字符,继续输入字符jz rsid1jz rsid1cmp al,-cmp al,-; ;是是“”,设置,设置1 1标志标志jnz rsid2jnz rsid2mov ecx,-1mov ecx,-1钱晓捷,微
89、型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200665例题5-18有符号十进制数输入程序-5rsid1:rsid1:mov ah,1mov ah,1; ;继续输入字符继续输入字符int 21hint 21hrsid2:rsid2:cmp al,0cmp al,0; ;不是不是0 09 9之间的字符,则输入数据结束之间的字符,则输入数据结束jb rsid3jb rsid3cmp al,9cmp al,9ja rsid3ja rsid3sub al,30hsub al,30h; ;是是0 09 9之间的字符,则转换为二进制数之间的字符,则转换为二进制
90、数钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200666例题5-18有符号十进制数输入程序-6imul ebx,10imul ebx,10; ;数值乘数值乘1010:EBXEBX10EBXEBX10movzx eax,almovzx eax,aladd ebx,eaxadd ebx,eax; ;与新输入数值相加与新输入数值相加jmp rsid1jmp rsid1; ;继续输入字符继续输入字符rsid3:rsid3:cmp ecx,0cmp ecx,0; ;是负数,进行求补是负数,进行求补jz rsid4jz rsid4neg ebxne
91、g ebxrsid4:rsid4:mov eax,ebxmov eax,ebx; ;设置出口参数设置出口参数pop edxpop edxpop ecxpop ecxpop ebxpop ebxretret; ;子程序返回子程序返回readsidreadsid endpendp钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200667例题5-18有符号十进制数输入程序-7dpcrlfdpcrlfprocproc; ;光标回车换行子程序光标回车换行子程序push axpush axpush dxpush dxmov ah,2mov ah,2mo
92、v dl,0dhmov dl,0dhint 21hint 21hmov ah,2mov ah,2mov dl,0ahmov dl,0ahint 21hint 21hpop dxpop dxpop axpop axretretdpcrlfdpcrlfendpendp钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200668共享变量传递参数l子程序和主程序使用同一个变量名存取数据子程序和主程序使用同一个变量名存取数据l变变量量定定义义和和使使用用不不在在同同一一个个源源程程序序中中,需需要要利利用用PUBLICPUBLIC、EXTRENEXTR
93、EN声明声明l共享变量传递参数,子程序的通用性较差共享变量传递参数,子程序的通用性较差l特特别别适适合合在在多多个个程程序序段段间间、尤尤其其在在不不同同的的程程序序模块间传递数据模块间传递数据钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200669例题5-19有符号十进制数输出程序-1l算法如下:算法如下:1.1.首首先先判判断断数数据据是是零零、正正数数或或负负数数,是是零零显显示示“0”0”退出;退出;2.2.是负数,显示是负数,显示“”,求数据的绝对值;,求数据的绝对值;3.3.接接着着数数据据除除以以1010,余余数数加加30H
94、30H转转换换为为ASCIIASCII码码压压入入堆栈;堆栈;4.4.重复第重复第3 3步,直到商为步,直到商为0 0结束;结束;5.5.依次从堆栈弹出各位数字,进行显示依次从堆栈弹出各位数字,进行显示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200670例题5-19有符号十进制数输出程序-2mov mov ecx,countecx,countmov ebx,0mov ebx,0again:again:mov mov eax,arrayebxeax,arrayebx*4*4mov mov dtemp,eaxdtemp,eax; ;入口参
95、数存放到共享变量入口参数存放到共享变量call call dispsiddispsid; ;调用子程序显示一个数据调用子程序显示一个数据inc inc ebxebxcall call dpcrlfdpcrlf; ;光标回车换行光标回车换行loop againloop again子程序名子程序名 DISPSIDDISPSID入口参数入口参数 DTEMPDTEMP3232位二进制补码位二进制补码功能说明功能说明 有符号十进制数显示有符号十进制数显示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200671例题5-19有符号十进制数输出程序-3d
96、ispsiddispsid procproc; ;显示有符号十进制数子程序显示有符号十进制数子程序push eaxpush eax; ;入口参数:共享变量入口参数:共享变量DTEMPDTEMPpush ebxpush ebxpush edxpush edxmov eax,dtempmov eax,dtemp ; ;取出显示数据取出显示数据test eax,eaxtest eax,eax; ;判断数据是零、正数或负数判断数据是零、正数或负数jnz dsid1jnz dsid1mov dl,0mov dl,0 ; ;是零,显示是零,显示“0”“0”后退出后退出mov ah,2mov ah,2int
97、 21hint 21hjmp dsid5jmp dsid5钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200672例题5-19有符号十进制数输出程序-4dsid1:dsid1:jns dsid2jns dsid2; ;是负数,显示是负数,显示“- -”mov ebx,eaxmov ebx,eax;EAX;EAX数据暂存于数据暂存于EBXEBXmov dl,-mov dl,-mov ah,2mov ah,2int 21hint 21hmov eax,ebxmov eax,ebxneg eaxneg eax; ;数据求补(绝对值)数据求补(绝
98、对值)子程序名子程序名 DISPSIDDISPSID入口参数入口参数 DTEMPDTEMP3232位二进制补码位二进制补码功能说明功能说明 有符号十进制数显示有符号十进制数显示钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200673例题5-19有符号十进制数输出程序-5dsid2:dsid2:mov ebx,10mov ebx,10push bxpush bx;10;10压入堆栈,作为退出标志压入堆栈,作为退出标志dsid3:dsid3:cmp eax,0cmp eax,0; ;数据(商)为零,转向显示数据(商)为零,转向显示jz dsi
99、d4jz dsid4sub edx,edxsub edx,edx; ;扩展被除数扩展被除数EDX.EAXEDX.EAXdiv ebxdiv ebx; ;数据除以数据除以1010:EDX.EAX10EDX.EAX10add dl,30hadd dl,30h; ;余数(余数(0 09 9)转换为)转换为ASCIIASCII码码push dxpush dx; ;数据先低位后高位压入堆栈数据先低位后高位压入堆栈jmp dsid3jmp dsid3钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200674例题5-19有符号十进制数输出程序-6dsid
100、4:dsid4:pop dxpop dx; ;数据先高位后低位弹出堆栈数据先高位后低位弹出堆栈cmp dl,10cmp dl,10; ;是结束标志是结束标志1010,则退出,则退出je dsid5je dsid5mov ah,2mov ah,2; ;进行显示进行显示int 21hint 21hjmp dsid4jmp dsid4dsid5:dsid5:pop edxpop edxpop ebxpop ebxpop eaxpop eaxretret; ;子程序返回子程序返回dispsiddispsid endpendp钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清
101、华大学出版社,2006200675堆栈传递参数l主主程程序序将将入入口口参参数数压压入入堆堆栈栈,子子程程序序从从堆堆栈栈中中取出参数取出参数l子子程程序序将将出出口口参参数数压压入入堆堆栈栈,主主程程序序弹弹出出堆堆栈栈取得它们取得它们l采采用用堆堆栈栈传传递递参参数数是是程程式式化化的的,它它是是编编译译程程序序处处理理参参数数传传递递、以以及及汇汇编编语语言言与与高高级级语语言言混混合合编程时的常规方法编程时的常规方法钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200676例题5-20计算有符号数平均值程序-1l算法如下:算法如下:
102、1.1.被加数进行符号扩展被加数进行符号扩展2.2.求和求和3.3.除以数据个数得到平均值除以数据个数得到平均值l3232位位有有符符号号数数扩扩展展到到6464位位,3232位位表表示示数数据据个个数(最大数(最大2 232 32 ) ,不会溢出,不会溢出子程序名子程序名 MEANMEAN入口参数入口参数 3232位数据个数和偏移地址压入堆栈位数据个数和偏移地址压入堆栈出口参数出口参数 EAXEAX平均值平均值功能说明功能说明 计算有符号数平均值计算有符号数平均值钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200677例题5-20计算有
103、符号数平均值程序-2mov mov eax,counteax,countpush push eaxeax; ;压入数据个数压入数据个数(0(0表示表示2 23232个个) )mov mov ebx,offsetebx,offset array arraypush push ebxebx; ;压入缓冲区的偏移地址压入缓冲区的偏移地址call meancall mean; ;调用子程序,求平均值调用子程序,求平均值add esp,8add esp,8; ;平衡堆栈平衡堆栈mov mov dmed,eaxdmed,eax; ;保存出口参数保存出口参数子程序名子程序名 MEANMEAN入口参数入口参数
104、 3232位数据个数和偏移地址压入堆栈位数据个数和偏移地址压入堆栈出口参数出口参数 EAXEAX平均值平均值功能说明功能说明 计算有符号数平均值计算有符号数平均值钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200678例题5-20计算有符号数平均值程序-3meanmeanprocproc; ;计算有符号数平均值计算有符号数平均值push ebppush ebpmov ebp,espmov ebp,esppush ebxpush ebx; ;保护寄存器保护寄存器push ecxpush ecxpush edxpush edxpush esi
105、push esipush edipush edimov ebx,mov ebx,ebp+6ebp+6; ;从堆栈取偏移地址从堆栈取偏移地址mov ecx,mov ecx,ebp+10ebp+10; ;从堆栈取数据个数从堆栈取数据个数堆栈示意图堆栈示意图钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200679例题5-20计算有符号数平均值程序-4xor esi,esixor esi,esi;ESI;ESI保存求和的低保存求和的低3232位值位值mov edi,esimov edi,esi;EDI;EDI保存求和的高保存求和的高3232位值位
106、值mean1:mean1:mov eax,ebxmov eax,ebx; ;取出一个数据取出一个数据EAXEAXcdqcdq; ;符号扩展符号扩展EDX.EAXEDX.EAXadd esi,eaxadd esi,eax; ;求和低求和低3232位位adc edi,edxadc edi,edx; ;求和高求和高3232位位add ebx,4add ebx,4; ;指向下一个数据指向下一个数据dec ecxdec ecx; ;数据个数减少一个数据个数减少一个jnz mean1jnz mean1; ;循环循环mov eax,esimov eax,esi; ;累加和在累加和在EDX.EAXEDX.EA
107、Xmov edx,edimov edx,edi钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200680例题5-20计算有符号数平均值程序-5mov ecx,ebp+10mov ecx,ebp+10; ;数据个数在数据个数在CXCXidiv ecxidiv ecx; ;有符号数除法,有符号数除法,E EAXAX平均值(平均值(E EDXDX余数)余数)pop edipop edi; ;恢复寄存器恢复寄存器pop esipop esipop edxpop edxpop ecxpop ecxpop ebxpop ebxpop ebppop eb
108、pretretmeanmeanendpendp钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200681宏汇编l宏(宏(MacroMacro):具有宏名的一段汇编语句序列):具有宏名的一段汇编语句序列l宏需要先定义宏需要先定义宏名宏名MACROMACRO 形参表形参表 ; ;宏定义体宏定义体ENDMENDMl然后程序中进行宏调用然后程序中进行宏调用宏名宏名 实体参数实体参数l宏定义体的标号必须用宏定义体的标号必须用LOCALLOCAL伪指令声明伪指令声明LOCAL LOCAL 标号标号1,1,标号标号2,2,钱晓捷,微型计算机原理及应用,清
109、华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200682例题5-21十六进制数输入程序-1; ;宏定义宏定义dispmsgdispmsgmacro messagemacro message;message;message是形式参数是形式参数push axpush axpush push dxdxmov ah,9mov ah,9lea lea dx,messagedx,messageintint 21h 21hpop pop dxdxpop axpop axendmendm钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006
110、200683例题5-21十六进制数输入程序-2asctohasctohmacromacrolocal asctoh1,asctoh2local asctoh1,asctoh2cmpcmp al,9 al,9jbejbe asctoh1 asctoh1;小于等于小于等于99,是,是0 09 9,只需减去,只需减去30H30Hcmpcmp al,aal,a jbjb asctoh2 asctoh2;大于大于99小于小于aa,是,是A AF F,还要减,还要减7 7sub al,20hsub al,20h;大于等于大于等于aa,是,是a af f,再减去,再减去20H20Hasctoh2:ascto
111、h2:sub al,7sub al,7asctoh1:asctoh1:sub al,30hsub al,30hendmendm钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200684例题5-21十六进制数输入程序-3; ;数据段数据段msgmsgdb Please input,13,10,$db Please input,13,10,$wvarwvardw ?dw ?; ;代码段代码段dispmsgdispmsg msgmsg; ;提示输入提示输入push axpush axpush push dxdxmov ah,9mov ah,9le
112、a lea dx,msgdx,msgintint 21h 21hpop pop dxdxpop axpop ax宏调用宏调用宏展开宏展开钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200685例题5-21十六进制数输入程序-4mov cx,4mov cx,4mov bx,0mov bx,0;BX;BX保存转换后的结果保存转换后的结果again:again:mov ah,6mov ah,6; ;输入字符但不显示输入字符但不显示mov dl,0ffh mov dl,0ffh intint 21h 21hjzjz again again; ;没
113、有输入字符继续没有输入字符继续功能编号功能编号 AHAH06H06H入口参数入口参数 DLDLFFHFFH(输入功能)(输入功能)DLDL欲显示的欲显示的ASCIIASCII字符(输出功能)字符(输出功能) 出口参数出口参数 ALALASCIIASCII字符字符功能说明功能说明 输入功能:输入功能:按键检测,按键检测,无回显输入无回显输入标标志志ZFZF反反映映是是否否按按键键:为为零零条条件件Z Z(ZFZF1 1)无无按按键键,不不为为零零条条件件NZNZ(ZFZF0 0)有有按按键键;ALAL输入字符的输入字符的ASCIIASCII码码输出功能:与输出功能:与02H02H功能调用一样功能
114、调用一样功能调用功能调用钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200686例题5-21十六进制数输入程序-5cmpcmp al,0 al,0; ;测试是否是合法字符测试是否是合法字符jbjb againagain; ;没有输入合法字符,重新输入没有输入合法字符,重新输入cmpcmp al,9 al,9jbejbe nextnext; ;输入合法字符就显示输入合法字符就显示cmpcmp al,Aal,A jbjb again againcmpcmp al,Fal,F jbejbe next nextcmpcmp al,aal,a jb
115、jb again againcmpcmp al,fal,f jaja again again; ;测试结束测试结束钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200687例题5-21十六进制数输入程序-6next:next:mov ah,6mov ah,6; ;显示输入字符显示输入字符mov mov dl,aldl,alintint 21h 21hasctohasctoh; ;转换为十六进制数转换为十六进制数shlshl bx,4 bx,4; ;将上次输入左移二进制将上次输入左移二进制4 4位位add add bl,albl,al; ;加
116、上本次输入的数码加上本次输入的数码loop againloop againmov mov wvar,bxwvar,bxcmpcmp al,9 al,9jbejbe ?0000 ?0000cmpcmp al,aal,a jbjb ?0001 ?0001sub al,20hsub al,20h?0001:?0001:sub al,7sub al,7?0000:?0000:sub al,30hsub al,30h宏展开宏展开钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200688宏与子程序l都简化源程序的书写,但有本质区别都简化源程序的书写,但
117、有本质区别l宏调用宏调用在汇编时复制宏定义语句在汇编时复制宏定义语句执行时不存在控制的转移与返回执行时不存在控制的转移与返回没有减少汇编后的目标代码没有减少汇编后的目标代码执行速度也没有改变执行速度也没有改变l子程序调用子程序调用在执行时控制转移到子程序在执行时控制转移到子程序子程序没有被复制,汇编后的目标代码较短子程序没有被复制,汇编后的目标代码较短会影响程序执行速度会影响程序执行速度l宏与子程序各有特点,根据具体问题选择使用宏与子程序各有特点,根据具体问题选择使用当程序段较短或要求较快执行时,应选用宏当程序段较短或要求较快执行时,应选用宏当程序段较长或为减小目标代码时,要选用子程序当程序段
118、较长或为减小目标代码时,要选用子程序钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200689源文件包含INCLUDEINCLUDE 文件名文件名l将将INCLUDEINCLUDE伪指令指定的文本文件内容插入源程序伪指令指定的文本文件内容插入源程序l可以包含任何文本文件可以包含任何文本文件一些常用的或有价值的宏定义存放在一些常用的或有价值的宏定义存放在.MAC.MAC宏定义文件宏定义文件各种常量定义、声明语句等组织在各种常量定义、声明语句等组织在.INC.INC包含文件包含文件常用的子程序形成常用的子程序形成.ASM.ASM汇编语言源文件汇
119、编语言源文件l利利用用INCLUDEINCLUDE伪伪指指令令包包含含其其他他文文件件,其其实实质质仍仍然然是是一一个源程序,只不过是分在了几个文件书写个源程序,只不过是分在了几个文件书写include eg521e.macinclude eg521e.mac; ;宏定义文件宏定义文件EG321E.MACEG321E.MAC; ;只对主程序文件进行汇编、连接只对主程序文件进行汇编、连接举例钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200690子程序模块l子程序单独编写,汇编形成目标模块子程序单独编写,汇编形成目标模块OBJOBJ文件文件
120、l连接时输入子程序模块文件名连接时输入子程序模块文件名1.1.用共用伪指令用共用伪指令PUBLICPUBLIC和外部伪指令和外部伪指令EXTERNEXTERN声明声明PUBLIC PUBLIC 标识符标识符 ,标识符标识符 ; ;定义标识符的模块使用定义标识符的模块使用EXTERN EXTERN 标识符标识符: :类型类型 ,标识符标识符: :类型类型 ; ;调用标识符的模块使用调用标识符的模块使用2.2.子程序在代码段,没有开始执行和结束执行点子程序在代码段,没有开始执行和结束执行点3.3.采用简化段源程序格式,存储模式一致采用简化段源程序格式,存储模式一致4.4.解决参数传递问题解决参数传
121、递问题钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200691例题5-22数据输入输出程序-1;eg522s.asm;eg522s.asm(子程序文件)(子程序文件).model small.model small; ;相同的存储模式相同的存储模式.486.486public public readsid,dispsid,meanreadsid,dispsid,mean ; ;子程序共用子程序共用extern extern dtemp:dworddtemp:dword; ;外部变量外部变量.code.code; ;代码段代码段readsi
122、dreadsid procproc ; ;输入子程序输入子程序dispsiddispsid procproc ; ;输出子程序输出子程序meanmeanprocproc ; ;计算平均值子程序计算平均值子程序endend钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200692例题5-22数据输入输出程序-2;eg522.asm;eg522.asm(主程序文件)(主程序文件).model small.model small; ;相同的存储模式相同的存储模式.486.486extern extern readsid:near,dispsid:
123、near,mean:nearreadsid:near,dispsid:near,mean:near; ;外部子程序外部子程序public public dtempdtemp; ;变量共用变量共用.stack.stack.data.datacountcount= 10= 10arrayarraydddd count dup(0) count dup(0)dtempdtempdddd ? ?钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200693例题5-22数据输入输出程序-3.code.code.startup.startupmov mov
124、 dx,offsetdx,offset msg1 msg1; ;提示输入提示输入1010个数据个数据mov ah,9mov ah,9intint 21h 21hmov mov ecx,countecx,count; ;输入输入1010个数据个数据mov mov ebx,offsetebx,offset array arrayagain:again:call call readsidreadsid; ;输入一个数据输入一个数据mov mov ebx,eaxebx,eax add ebx,4add ebx,4call call dpcrlfdpcrlf loop againloop again钱晓
125、捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200694例题5-22数据输入输出程序-4mov mov eax,counteax,count; ;传递参数传递参数push push eaxeaxmov mov ebx,offsetebx,offset array arraypush push ebxebx call meancall mean; ;求平均值求平均值add esp,8add esp,8mov mov dtemp,eaxdtemp,eax; ;保存保存mov mov dx,offsetdx,offset msg2 msg2; ;提
126、示输出平均值提示输出平均值mov ah,9mov ah,9intint 21h 21hcall call dispsiddispsid; ;显示平均值显示平均值.exit.exit钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200695子程序库l子子程程序序库库文文件件(.LIB.LIB):子子程程序序模模块块的的集集合合,存存放放着着各各子子程程序序的的名名称称、目目标标代代码码以以及及有有关关定位信息等定位信息等l利用利用LIB.EXELIB.EXE创建、管理子程序库创建、管理子程序库1.1.连接时输入子程序库文件名连接时输入子程序库
127、文件名2.2.使用子程序库包含伪指令使用子程序库包含伪指令INCLUDELIBINCLUDELIBINCLUDELIBINCLUDELIB 库文件名库文件名; ;像汇编连接一个源程序文件一样操作像汇编连接一个源程序文件一样操作钱晓捷,微型计算机原理及应用,清华大学出版社,钱晓捷,微型计算机原理及应用,清华大学出版社,2006200696第5章教学要求l理解目标地址的转移范围和寻址方式理解目标地址的转移范围和寻址方式l掌握控制转移指令掌握控制转移指令处理器指令:处理器指令:JMPJMP,JccJcc,LOOPLOOP,JECXZJECXZ,CALLCALL,RETRET伪指令:伪指令:PROC/
128、ENDPPROC/ENDP,MACRO/ENDMMACRO/ENDM,INCLUDEINCLUDE,INCLUDELIBINCLUDELIBl熟悉各种程序结构及其编程方法熟悉各种程序结构及其编程方法单分支、双分支、多分支单分支、双分支、多分支计数控制循环、条件控制循环计数控制循环、条件控制循环子程序、宏,文件包含,子程序模块和子程序库子程序、宏,文件包含,子程序模块和子程序库l熟悉常见编程问题熟悉常见编程问题奇偶校验,地址表,数据范围的判断奇偶校验,地址表,数据范围的判断字符或数据个数统计,求最小值、最大值,字符删除字符或数据个数统计,求最小值、最大值,字符删除二进制、十进制、十六进制数据相互转换二进制、十进制、十六进制数据相互转换二进制、十进制、十六进制数据的键盘输入和显示输出二进制、十进制、十六进制数据的键盘输入和显示输出第第5 5章习题章习题l 5.5 5.55.8 5.11 5.135.8 5.11 5.135.155.15l 5.18 5.20 5.21 5.22 5.26 5.18 5.20 5.21 5.22 5.26习题习题