计算机硬件技术基础:第4章 汇编程序2

上传人:博****1 文档编号:569476207 上传时间:2024-07-29 格式:PPT 页数:173 大小:1.32MB
返回 下载 相关 举报
计算机硬件技术基础:第4章 汇编程序2_第1页
第1页 / 共173页
计算机硬件技术基础:第4章 汇编程序2_第2页
第2页 / 共173页
计算机硬件技术基础:第4章 汇编程序2_第3页
第3页 / 共173页
计算机硬件技术基础:第4章 汇编程序2_第4页
第4页 / 共173页
计算机硬件技术基础:第4章 汇编程序2_第5页
第5页 / 共173页
点击查看更多>>
资源描述

《计算机硬件技术基础:第4章 汇编程序2》由会员分享,可在线阅读,更多相关《计算机硬件技术基础:第4章 汇编程序2(173页珍藏版)》请在金锄头文库上搜索。

1、第第4 4章章4.4汇编语言程序设计的基本方法汇编语言程序设计的基本方法4.4.1编写汇编程序的基本问题编写汇编程序的基本问题1.程序的质量标准程序的质量标准(1)程序正确完整)程序正确完整(2)程序易读性)程序易读性(3)程序的执行时间)程序的执行时间(4)程序所占内存大小及程序行数)程序所占内存大小及程序行数4.4.1编写汇编程序的基本问题编写汇编程序的基本问题2.程序设计的一般步骤程序设计的一般步骤(1)分析实际问题,建立数学模型)分析实际问题,建立数学模型(2)确定算法)确定算法(3)程序模块分析)程序模块分析(4)按算法画出程序流程图)按算法画出程序流程图(5)分配内存)分配内存/R

2、EG(6)按流程图编写程序)按流程图编写程序(7)上机调试、修改,最后检测通过)上机调试、修改,最后检测通过4.4.1编写汇编程序的基本问题编写汇编程序的基本问题3.编程考虑编程考虑(1)合合理理选选用用代代码码段段、数数据据段段、堆堆栈栈段段和和附附加加段段,确定数据段中的原始数据区和工作单元。确定数据段中的原始数据区和工作单元。(2)程程序序结结构构尽尽可可能能简简单单、清清楚楚,选选用用执执行行速速度度快快、占占用用内内存存少少的的指指令令,合合理理使使用用寄寄存存器器,尽尽量量是是操操作在寄存器之间进行,减少访问内存的次数。作在寄存器之间进行,减少访问内存的次数。(3)提提高高源源程程

3、序序的的可可读读性性和和可可维维护护性性,必必要要时时应应提提供简明的注释。供简明的注释。程序的基本结构程序的基本结构l顺序结构顺序结构l 分支结构分支结构l 循环结构循环结构l 子程结构子程结构顺序结构顺序结构两个分支两个分支YN 、 CMP AL, BL JG great JMP exitgreat: exit: 、 、 ALBL处理处理AL BL处理处理分支结构分支结构三个分支三个分支 、 CMP AL, 0 JG great JL less JMP exitless: JMP exitgreat: exit: 、AL= =0处理处理AL0处理处理ALB)(AB)(A=B)若为有符号数,

4、则可供使用的条件有:若为有符号数,则可供使用的条件有:G(NLE)GE(NL)E(Z)NG(LE)NGE(L)NE(NZ)注意:包括了判断一个数据是否等于某一常量的情况注意:包括了判断一个数据是否等于某一常量的情况。1.条件的建立方法条件的建立方法2.条件判断和转移的方法条件判断和转移的方法(1)利用建立条件的指令实现分支)利用建立条件的指令实现分支在需要分支的地方用在需要分支的地方用比较指令比较指令CMP串比较指令串比较指令CMPS串搜索指令串搜索指令SCASAND、OR、TEST等等用各种条件转移指令实现分支用各种条件转移指令实现分支转移(二)单分支结构(二)单分支结构条条件件成成立立跳跳

5、转转,否否则则顺顺序序执执行行分分支支语语句体句体注注意意选选择择正正确确的的条条件件转转移移指指令令和和转转移移目标地址目标地址实例:求绝对值实例:求绝对值例:计算例:计算AX中有符号数的绝对值中有符号数的绝对值cmpcmp ax,0 ax,0jgejge nonnegnonneg;条件满足(条件满足(AX0AX0),),转移转移negneg ax ax;条件不满足,求补条件不满足,求补nonnegnonneg: : movmov result,ax result,ax ;条件满足条件满足;不恰当的分支;不恰当的分支cmpcmp ax,0 ax,0jljl yesnegyesneg;条件满足

6、(条件满足(AXAX0 0),),转移转移jmpjmp nonnegnonnegyesnegyesneg: : negneg ax ax;条件不满足,求补条件不满足,求补nonnegnonneg: : movmov result,ax result,ax ;条件满足条件满足(三)双分支结构(三)双分支结构条条件件成成立立跳跳转转执执行行第第2个个分分支支语语句句体体,否否则则顺顺序序执执行第行第1个分支语句体个分支语句体注注意意第第1个个分分支支体体后后一一定定要要有有一一个个JMP指指令令跳跳到到第第2个分支体后个分支体后实例:显示实例:显示BX的最高位的最高位例:显示例:显示BX的的最高位

7、最高位shlbx,1;BX最高位移入最高位移入CF标志标志jcone;CF1,即最高位为即最高位为1,转移,转移movdl,30h;CF0,即最高位为即最高位为0:DL30H0jmptwo;一定要跳过另一个分支体一定要跳过另一个分支体one:movdl,31h;DL31H1two:movah,2int21h;显示显示可以用可以用JNC替换替换JC例:显示例:显示BX的的最高位最高位(续)(续)shlbx,1;BX最高位移入最高位移入CF标志标志jncone;CF0,即最高位为即最高位为0,转移,转移movdl,31h;CF1,即最高位为即最高位为1:DL31H1jmptwo;一定要跳过另一个分

8、支体一定要跳过另一个分支体one:movdl,30h;DL30H0two:movah,2int21h;显示显示转换为单分支结构转换为单分支结构例:显示例:显示BX的的最高位最高位(另解)(另解)movdl,0;DL30H0shlbx,1;BX最高位移入最高位移入CF标志标志jnctwo;CF0,即最高位为即最高位为0,转移,转移movdl,1;CF1,即最高位为即最高位为1:DL31H1two:movah,2int21h;显示显示编写分支程序,需留心分支的开始和结束编写分支程序,需留心分支的开始和结束例:显示例:显示BX的的最高位最高位(无分支)(无分支)movdl,0shlbx,1;BX最高

9、位移入最高位移入CF标志标志adcdl,30h;CF0,DL030h030H0;CF1,DL030h131H1two: movah,2int21h;显示显示例例4.5分支结构分支结构变量变量X的符号函数可用下式表示的符号函数可用下式表示:Y=1,当当X0;X值值存存放放在在XX中中,函函数数Y的的值值0,当当X=0存放在存放在YY中。中。-1,当当X0程序:程序:DATASEGMENTXXDBXYYDB?DATAENDS.START:MOVAX,DATAMOVDS,AXMOVAL,XXANDAL,ALJNSL1;X0L1MOVYY,-1;X0JMPL3L2:MOVYY,0L3:MOVAH,4C

10、HINT21HCODEENDSENDSTART例例4.5分支结构分支结构例例4.6分支结构分支结构比比较较数数据据段段中中两两个个无无符符号号数数N1和和N2的的大大小小,将将大大者存入内存单元者存入内存单元MAX。DATASEGMENTDATEDBN1,N2MAXDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETDATEMOVAL,SIINCSICMPAL,SIJAENEXT;ALSI转去转去NEXTMOVAL,SI;否则使否则使ALSINEXT:MOVMAX,AL;AL中的大值存入中

11、的大值存入MAXMOVAH,4CHINT21HCODEENDSENDSTART例例4.6分支结构(续分支结构(续)(四)多分支结构四)多分支结构多多分分支支结结构构是是多多个个条条件件对对应应各各自自的的分分支支语语句句体体,哪哪个个条条件件成成立立就就转转入入相相应分支体执行应分支体执行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YNorah,ah;cmpah,0jzfunction0decah;cmpah,1jzfunction1decah;cmpah,2jzfunction2(2)利用跳转表实现分支)利用跳转表实现分支常用于多路分支的情况常用于多路分支

12、的情况跳跳转转表表为为内内存存的的一一段段连连续续单单元元,存存放放着着一一系系列列跳跳转转地址和跳转指令,因此,可分为两种情况地址和跳转指令,因此,可分为两种情况:根据表内地址分支根据表内地址分支程程序序中中需需要要N路路分分支支,每每路路程程序序入入口口地地址址分分别别为为SUB0,SUB1,把把这这些些入入口口地地址址组组成成一一个个表表,称称为为跳跳转转表表。表表内内每每两两个个字字节节存存放放一一个个入入口口地地址址的的偏偏移移量量,或或4个个字字节节存存放放CS:IP(段段间间),然然后后根根据据一一定定的的算算法法计计算算出出子子程程序序入入口口地地址址在在跳跳转转表表中中的的位

13、位置置,从从而而得得到到子子程程序序的的入入口口地地址址,然然后后用用JMP或或CALL指令转去执行。指令转去执行。例例4.18现有若干个程序段,每一程序段的入口地址分别是现有若干个程序段,每一程序段的入口地址分别是SUB1,SUB2,SUBn。试编制一程序,根据指定的参数转入相应的程序段。试编制一程序,根据指定的参数转入相应的程序段。TITLEEXAMPLEOFJUMPTABLE1DATASEGMENT;定义子程序的入口地址表;定义子程序的入口地址表TABLEDWSUB1,SUB2,SUB3,SUBnPARAMDB3;1n中的任何数中的任何数DATAENDSSTACKSEGMENTPARAS

14、TACKSTACKDW10DUP(0)STACKENDSCOSEGSEGMENTPARASTACKASSUMECS:COSEG,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVAL,PARAMMOVAH,0DECAL;参数值减;参数值减1SHLAL,1;乘以;乘以2MOVBX,OFFSETTABLEADDBX,AX;加上偏移地址;加上偏移地址JMPWORDPTRBX例例4.18现有若干个程序段,每一程序段的入口地址分别是现有若干个程序段,每一程序段的入口地址分别是SUB1,SUB2,SUBn。试编制一程序,根据指定的参数转入相应的程序段。试编制一程序,根据

15、指定的参数转入相应的程序段。SUB1:JMPEND0SUB2:JMPEND0SUB3:JMPEND0SUBnEND0:MOVAH,4CHINT21HCOSEGENDSENDBEGIN例例4.7:利用汇编语言编制多分支(散转)程序:利用汇编语言编制多分支(散转)程序假设:假设:CASE语句语句INDEX0:F=2x1:F=y-x/22:F=2y3:F=y/24:F=100根据不同的根据不同的INDEX值分别完成不同的计算值分别完成不同的计算程序:程序:DSEGSEGMENTINDEXDB2ADRXDB12HADRYDB34HTABLEDWSUB0,SUB1,SUB2,SUB3,SUB4RESUL

16、TDB?DSEGENDSSSEGSEGMENTPARASTACKSTACKDB256DUP(0)SSEGENDSCSEGSEGMENTASSUNECS:CSEGDS:DSEGSS:SSEGSTARTPROCFARPUSHDSMOVAX,0PUSHAX例例4.7:利用汇编语言编制多分支(散转)程序:利用汇编语言编制多分支(散转)程序MOVAX,DSEGMOVDS,AXMOVBX,OFFSETTABLEMOVSIINDEXADDSI,SIJMPWORDPTRBX+SISUB0:MOVAL,ADRXSHLAL,1MOVRESULT,ALRETSUB1:MOVAL,ADRXSARAL,1MOVAH,A

17、DRYSUBAH,AHMOVRESLIT,AHRET例例4.7:利用汇编语言编制多分支(散转)程序:利用汇编语言编制多分支(散转)程序SUB2:MOVAL,ADRYSHLAL,1MOVRESULT,ALRETSUB3:MOVAL,ADRYSARAL,1MOVRESULT,ALRETSUB4:MOVRESULT,100RETSTARTENDPCSEGENDSENDSTART例例4.7:利用汇编语言编制多分支(散转)程序:利用汇编语言编制多分支(散转)程序根据表内指令分支根据表内指令分支跳转表中可以由若干跳转指令组成跳转表中可以由若干跳转指令组成这这时时,跳跳转转表表中中内内容容不不是是作作为为地

18、地址址取取出出,而而是子程序的是子程序的转移指令转移指令。a.首先用转移到跳转表的相应指令首先用转移到跳转表的相应指令b.然然后后再再从从这这里里转转移移到到所所要要求求的的子子程程序序进进行行处理。处理。例:例:P181程序:程序:DSEGSEGMENTINDEXDB2ADRXDB12HADRYDB34H;TABLEDWSUB0,SUB1,SUB2,SUB3,SUB4RESULTDB?DSEGENDSSSEGSEGMENTPARASTACKSTACKDB256DUP(0)SSEGENDSCSEGSEGMENTASSUNECS:CSEGDS:DSEGSS:SSEGSTARTPROCFARPUS

19、HDSMOVAX,0PUSHAX例例4.7:利用汇编语言编制多分支(散转)程序命令表:利用汇编语言编制多分支(散转)程序命令表MOVAX,DSEGMOVDS,AX;MOVBX,OFFSETTABLEMOVSIINDEXMOVAX,SIADDSI,SIADDSI,AX;SI=INDEX*3JMPWORDPTRBASE+SIBASE:JMPSUB0;命令表命令表JMPSUB1JMPSUB2JMPSUB3JMPSUB4例例4.7:利用汇编语言编制多分支(散转)程序命令表:利用汇编语言编制多分支(散转)程序命令表SUB0:MOVAL,ADRXSHLAL,1MOVRESULT,ALRETSUB1:MOV

20、AL,ADRXSARAL,1MOVAH,ADRYSUBAH,AHMOVRESLIT,AHRET.例例4.7:利用汇编语言编制多分支(散转)程序命令表:利用汇编语言编制多分支(散转)程序命令表4.4.4循环结构程序设计循环结构程序设计循循环环程程序序结结构构是是满满足足一一定定条条件件的的情情况况下下,重重复执行某段程序。复执行某段程序。1.循环结构程序的组成循环结构程序的组成通常有通常有4个部分:个部分:(1)循循环环初初始始部部分分为为开开始始循循环环准准备备必必要要的的条条件件,如循环次数、地址指针、循环体需要的数值等如循环次数、地址指针、循环体需要的数值等(2)循环体循环体部分部分指重复

21、执行的程序部分,核心指重复执行的程序部分,核心(3)参参数数修修改改部部分分修修改改操操作作数数地地址址、循循环环次次数等数等(4)循循环环控控制制部部分分判判断断循循环环条条件件是是否否成成立立,决决定是否继续循环定是否继续循环1.循环结构程序的组成循环结构程序的组成说明:说明:循环体和循环判断这两部分必须有。循环体和循环判断这两部分必须有。初初始始化化部部分分只只执执行行一一次次,必必须须保保证证部部分分中中没没有有转转向向初初始始化化的的语语句句,否否则则会会造造成成死死循环。循环。2.循环结构循环结构循环结构程序循环结构程序的设计关键是循环控制部分的设计关键是循环控制部分循循环环控控制

22、制可可以以在在进进入入循循环环体体之之前前进进行行,也也可以在循环体后进行,于是形成两种结构:可以在循环体后进行,于是形成两种结构:“先判断、后循环先判断、后循环”结构结构“先循环、后判断先循环、后判断”结构结构图示图示2.循环结构循环结构3.循环控制方法循环控制方法循循环环结结束束的的控控制制可可以以用用循循环环次次数数,还还可可以以用特定条件等,于是又有:用特定条件等,于是又有:计数控制循环计数控制循环条件控制循环条件控制循环图示图示(1)计数控制循环)计数控制循环计计数数控控制制循循环环利利用用循循环环次次数数作为控制条件作为控制条件易易于于采采用用循循环环指指令令LOOP和和JCXZ实

23、现实现初初始始化化:将将循循环环次次数数或或最最大大循循环次数置入环次数置入CX循环体循环体循循环环控控制制:用用LOOP指指令令对对CX减减1、并判断是否为、并判断是否为0例例4.20统计某数据区内负数的个数。统计某数据区内负数的个数。设设数数据据区区的的第第一一单单元元存存放放数数据据个个数数,从从第第二二单单元元开开始始存存放放数数据据,最最后后一一个个单单元元存存放放结果结果。为为统统计计数数据据区区内内负负数数的的个个数数,需需要要逐逐个个判判断断数数据据区区内内的的每每一一个个数数据据,然然后后将将所所有有数数据据中中凡凡是是符符号号位位为为1的的数数据据的的个个数数累累加加起起来

24、来,即即得得数数据据区区内内所所有有负负数数的的个个数数。该该循循环应该采用计数控制。环应该采用计数控制。例例4.20统计某数据区内负数的个数。统计某数据区内负数的个数。DATASEGMENTORG3000HTABLE50,1,-1,2,3,-7,DATAENDSSTACKSEGMENTPARASTACKSTACKDW64DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATASTART:MOVDI,3000H;设数据区首址;设数据区首址MOVCL,DI;送数据个数;送数据个数XORCH,CH;CH清清0MOVBL,CH;BL清清0INC

25、DI;指针指向第一个数据;指针指向第一个数据A1:MOVAL,DITESTAL,80H;数据首位是否为;数据首位是否为1JEA2INCBL;负数个数累加;负数个数累加A2:INCDILOOPA1MOVDI,BL;存结果;存结果例例4.20统计某数据区内负数的个数。统计某数据区内负数的个数。MOVAH,4CHINT21HCODEENDSENDSTART例:用二进制显示例:用二进制显示BL内容内容movcx,8;CX8(循环次数)循环次数)again: shlbl,1;左移进左移进CF,从高位开始显示从高位开始显示movdl,0;MOV指令不改变指令不改变CFadcdl,30h ;DL030HCF

26、;CF若是若是0,则,则DL0;CF若是若是1,则,则DL1movah,2int21h;显示显示loopagain;CX减减1,如果,如果CX未减至未减至0,则循环,则循环计数控制循环计数控制循环先循环后判断先循环后判断例例4.8求数组元素的最大值和最小值求数组元素的最大值和最小值;数据段数据段arraydw10;假设一个数组,其中头个数据假设一个数组,其中头个数据10表示元素个数表示元素个数dw-3,0,20,900,587,-632,777,234,-34,-56;这是一个有符号字量元素组成的数组这是一个有符号字量元素组成的数组maxay dw?;存放最大值存放最大值minay dw?;存

27、放最小值存放最小值初始化:循环次数元素个数初始化:循环次数元素个数1循环体:逐个比较求最大、小值循环体:逐个比较求最大、小值循环控制:比较完所有数据循环控制:比较完所有数据例例4.8代码段代码段;代码段;代码段leasi,arraymovcx,si;取得元素个数取得元素个数deccx;减;减1后是循环次数后是循环次数addsi,2movax,si;取出第一个元素给取出第一个元素给AX,AX用于暂存最大值用于暂存最大值movbx,ax;取出第一个元素给取出第一个元素给BX,BX用于暂存最小值用于暂存最小值初始化例例4.8代码段(续)代码段(续)maxck: addsi,2cmpsi,ax;与下一

28、个数据比较与下一个数据比较jleminckmovax,si;AX取得更大的数据取得更大的数据jmpnextminck:cmpsi,bxjgenextmovbx,si;BX取得更小的数据取得更小的数据next:loopmaxck;计数循环计数循环movmaxay,ax ;保存最大值保存最大值movminay,bx;保存最小值保存最小值循环体例例4.21统计统计1的个数的个数AX寄寄存存器器中中有有一一个个16位位二二进进制制数数,统统计计其其中中1的的个个数数,结结果果存存放在放在CX寄存器中。寄存器中。MOVCX,16;置计数器初值置计数器初值MOVBX,0LP:SALAX,1;AX的的最最高

29、高位位移移至至CF中中JNCZERO;CF=0,转,转ZEROINCBX;CF=1,结果计数器加结果计数器加1ZERO:LOOPLPMOVCX,BXHLT(2)条件控制循环)条件控制循环条条件件控控制制循循环环需需要要利利用用特特定定条条件件判判断循环是否结束断循环是否结束条条件件控控制制循循环环用用条条件件转转移移指指令令判判断断循环条件循环条件转转移移指指令令可可以以指指定定目目的的标标号号来来改改变变程程序序的的运运行行顺顺序序,如如果果目目的的标标号号指指向向一一个个重重复复执执行行的的语语句句体体的的开开始始或或结束,便构成了循环控制结构结束,便构成了循环控制结构例例4.21统计统计

30、1的个数先判断后执行的个数先判断后执行AX寄寄存存器器中中有有一一个个16位位二二进进制制数数,统统计计其其中中1的的个个数数,结结果果存存放在放在CX寄存器中。寄存器中。MOVCX,0;置结果计数器初值置结果计数器初值LP:ANDAX,AX;AX=0?JZEXIT;是,退出循环是,退出循环SALAX,1;否,否,AX的最高位移到的最高位移到CFJNCZERO;CF=0,转,转ZERO继续循环继续循环INCCX;CF=1,结果计数器加结果计数器加1ZERO:JMPLPEXIT:例:显示以例:显示以0结尾的字符串结尾的字符串;数据段;数据段string dbLetushaveatry!,0;代码

31、段代码段movbx,offsetstringagain: movdl,bxcmpdl,0jzdone;为;为0结束结束movah,2;不为不为0,显示,显示int21hincbx;指向下一个字符指向下一个字符jmpagaindone:条件控制循环条件控制循环先判断后循环先判断后循环例例4.10记录某个字存储单元数据中记录某个字存储单元数据中1的个数的个数;数据段数据段number dw1110111111100100B;代码段代码段movbx,numberxordl,dl;循环初值:循环初值:DL0again:testbx,0ffffh ;也可以用也可以用cmpbx,0jzdone;全部是全部

32、是0就可以退出循环,减少循环次数就可以退出循环,减少循环次数shlbx,1;用指令用指令shrbx,1也可以也可以adcdl,0;利用利用ADC指令加指令加CF的特点进行计数的特点进行计数jmpagain条件控制循环条件控制循环先判断后循环先判断后循环例例4.10十进制显示(十进制显示(016数值)数值)done: cmpdl,10;判断判断1的个数是否小于的个数是否小于10jbdigit;1的个数小于的个数小于10,转移,转移pushdxmovdl,1;1的个数大于或等于的个数大于或等于10movah,2;则要先显示一个则要先显示一个1int21hpopdxsubdl,10digit:add

33、dl,0;显示个数显示个数movah,2int21h单分支结构单分支结构(3)多重循环多重循环当当循环体只有顺序结构或分支结构时循环体只有顺序结构或分支结构时-单重循环结构单重循环结构若循环体中包含另外一个或几个循环体若循环体中包含另外一个或几个循环体-多重循环结构多重循环结构1.循环结构循环结构双重循环结构双重循环结构外层循环初始化外层循环初始化外层程序段外层程序段1 1内层循环初始化内层循环初始化内层循环体内层循环体内层循环控制内层循环控制外层程序段外层程序段2 2外层循环控制外层循环控制外层程序段外层程序段3 3内内层层循循环环外外层层循循环环双重循环结构双重循环结构(3)多重循环多重循

34、环说明说明:1.多多重重循循环环中中,内内循循环环必必须须完完整整地地包包含含在在外外循循环环中中,循环可以嵌套、并列,但不可以交叉。循环可以嵌套、并列,但不可以交叉。2.可可以以从从内内循循环环直直接接跳跳到到外外循循环环,但但不不可可以以直直接接从从外外循环跳到内循环。循环跳到内循环。3.分分清清循循环环的的层层次次,不不要要使使循循环环回回到到初初始始化化部部分分,否否则会出现死循环。则会出现死循环。例例4.22软件延时程序。软件延时程序。SOFTDLYPROCMOVBL,10;4DELAY:MOVCX,2801;4WAIT:LOOPWAIT;延迟;延迟10ms;17/5DECBL;3J

35、NZDELAY;延迟延迟100ms;16/4RET;SOFTDLYENDP设设CPU时钟周期时钟周期T=210s延时时间延时时间t计算如下:计算如下:t=4+10 (4+(2801 1712)+3+16)12+20 T例例4.11多重循环举例多重循环举例例例:数数据据段段BUFFER数数组组有有100个个字字数数据据,统统计计该该数数组组中中所所有有等等于于“1”的的位位的的个个数数,统统计计结结果存入果存入RESULT单元。单元。例例4.11多重循环举例多重循环举例DATASEGMENTBUFFERDW;共;共100个字数据个字数据COUNTEQU100RESULTDW?DATAENDSCO

36、DESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBUFFER;MOVCH,COUNTMOVBX,0LOP1:MOVAX,SI;MOVCL,16LOP2:SALAX,1内内外外JNCNEXT循循循循INCBX环环环环NEXT:DECCL;注意:不能用注意:不能用JNZLOP2;LOOPLOP2代替代替INCSIINCSIDECCHJNZLOP1;MOVRESULT,BXCODEENDSENDSTART4.5子程序结构设计子程序结构设计把把功功能能相相对对独独立立的的程程序序段段单单独独编编写写和和调调试试,作作为

37、为一一个个相相对对独独立立的的模模块块供供程程序序使使用用,就就形成形成子程序子程序子子程程序序可可以以实实现现源源程程序序的的模模块块化化,可可简简化化源程序结构,可以提高编程效率源程序结构,可以提高编程效率主主程程序序(调调用用程程序序)需需要要利利用用CALL指指令令调调用子程序(被调用程序)用子程序(被调用程序)子程序子程序需要利用需要利用RET指令返回主程序指令返回主程序4.5.1子程序设计方法子程序设计方法1.子程序(过程)定义子程序(过程)定义汇汇编编语语言言中中,子子程程序序要要用用一一对对过过程程伪伪指指令令PROC和和ENDP声明,格式如下:声明,格式如下:过程名过程名PR

38、OCNEAR|FAR;过程体过程体RET过程名过程名ENDP可可选选的的参参数数指指定定过过程程的的调调用用属属性性。没没有有指指定定过过程程属属性,则采用默认属性(性,则采用默认属性(NEAR)NEARNEAR属属性性(段段内内近近调调用用)的的过过程程只只能能被被相相同同代代码段的其他程序调用码段的其他程序调用FARFAR属属性性(段段间间远远调调用用)的的过过程程可可以以被被相相同同或或不不同代码段的程序调用同代码段的程序调用2.主程序与子程序的接口主程序与子程序的接口1.调用调用CALL指令,将断点进栈,保护断点指令,将断点进栈,保护断点段内调用段内调用IP进栈进栈段间调用段间调用CS

39、、IP进栈进栈2.执行子程序执行子程序3.子程序返回,子程序返回,RET指令,将断点出栈,恢复断点指令,将断点出栈,恢复断点4.从断点处继续执行从断点处继续执行CALL *断点:断点:*入口地址:入口地址: . . .RET转子转子转子转子返主返主返主返主3.保护保护/恢复现场(主要指恢复现场(主要指REG)方法方法1:在在进进入入子子程程序序时时,首首先先将将有有关关寄寄存存器器的的内内容容保保存存在在堆栈中。堆栈中。当当子子程程序序执执行行完完,返返回回主主程程序序之之前前,再再把把保保存存的的内内容弹入相应的寄存器中容弹入相应的寄存器中。DTOBPROCPUSHBX;保护保护PUSHAX

40、现场现场POPAX ;恢复恢复POPBX现场现场RETDTOBENDP3.保护保护/恢复现场(主要指恢复现场(主要指REG)方法方法2:“现场现场”的保护与恢复在主程序中进行。的保护与恢复在主程序中进行。在在CALL指令前保护,在指令前保护,在CALL指令后返回。指令后返回。MAIN:PUSHBX;保护保护PUSHAX现场现场CALLDTOBPOPAX;恢复恢复POPBX现场现场1多处调用完成同一功能的子程:多处调用完成同一功能的子程:code SEGMENTstart: 、 CALL sub 、 CALL sub 、 CALL sub 、 MOV AH, 4CH INT 21Hsub PRO

41、C 、 、 RETsub ENDPcode ENDS END start2模块化程序设计模块化程序设计code SEGMENTbegin: CALL sub1 CALL sub2 CALL sub3 MOV AH, 4CH INT 21Hsub1 PROC 、 RETsub1 ENDPsub2 PROC 、 RETsub2 ENDPsub3 PROC 、 RETsub3 ENDPcode ENDS END begin 子程序结构子程序结构注意返回注意返回DOS语句位置语句位置思考如下程序的执行流程思考如下程序的执行流程: :code SEGMENTstart: 、 CALL sub 、 CAL

42、L sub 、; MOV AH, 4CH; INT 21Hsub PROC 、 、 RETsub ENDP MOV AH, 4CH INT 21Hcode ENDS END start程序执行不到返回程序执行不到返回DOS功能调用处功能调用处, ,最后的结果是死机最后的结果是死机. .4.子程序编写注意事项子程序编写注意事项子程序要利用过程定义伪指令声明子程序要利用过程定义伪指令声明子子程程序序最最后后利利用用RET指指令令返返回回主主程程序序,主主程程序序执执行行CALL指令调用子程序指令调用子程序子子程程序序开开始始应应该该保保护护使使用用到到的的寄寄存存器器内内容容,子子程程序序返返回回

43、前前相相应应进进行行恢恢复复,对对堆堆栈栈的的压压入入和和弹弹出出操操作要成对使用,保持堆栈的平衡作要成对使用,保持堆栈的平衡子子程程序序应应安安排排在在代代码码段段的的主主程程序序之之外外,最最好好放放在在主主程程序序执执行行终终止止后后的的位位置置(返返回回DOS后后、汇汇编编结结束束END伪伪指指令令前前),也也可可以以放放在在主主程程序序开开始始执执行行之前的位置之前的位置4.子程序编写注意事项(续子程序编写注意事项(续)子程序允许子程序允许嵌套和递归嵌套和递归子子程程序序可可以以与与主主程程序序共共用用一一个个数数据据段段,也也可可以以使使用不同的数据段(注意修改用不同的数据段(注意

44、修改DS)子子程程序序的的编编写写可可以以很很灵灵活活,例例如如具具有有多多个个出出口口(多多个个RET指指令令)和和入入口口,但但一一定定要要保保证证堆堆栈栈操操作的正确性作的正确性处理好子程序与主程序间的参数传递问题处理好子程序与主程序间的参数传递问题提供必要的子程序说明信息提供必要的子程序说明信息5.应用举例应用举例例例4.12用显示器功能调用输出一个字符的子程序用显示器功能调用输出一个字符的子程序Stacksegmentparastackstackdb100dup(?)StackendsCodesegmentassumecs:code,ss:stackstart:moval,?;主程序

45、提供显示字符主程序提供显示字符calldpchar;调用子程序调用子程序movax,4c00hint21h主程序部分主程序部分本程序不需要数据段本程序不需要数据段例例4.12源程序(续)源程序(续)dpchar proc;过程定义,过程名为过程定义,过程名为dpcharpushax;顺序入栈,保护寄存器顺序入栈,保护寄存器pushbxmovbx,0movah,0eh;显示器显示器0EH号输出一个字符功能号输出一个字符功能int10hpopbx;逆序出栈,恢复寄存器逆序出栈,恢复寄存器popaxret;子程序返回子程序返回dpchar endp;过程结束过程结束endsendstart子程序安排

46、在主程序执行终止后的位置子程序安排在主程序执行终止后的位置例例4.13显示以显示以“0”结尾字符串的嵌套子程序结尾字符串的嵌套子程序;数据段;数据段msgdbWell,Imadeit!,0;代码段(主程序)代码段(主程序)movsi,offsetmsg;主程序提供显示字符串主程序提供显示字符串calldpstri;调用子程序调用子程序例例4.13嵌套子程序嵌套子程序;子程序;子程序dpstri:显示显示DS:SI指向的字符串(以指向的字符串(以0结尾)结尾)dpstri procpushaxdps1:moval,si;取显示字符取显示字符incsicmpal,0;是结尾,则显示结束是结尾,则显

47、示结束jzdps2calldpchar;调用字符显示子程序调用字符显示子程序jmpdps1dps2:popaxretdpstri endp;子程序子程序dpchar:显示显示AL中的字符(同例题中的字符(同例题4.12)例例4.14多出口子程序多出口子程序;子程序;子程序HTOASC:十六进制数转换为十六进制数转换为ASCII码码HTOASCprocandal,0fhcmpal,9jbehtoasc1addal,37h;是;是AF,加,加37Hret;子程序返回子程序返回htoasc1:addal,30h;是;是09,加,加30Hret;子程序返回子程序返回HTOASCendp6.主程序和子程

48、序间的参数传递主程序和子程序间的参数传递主程序与子程序间一个关键问题是参数传递主程序与子程序间一个关键问题是参数传递入入口口参参数数(输输入入参参数数):主主程程序序调调用用子子程程序序时时,提提供给子程序的参数供给子程序的参数出出口口参参数数(输输出出参参数数):子子程程序序执执行行结结束束返返回回给给主主程序的参数程序的参数参数的具体内容参数的具体内容传数值:传送数据本身传数值:传送数据本身传地址:传送数据的主存地址传地址:传送数据的主存地址常用的参数传递方法常用的参数传递方法寄存器寄存器参数表(存储器)参数表(存储器)堆栈堆栈1)用寄存器传递参数适用于参数较少的情况用寄存器传递参数适用于

49、参数较少的情况最最简简单单和和常常用用的的参参数数传传递递方方法法是是通通过过寄寄存存器器,只只要把参数存于约定的寄存器中。要把参数存于约定的寄存器中。主程序:主程序:调用前,入口参数调用前,入口参数指定的指定的寄存器寄存器 子程序:子程序:执行中,直接引用寄存器中的参数执行中,直接引用寄存器中的参数 出口参数出口参数指定指定寄存器寄存器由由于于通通用用寄寄存存器器个个数数有有限限,这这种种方方法法对对少少量量数数据据可以直接传递数值,而对大量数据只能传递地址可以直接传递数值,而对大量数据只能传递地址1)用寄存器传递参数用寄存器传递参数例例:子子程程序序SUM规规定定输输入入参参数数1、2和和

50、3分分别别在在寄寄存存器器SI、DI和和CX中,则主程序调用中,则主程序调用SUM的指令序列为:的指令序列为:MOVSI,参数参数1MOVDI,参数参数2MOVCX,参数参数3CALLSUM1)用寄存器传递参数用寄存器传递参数例例1:求数组:求数组ARRAY中所有元素之和并存于中所有元素之和并存于SUM单元中。单元中。STACKSEGMENTPARASTACKSTACKDB100DUP(?)STACKENDSDATASEGMENTARRAYDBd1,d2,d3,dnCOUNTEQU$-ARRAYSUMDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:

51、STACKSTART:MOVAX,DATAMOVDS,AX1)用寄存器传递参数用寄存器传递参数LEASI,ARRAY;入口参数准备,将需要传递的参数送入寄存器入口参数准备,将需要传递的参数送入寄存器MOVCX,COUNTCALLSUM1;调用子程序求和,返回值在调用子程序求和,返回值在AX中中MOVSUM,AXMOVAH,4CHINT21H;子程序名:子程序名:SUM1。程序功能:求字节数组和。程序功能:求字节数组和。SUM1PROCNEAR;入口参数:入口参数:SI=数组首址,数组首址,CX=数组长度数组长度CMPCX,0;出口参数:出口参数:AX=数组和数组和JZEXIT;使用寄存器:使用

52、寄存器:AX,CX,SIMOVAX,0AGAIN:ADDAL,SIADCAH,0INCSILOOPAGAINEXIT:RETSUM1ENDPCODEENDSENDSTART例例4.23把十进制把十进制ASCII字符转换为压缩的字符转换为压缩的BCD码数。码数。(不讲)(不讲)DATASEGMENTSTRING DB12345678998123605031,13,10,$ERROR DBERROR!,13,10,$BUFER DB10DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAIN:PROCFARBEGIN: MOVAX,DATAMOVDS,A

53、XLEABX,STRINGLEADI,BUFFERLP:MOVAH,BXINCBXCMPAH,0JBNEXT1CMPAH,9JANEXT1例例4.23把十进制把十进制ASCII字符转换为压缩的字符转换为压缩的BCD码数。码数。MOVAL,BXCMPAL,0JBNEXT2CMPAL,9JANEXT2LP1:CALLSPE1;调用之前,数据放在;调用之前,数据放在AH、AL寄存器中寄存器中MOVDI,AH;存放转换结果;存放转换结果INC,DIJMPLP;进行下一次转换;进行下一次转换NEXT1: CMPAH,;判断是否为空格;判断是否为空格JZLPCMPAH,,;判断是否为逗号;判断是否为逗号J

54、ZLPCMPAH,13;判断是否为回车;判断是否为回车JZDONENEXT2: LEADX,ERRORMOVAH,9;输出出错信息;输出出错信息INT21H例例4.23把十进制把十进制ASCII字符转换为压缩的字符转换为压缩的BCD码数。码数。DONE: MOVAH,4CHINT21HMAINENDPSPE1PROCANDAH,0FHMOVCL,4SHLAH,CLANDAL,0FHORAH,ALRET;出口参数放在;出口参数放在AH中中SPE1ENDPCODEENDSENDBEGIN适用于参数较多的情况适用于参数较多的情况方方法法1:直直接接存存储储单单元元传传递递:利利用用约约定定的的存存储

55、储单单元元直直接接进行数据本身传递。进行数据本身传递。方法方法2:参数地址表传递:参数地址表传递:(1)主主程程序序把把传传递递的的参参数数存存放放在在内内存存的的某某一一个个数数据据区区域(域(地址表地址表)中)中(2)把把地址表的偏移量地址表的偏移量子程序(通过寄存器)子程序(通过寄存器)(3)子子程程序序取取出出要要处处理理的的信信息息,结结果果也也放放在在指指定定的的数数据区域中。据区域中。2)用存储单元传递参数用存储单元传递参数2)用参数表传递参数用参数表传递参数例例4.24:求字数组之和(假定和不溢出),结果送:求字数组之和(假定和不溢出),结果送SUM单元中。单元中。STACKS

56、EGMENTPARASTACKSTACKDB100DUP(?)STACKENDSDATASEGMENTARRAYDBd1,d2,d3,dnCOUNTDB$-ARRAYSUMDW?TABLEDW3DUP(?);定义地址表定义地址表DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX2)用参数表传递参数用参数表传递参数MOVTABLE,OFFSETARRAY;参数地址参数地址地址表地址表MOVTABLE+2,OFFSETCOUNTMOVTABLE+4,OFFSETSUMLEABX,TABLE;地址表首址地

57、址表首址BXCALLGOSUM;求和并存储;求和并存储MOVAH,4CHINT21H;子程序名:子程序名:GOSUM。程序功能:求字数组和并保存。程序功能:求字数组和并保存。;入口参数:;入口参数:BX为地址表首地址,参数地址在地址表中。为地址表首地址,参数地址在地址表中。;出口参数:和在出口参数:和在SUM单元中。使用寄存器:单元中。使用寄存器:AX,CX,BP,SI,DIGOSUMPROCNEARPUSHAX;保护现场保护现场PUSHCXPUSHSIPUSHDI2)用参数表传递参数用参数表传递参数MOVSI,BX;数组首地址数组首地址SIMOVDI,BX+2;数组长度单元地址数组长度单元地

58、址DIMOVCL,DI;数组长度;数组长度CLMOVDI,BX+4;存储和单元地址存储和单元地址DIMOVAX,0MOVCH,ALAGAIN:ADDAL,SIADCAH,0INCSILOOPAGAIN;循环求和循环求和MOVDI,AX;存储和存储和POPDI;恢复现场恢复现场POPAXRETGOSUMENDPCODEENDSENDSTART优点:优点:可以通过修改参数表,实现对不同数组求和。可以通过修改参数表,实现对不同数组求和。3)用堆栈传递参数用堆栈传递参数适适合合于于参参数数多多并并且且子子程程序序有有嵌嵌套套、递递归归调调用用的的情情况况主主程程序序将将入入口口参参数数压压入入堆堆栈栈

59、,子子程程序序从从堆堆栈栈中中取取出出参参数数;子子程程序序将将出出口口参参数数压压入入堆堆栈栈,主主程程序序弹弹出出堆堆栈取得它们栈取得它们可以节省存储空间和通用寄存器,较常用的方法可以节省存储空间和通用寄存器,较常用的方法必须清楚堆栈中的内容,掌握并跟踪指针的变化必须清楚堆栈中的内容,掌握并跟踪指针的变化主程序调用子程序的指令序列:主程序调用子程序的指令序列:PUSH参数参数1PUSH参数参数2PUSH参数参数3CALL子程序名子程序名注注意意:参参数数是是立立即即数数,不不能能直直接接进进栈栈,需需要要先先将将立立即数送寄存器,再将寄存器内容进栈。即数送寄存器,再将寄存器内容进栈。3)用

60、堆栈传递参数)用堆栈传递参数 (1)子程序从堆栈中取参数方法子程序从堆栈中取参数方法用用POP指令取参数指令取参数子程序名子程序名PROCNEARPOPAX;断点地址弹出到断点地址弹出到AXPOPBX;取参数取参数3POPCX;取参数取参数2POPDX;取参数取参数1PUSHAX;断点地址重新入栈断点地址重新入栈RET;根据断点地址返回根据断点地址返回设指针设指针BP,用,用BP取参数取参数寄寄存存器器BP在在用用作作地地址址指指针针时时,其其约约定定段段为为SS,可可以在堆栈段内取数据且不影响以在堆栈段内取数据且不影响SP。子程序名子程序名PROCNEARMOVBP,SP;设指针设指针BP,

61、使,使BP=SPMOVBX,BP+2;取参数取参数3MOVCX,BP+4;取参数取参数2MOVDX,BP+6;取参数取参数1RET(RET6)子程序名子程序名ENDP(1)子程序从堆栈中取参数方法)子程序从堆栈中取参数方法例例4.25:改改写写例例4.24为为堆堆栈栈传传递递参参数数,并并令令求求和和子子程程序序在在另另一一个代码段。个代码段。STACKSEGMENTPARASTACKSTACKDB100DUP(?)STACKENDSDATASEGMENTARRAYDWd1,d2,d3,dnCOUNTDW$-ARRAYSUMDW?DATAENDSEXTRNSUMUP:FAR;外部引用外部引用C

62、ODE1SEGMENTASSUMECS:CODE1,DS:DATA,SS:STACKMAINPROCFARSTART:MOVAX,DATAMOVDS,AX用用BP取参数取参数例例4.25用堆栈实现参数传递(续)用堆栈实现参数传递(续)LEABX,ARRAY;地址参数地址参数1(ARRAY偏址)进栈偏址)进栈PUSHBXLEABX,COUNT;地址参数地址参数2(COUNT偏址)进栈偏址)进栈PUSHBXLEABX,SUM;地址参数地址参数3(SUM偏址)进栈偏址)进栈PUSHBXCALLFARPTRSUMUP;段间调用,求和段间调用,求和MOVAH,4CHINT21HMAINENDPCODE1

63、ENDSENDSTART;PUBLICSUMUP;全局过程定义全局过程定义CODE2SEGMENTASSUMECS:CODE2例例4.25用堆栈实现参数传递(续)用堆栈实现参数传递(续);子程序名:子程序名:SUMUP。程序功能:求字数组和并保存。程序功能:求字数组和并保存。;入口参数:数组,数组长度及存和单元地址在栈中。;入口参数:数组,数组长度及存和单元地址在栈中。;出口参数:和在出口参数:和在SUM单元中。使用寄存器:单元中。使用寄存器:AX,BX,CX,BP,SISUMUPPROCFAR;子程序类型定义为子程序类型定义为FARPUSHAX;保护现场保护现场AX,BX,CX,BPPUSH

64、BXPUSHCXPUSHBPPUSHSIMOVBP,SP;指向栈顶指向栈顶MOVBX,BP+16;COUNT偏址偏址BXMOVCX,BX;数组长度数组长度CXMOVBX,BP+14;SUM偏址偏址BXMOVSI,BP+18;ARRAY偏址偏址SIMOVAX,0例例4.25用堆栈实现参数传递(续)用堆栈实现参数传递(续)MOVAX,0ADD1:ADDAX,SI;求和求和ADDSI,2LOOPADD1;循环求和循环求和MOVBX,AX;存储和存储和POPSIPOPBP;恢复现场恢复现场SI,BP,CX,BX,AXPOPCXPOPBXPOPAXRET6;返回并废除地址参数返回并废除地址参数SUMUP

65、ENDPCODE2ENDSEND主主程程序序压压栈栈在在CALL指指令令之之前前,主主程程序序压压入入的的参参数数不在当前栈顶,不能直接使用不在当前栈顶,不能直接使用POP指令。指令。通常用通常用BP指针寻址指针寻址关键:关键:正确计算参数相对于当前栈顶的位移量正确计算参数相对于当前栈顶的位移量子程序返回要用带参数的返回指令:子程序返回要用带参数的返回指令:RETn(2)采用堆栈传递参数注意的问题:)采用堆栈传递参数注意的问题:4.5.2DOS系统功能调用系统功能调用ROM_BIOS(BasicI/OSystem基本基本I/O系统系统):固化在固化在ROM中的中的一组一组I/O设备驱动与管理软

66、件。设备驱动与管理软件。处于系统软件的最底层。处于系统软件的最底层。占据微机系统板上占据微机系统板上8K字节的字节的ROM区。区。IBMIO.COMIBMDOS.COM构成了构成了基本基本DOS系统系统COMMAND.COM(命令处理程序)命令处理程序)4.5.2DOS系统功能调用系统功能调用汇汇编编程程序序提提供供给给汇汇编编语语言言程序员的功能非常有限程序员的功能非常有限程程序序员员需需 要要 利利用用ROM-BIOS和和操操作作系系统统提提供供的的资源资源系系统统功功能能调调用用是是程程序序设设计计的一个重要方面的一个重要方面ROMBIOS子子程程序序BIOS功能调用功能调用DOS子子程

67、程序序DOS功功能调用或系统调用能调用或系统调用裸机裸机汇编语言程序ROM_BIOS和和基基本本DOS系系统统在在汇汇编编语语言言级级向向用用户户程程序序和和系系统统程程序序提提供供一一组组例例行行子子程程序序,用用于于完完成成基基本本I/O设设备备(如如CRT显显示示器器、键键盘盘、打打印印机机、软软盘盘、硬硬盘盘等等)、内内存存、文文件件和和作作业业的的管管理理,以以及及时时钟钟、日历的读出和设置等功能。日历的读出和设置等功能。BIOS和和DOS把把这这些些例例行行子子程程序序编编写写成成相相对对独独立立的的程序模块而且编上号。程序模块而且编上号。用用户户调调用用这这些些子子程程序序时时,

68、不不必必过过问问其其内内部部结结构构和和细细节,硬件节,硬件I/O接口特性。接口特性。1调用调用BIOS/DOS功能子程序的基本方法功能子程序的基本方法1调用调用BIOS/DOS功能子程序的基本方法功能子程序的基本方法BIOS/DOS每个功能都对应一个子程序文件每个功能都对应一个子程序文件调用调用BIOS方法:采用方法:采用软中断指令软中断指令:INTnn-中断类型号,类型码中断类型号,类型码功能号功能号AH中断类型号中断类型号n:ROM-BIOSn=51FHDOSn=20H,21H,232AH,2EH,2FH,33H,67H有的软中断指令只对应一个子程序有的软中断指令只对应一个子程序,如如I

69、NT20H有有的的软软中中断断指指令令对对应应多多个个子子程程序序,通通过过功功能能号号区区分分,如如INT21H,功能号功能号:00H63HAH2. 用户编程原则用户编程原则 尽可能使用尽可能使用DOS的系统功能调用,的系统功能调用, 提高程序可移植性。提高程序可移植性。在在DOS功能不能实现情况下,功能不能实现情况下, 考虑用考虑用BIOS功能调用。功能调用。在在DOS和和BIOS的中断子程的中断子程 不能解决问题时不能解决问题时, 使用使用IN/OUT指令直接控制硬件。指令直接控制硬件。3.BIOS/DOS功能子程序调用步骤功能子程序调用步骤设置入口参数设置入口参数在在AH设置功能号设置

70、功能号m执行中断指令执行中断指令INT n分析、应用出口参数分析、应用出口参数3.BIOS/DOS功能子程序调用步骤功能子程序调用步骤通常按照如下通常按照如下4个步骤进行:个步骤进行:在在AH寄存器中设置系统功能调用号寄存器中设置系统功能调用号在指定寄存器中设置入口参数在指定寄存器中设置入口参数用中断调用指令(用中断调用指令(INTn)执行功能调用执行功能调用根据出口参数分析功能调用执行情况根据出口参数分析功能调用执行情况CPU响响应应中中断断后后,把把控控制制权权交交给给指指令令的的BIOS程程序段,由它提供服务。序段,由它提供服务。入入/出口参数均采用出口参数均采用寄存器传送寄存器传送。功

71、能号。功能号AH例例1:利利用用INT10H指指令令的的2号号功功能能将将光光标标定定在在屏屏幕幕的的第第12行行,第第1列。列。MOVAH,02H;功能号功能号2MOVBH,0;0页页MOVDH,12;第第12行行MOVDL,01H;第第1列列INT10H例例2:利用利用INT16H指令的指令的0号功能从键盘读入一个字符。号功能从键盘读入一个字符。MOVAH,0;功能功能0INT16H;读入一个字符,读入一个字符,AH=扫描码扫描码AL=ASCII码码实例实例4.常用的常用的DOS功能子程序调用功能子程序调用中中断断系系统统保保留留了了类类型型码码20H3FH的的软软中中断断由由DOS调用。

72、服务子程序由调用。服务子程序由DOS提供。提供。与与BIOS的功能调用区别:的功能调用区别:调用调用BIOS复杂,但运行速度快,功能更强。复杂,但运行速度快,功能更强。DOS功能调用只是在功能调用只是在DOS环境下适用。环境下适用。某某些些功功能能只只有有BIOS具具有有,ROM-BIOS功功能能更更加加基基本,且与操作系统无关。本,且与操作系统无关。4.常用的常用的DOS功能子程序调用功能子程序调用DOS利利用用21H号号中中断断提提供供给给用用户户近近百百个个系系统功能,主要包括:统功能,主要包括:磁盘的读磁盘的读/写及控制管理写及控制管理内存管理内存管理基基本本输输入入/输输出出管管理理

73、(如如键键盘盘、打打印印机机、显示器等)显示器等)另外还有时间、日期等子程序。另外还有时间、日期等子程序。DOS系统功能调用系统功能调用 (21H类型中断调用类型中断调用)1显示单字符显示单字符 ( 02H功能功能 )2显示字符串显示字符串 ( 09H功能功能 )3单字符输入单字符输入 ( 01H、07H、08H功能功能 )4字符串输入字符串输入 ( 0AH功能功能 )5检测键盘状态检测键盘状态 ( 0BH功能功能 )几个常用的子程序几个常用的子程序(1)键盘输入并显示键盘输入并显示(01H)等待输入字符,等待输入字符,ASCII码码AL,同时显示同时显示出来。出来。若按下若按下Ctrl-Br

74、eak,则执行则执行INT23HMOVAH,01H;无入口参数无入口参数INT21H;AL=键值(键值(ASCII)注意:注意:字符输入,不显示字符输入,不显示AH=08H几个常用的子程序几个常用的子程序(2)直接控制台输入直接控制台输入/输出输出(06H)从从键键盘盘输输入入字字符符,也也可可以以向向屏屏幕幕输输出出字字符符,并并且且不检查不检查Ctrl-Break。入口参数:入口参数:=FF,从键盘输入从键盘输入ZF=0,AL中为键入的字符值中为键入的字符值DLZF=1,AL中不是键入的字符值中不是键入的字符值FF,向屏幕输出,向屏幕输出,DL中为输出字符的中为输出字符的ASCII码值码值

75、注意:注意:06号功能调用时,号功能调用时,CPU不等待用户按键。不等待用户按键。(3)显示或打印输出单个字符(显示或打印输出单个字符(02H、05H)将将寄寄存存器器DL中中的的单单个个字字符符输输出出到到 显显示示器器(02H)打印机(打印机(05H)(4)字符串输入(字符串输入(0AH)从从键键盘盘接接受受字字符符串串后后存存入入以以DS:DX为为首首址址的的内内存存缓缓冲区,同时显示字符串冲区,同时显示字符串注意:串的格式注意:串的格式(5)字符串输出(字符串输出(09H)将将一一个个以以$字字符符结结尾尾的的字字符符串串(不不包包括括$)输出到显示器。输出到显示器。要要 求求 : D

76、S:DX字字 符符 串串 首首 址址 , 串串 以以 $结结 尾尾 ,AH=09H.几个常用的子程序几个常用的子程序1. 显示单字符显示单字符 ( 02H功能功能 ) 入口参数入口参数 DL = 要显示字符的要显示字符的ASCII 码码 功能号功能号 AH=02H类型号类型号 INT 21H出口参数出口参数 无无实现功能实现功能 显示指定字符显示指定字符,光标随动。光标随动。例例 显示字符显示字符A MOV DL, A MOV AH, 02H INT 21H例例 使光标回到下一行的行首。使光标回到下一行的行首。MOV DL , 0DH ;显示回车符显示回车符MOV AH , 02HINT 21

77、HMOV DL , 0AH ;显示换行符显示换行符MOV AH , 02HINT 21H H e l l o W o r l d 2. 显示字符串显示字符串 ( 09H功能功能 )入口参数入口参数 定义要显示的字符串,定义要显示的字符串, 字符串尾应为字符串尾应为$,作为结束显示的标志。,作为结束显示的标志。 DS : DX = 字符串的首地址字符串的首地址功能号功能号 AH = 09 H类型号类型号 21H出口参数出口参数 无无实现功能实现功能 显示字符串,遇显示字符串,遇 $ 停止显示,光标随动停止显示,光标随动。例例 编程显示字符串编程显示字符串 THISISASAMPLEPROGRAM

78、data SEGMENT ;定义显示的子符串定义显示的子符串stri DB THISISASAMPLEPROGRAM, $data ENDScode SEGMENT ASSUME CS:code, DS:datastart: MOV AX, data ;置缓冲区地址于置缓冲区地址于DS:DX MOV DS, AX LEA DX, stri MOV AH, 09H ;调显示功能调显示功能 INT 21H MOV AH, 4CH ;返回返回DOS INT 21H code ENDS END start4. 字符串输入字符串输入 ( 0AH 功能功能 ) 入口参数入口参数 DS : DX = 缓冲区

79、的首地址缓冲区的首地址 ( DS :DX ) = 限制最多输入的字符数限制最多输入的字符数 功能号功能号 AH = 0AH 类型号类型号 21H 出口参数出口参数 ( DS : DX+1 ) = 实际键入的字符实际键入的字符(不含回车符不含回车符) 从从( DS : DX+2 )开始顺序存放键入的字符串,开始顺序存放键入的字符串, 回车符回车符0DH为串尾最后一字符。为串尾最后一字符。 实现功能实现功能 等待从键盘输入字符串,并存入设定的缓冲区内,等待从键盘输入字符串,并存入设定的缓冲区内, 同时回显字符串,光标随着移动,同时回显字符串,光标随着移动, 回车符使光标回到行首。回车符使光标回到行

80、首。 注意事项:注意事项:应按要求先定义缓冲区,再调用。应按要求先定义缓冲区,再调用。例例 应用应用0AH功能输入字符串。功能输入字符串。 data SEGMENT ;定义缓冲区定义缓冲区max DB 11 ;定义限制最多输入个数定义限制最多输入个数lenth DB ? ;用于存放实际输入个数用于存放实际输入个数stri DB 11 DUP(?) ;用于存放输入的字符串用于存放输入的字符串data ENDScode SEGMENT ASSUME CS:code, DS:datastart: MOV AX , data ;置缓冲区地址于置缓冲区地址于DS:DX MOV DS , AX LEA D

81、X , max MOV AH , 0AH INT 21H ;调调0A输入功能输入功能 MOX CH , 0 MOV CL , lenth ;取字符串长度放取字符串长度放CX中中 LEA BX , stri ;取字符串首址于取字符串首址于BX中中 MOV AL , BX ;应用输入字符应用输入字符 、 code ENDS data SEGMENT ;定义缓冲区定义缓冲区max DB 11 ;定义限制最多输入个数定义限制最多输入个数lenth DB ? ;用于存放实际输入个数用于存放实际输入个数stri DB 11 DUP(?) ;用于存放输入的字符串用于存放输入的字符串data ENDS从键盘输

82、入从键盘输入ABCD, 回车,内存的存放结果回车,内存的存放结果:0B 04 41 42 43 44 0D 00max0700 00 00 00 00 00 00 0080a 0b0f12345690c 0d 0elenthstri地址地址内容内容DS:DX如下编程与上例相同如下编程与上例相同: : data SEGMENT max DB 11 等价于:等价于: DB ? max DB 11, ?, 11 DUP(?) DB 11 DUP(?) data ENDS code SEGMENT ASSUME CS:code, DS:datastart: MOV AX, data ;置缓冲区地址于置

83、缓冲区地址于DS:DX MOV DS, AX LEA DX, max MOV AH, 0AH ;调输入功能调输入功能 INT 21H MOX CH, 0 MOV CL, max+1 ;取字符串长度放取字符串长度放CX中中 LEA BX, max+2 ;取字符串首址于取字符串首址于BX中中 MOV AL, BX ;应用输入字符应用输入字符 、 code ENDSdata SEGMENTmax DB 11 DB ? DB 11 DUP(?)data ENDS从键盘输入从键盘输入ABCD, 回车,内存的存放结果回车,内存的存放结果:等价于等价于max DB 11,?,?,11 DUP(?)0B 04

84、 41 42 43 44 0D 00max0700 00 00 00 00 00 00 0080a 0b0f12345690c 0d 0e地址地址内容内容DS:DX0AH功能执行过程功能执行过程: 若若(DS:DX)字节单元的值为字节单元的值为0,则不等待从键盘输入,结束调用。,则不等待从键盘输入,结束调用。 若若(DS:DX) 字节单元的内容大于字节单元的内容大于0,则等待从键盘输入,则等待从键盘输入, 并把输入键的并把输入键的ASCII码顺序存放在码顺序存放在DS : DX+2开始的单元,开始的单元, 按回车键表示结束输入。按回车键表示结束输入。 当按下键的个数超过当按下键的个数超过( D

85、S : DX )中值,发出警告声中值,发出警告声 嘟嘟嘟嘟 , 不再接收输入的数据不再接收输入的数据, 直到输入回车键。直到输入回车键。 将实际输入的字符个数将实际输入的字符个数(不包括回车键不包括回车键)填入填入(DS:DX+1), 结束调用。结束调用。DS:DX00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000AH功能注意事项功能注意事项: 输入的字符均带回显,且光标随字符移动。输入的字符均带回显,且光标随字符移动。 当输入回车符结束时,也回显回车符。当输入回车符结束时,也回显回车符。表现为功能调用结束后,光标回到了行首。表现为功能调用结束后,

86、光标回到了行首。 回车符回车符0DH作为一个输入的字符存放在字符串尾,作为一个输入的字符存放在字符串尾, 但计数输入个数时,不包括回车键。但计数输入个数时,不包括回车键。 实际最多能输入的字符数实际最多能输入的字符数 = 限制的最多数限制的最多数- -1 (回车符占一个)(回车符占一个) 执行完执行完0AH功能后,功能后,DS和和DX的值不变,的值不变, DS:DX仍指向缓冲区的首地址。仍指向缓冲区的首地址。 整个缓冲区的大小应为整个缓冲区的大小应为:限制的最多数限制的最多数 +2 max DB 11, ? , 11 dup (?)例例 利用利用DEBUG查看查看0A功能输入结果功能输入结果。

87、data SEGMENT max DB 11, ?, 11 DUP(?) data ENDScode SEGMENT ASSUME CS:code, DS:datastart: MOV AX, data ;置缓冲区地址于置缓冲区地址于DS:DX MOV DS, AX LEA DX, max MOV AH, 0AH ;调输入功能调输入功能 INT 21H MOV CH, 0 MOV CL, max+1 ;取输入长度到取输入长度到CX中中 MOV AH, 4CH ;返回返回DOS INT 21Hcode ENDS END startD:MASMDEBUG TEST0a.exe ;装入执行文件装入执

88、行文件-U ;反汇编程序反汇编程序 129E:0000 B89D12 MOV AX , 129D129E:0003 8ED8 MOV DS , AX129E:0005 8D160000 LEA DX , 0000129E:0009 B40A MOV AH , 0A129E:000B CD21 INT 21129E:000D B500 MOV CH , 00129E:000F 8A0E0100 MOV CL , 0001129E:0013 B44C MOV AH , 4C129E:0015 CD21 INT 21 、-D 129D:0 L10 ;查看程序执行查看程序执行前前缓冲区内容缓冲区内容

89、129D:0000 0B 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .-G 000D ;执行程序执行程序 Hello ;从键盘输入字符串从键盘输入字符串 Program terminated normally-D 129D:0 L10 ;查看程序执行查看程序执行后后缓冲区内容缓冲区内容 129D:0000 0B 05 48 65 6C 6C 6F 0D-00 00 00 00 00 00 00 00 .Hello.-思考:思考:1. 若将程序改为如下形式,若将程序改为如下形式, 设想程序执行的结果。设想程序执行的结果。data SEGMENT m

90、ax DB 100H DUP ( ? ) data ENDScode SEGMENT ASSUME CS:code, DS:datastart: MOV AX, data ;置缓冲区地址于置缓冲区地址于DS:DX MOV DS, AX LEA DX, max MOV AH, 0AH ;调输入功能调输入功能 INT 21H MOV AH, 4CH ;返回返回DOS INT 21Hcode ENDS END start结果是:结果是:不等待输入,结束不等待输入,结束0AH功能调用。功能调用。00 00 0000 00 00 00 00max0700 00 00 00 00 00 00 0080a0

91、b0f12345690c 0d 0e地址地址内容内容DS:DX注意:注意:由于由于DS:DX限制输入最大字符数为限制输入最大字符数为0, 所以不等待输入所以不等待输入, 结束结束0AH功能调用。功能调用。原因是:原因是:2. 若将程序改为如下形式,若将程序改为如下形式, 设想程序执行的结果。设想程序执行的结果。data SEGMENT max DW 100H,? ,100H DUP ( ? ) ;定义为字类型定义为字类型data ENDScode SEGMENT ASSUME CS:code, DS:datastart: MOV AX, data ;置缓冲区地址于置缓冲区地址于DS:DX MO

92、V DS, AX LEA DX, max MOV AH, 0AH ;调输入功能调输入功能 INT 21H MOV AH, 4CH ;返回返回DOS INT 21Hcode ENDS END start结果是:结果是:不等待输入,结束不等待输入,结束0AH功能调用。功能调用。00 01 0000 00 00 00 00max0700 00 00 00 00 00 00 0080a0b0f12345690c 0d 0e地址地址内容内容DS:DX注意:注意:0AH功能以功能以字节类型应用字节类型应用DS:DX指向的缓冲区指向的缓冲区。 并不随缓冲区类型定义的变化而变化。并不随缓冲区类型定义的变化而变

93、化。原因是:原因是:例例 编程从键盘输入字符串,给出显示提示编程从键盘输入字符串,给出显示提示Please input:data SEGMENT stri DB Please Input :,$max DB 11, ?, 11 DUP(?)data ENDScode SEGMENT ASSUME CS:code, DS:datastart: MOV AX, data ;置缓冲区地址于置缓冲区地址于DS:DX MOV DS, AX LEA DX, stri MOV AH, 09H ;显示提示显示提示 INT 21H LEA DX, max ;等待从键盘输入等待从键盘输入 MOV AH, 0AH

94、INT 21H MOV AH, 4CH INT 21H code ENDS END start利用利用DOS 功能调用,编写小程序功能调用,编写小程序D:MASMDEBUG e0a09.exe-U ;查看程序查看程序129F:0000 B89D12 MOV AX,129D129F:0003 8ED8 MOV DS,AX129F:0005 8D160000 LEA DX ,0000129F:0009 B409 MOV AH ,09129F:000B CD21 INT 21129F:000D 8D160F00 LEA DX ,000F129F:0011 B40A MOV AH , 0A129F:0

95、013 CD21 INT 21129F:0015 B44C MOV AH , 4C129F:0017 CD21 INT 21 -D 129D:0 L20 ;执行程序前查看执行程序前查看 data段内容段内容129D:0000 50 6C 65 61 73 65 20 49-6E 70 75 74 20 3A 24 0B Please Input :$.129D:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .-G ;执行程序执行程序 Please Input :Hello!Program terminated normally-D 1

96、29 D:0 L20 ;执行程序后查看执行程序后查看 datadata段内容段内容 129D:0000 50 6C 65 61 73 65 20 49-6E 70 75 74 20 3A 24 0B Please Input :$.129D:0010 06 48 65 6C 6C 6F 21 0D-00 00 00 00 00 00 00 00 .Hello!.-data段内存情况:段内存情况:striPlease Input:$ 0B06 Hello!0D 00 00 00 00 00 00 00 00max思考:思考:程序中少了一个程序中少了一个 $ 符的后果。符的后果。data SEGM

97、ENT stri DB Please Input :max DB 11, ?, 11 DUP(?)data ENDScode SEGMENT ASSUME CS:code, DS:datastart: MOV AX, data ;置缓冲区地址于置缓冲区地址于DS:DX MOV DS, AX LEA DX, stri MOV AH, 09H ;显示提示显示提示 INT 21H LEA DX, max ;等待从键盘输入等待从键盘输入 MOV AH, 0AH INT 21H MOV AH, 4CH INT 21H code ENDS END startdata SEGMENT stri DB Ple

98、ase Input :max DB 11, ?, 11 DUP(?)data ENDSstriPlease Input:0B 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00maxB8 A8 12 8E D8 8D 16 00 00 B4 09 CD 21 8D 16 0Estart 注意:注意:09H功能只在遇到功能只在遇到$符才结束显符才结束显示示。例例1.例用例用DOS系统功能调用实现人机对话。系统功能调用实现人机对话。(见见P195)例例2.显显示示35读读入入答答案案(回回车车确确认认),并并指示对错。指示对错。显示显示35?WHAT

99、STHEANSWER?XX RIGHT(或或WRONG)实例实例例例4.15回车换行的子程序回车换行的子程序crlfprocpushax;保护寄存器保护寄存器pushdxmovah,2movdl,0dh ;回车功能的回车功能的ASCII码是码是0DHint21hmovah,2movdl,0ah;换行功能的换行功能的ASCII码是码是0AHint21hpopdx;恢复寄存器恢复寄存器popaxretcrlfendp例例4.16提示按任意键继续提示按任意键继续;在数据段定义要显示的字符串;在数据段定义要显示的字符串msgkeydbPressanykeytocontiune,$;在代码段编写程序在代

100、码段编写程序movah,9movdx,offsetmsgkey;设置入口参数:设置入口参数:;DS数据段地址(假设已经设置好)数据段地址(假设已经设置好);DX字符串的偏移地址字符串的偏移地址int21h4.6程序设计举例程序设计举例4.6.1码制转换和数值转换码制转换和数值转换例例1:将一个十六进制数转换成将一个十六进制数转换成ASCII码。码。算法:算法:(1)分离两个数字(即高低分离两个数字(即高低4位分开)位分开)(2)判断范围判断范围:09AF(3)处理:处理:x30H+x(x:09)41H-0AH+x(x:AF)例:例:AL=3FHAX=33H,46H程序:程序:NUMDB3FHS

101、TRDB?,?LEABX,NUM;取取NUM的偏址,送的偏址,送BXLEADI,STR;取取STR的偏址,送的偏址,送DIMOVAL,BXANDAL,0F0H;留下高留下高4位位MOVCL,4SHRAL,CLCALLCHANGE;调转换成调转换成ASCII的子程序的子程序MOVAL,BXANDAL,0FH;留下低留下低4位位CALLCHANGE;调转成调转成ASCII的子程的子程4.6.1码制转换和数值转换码制转换和数值转换CHANGEPROC;转换成转换成ASCII的子程序的子程序CMPAL,10JLNEXT;如果如果(AL)MASMMAINC:MASMSUBC:LINKMAIN+SUB例例

102、2:求无序表中的最大元素及其位置:求无序表中的最大元素及其位置模块模块AMAIN.ASM模块模块BSUB.ASMEXTRNFOUND:NEARPUBLICFOUNDDATA1SEGMENTDATA2SEGMENTARRAYDBd1,d2,d3,dnMAXDB?COUNTEQU$-ARRAYPLACEDB?DATA1ENDSDATA2ENDSCODESEGMENTWORDPUBLICCODECODESEGMENTWORDPUBLICCODEASSUMECS:CODE,DS:DATA1ASSUMECS:CODEMAIN:MOVAX,DATA1FOUNTPROCNEARMOVDS,AXMOVDH,1

103、MOVCX,COUNTMOVDL,0LEASI,ARRAYDECCXCALLFOUNTMOVAL,SIMOVAH,4CHCOMP:CMPAL,SI+1INT21HJGBIGGERCODEENDSMOVAL,SI+1ENDMAINMOVDL,DH-BIGGER:INCSIMOVMAX,ALINCDHMOVPLACE,DLLOOPCOMPRETASSUMEDS:DATA2FOUNTENDPMOVBX,DATA2CODEENDSMOVDS,BXEND例例2说明说明数据段独立,代码段合并成一个段数据段独立,代码段合并成一个段段内调用段内调用模块模块B用用SI指针,指向模块指针,指向模块A中的数据中的数据无需置无需置DS值。值。当用到当用到DATA2时,才说明时,才说明DS:DATA2

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号