编写和提高探究.docx

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四次实验汇编程序编写和提高1、编写一个程序,实现复制字符串的功能,并将复制的字符串正序倒序显示出来。流程图:程序如下:DATASSEGMENTstring_adbthefutureisbeautiful;要操作的字符串countequ$-offsetstring_a;把字符串的长度存入countdata1dbthezhengxuis:,$;输出正序是data2dbthefanxuis:,$;输出反序是DATASENDSSTACKSSEGMENTstring_bdb100dup(?);建栈段存放复制的字符串STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;把datas的段地址分别给DS,ESmoves,axleasi,string_a;取string_a的偏移地址给sileadi,string_b;取string_b的偏移地址给dimovcx,count;把字符串长度给cx,决定循环的次数Cld;DF置零,使DI,SI自增repmovsb;把string_a里的字符串复制到string_b,循环次数为;CXmovcx,count;把count赋给CX,决定输出正序循环次数leadx,data1;输出data1里的字符movah,09int21hxordi,di;DI置零output1:movdl,[string_b+di];把string_b偏移地址给DLmovah,02hint21h;输出数据段string_b里的一个字符incdi;DI自增,指向下一个字节loopoutput1;循环输出movcx,count;CX重新获值leadx,data2;把data2的偏移地址赋给DXmovah,09int21h;输出提反序输出的提示字符output2:decdi;上一次循环DI指向要输出字符串的下一个字节,先自减,;使他指向最后一个字符movdl,[string_b+di]movah,02int21h;输出反序的字符串loopoutput2MOVAH,4CHINT21H;结束dosCODESENDSENDSTART;程序结束运行结果:过程中有几次语法错误,比如直接MOVDI,STRING_B,提示错误,不能直接把数据段的偏移地址赋给DI,应该用LEA。百度得知:LEA为硬指令,在程序执行阶段得出偏移地址,offset是伪指令,在编译阶段得出偏移地址。论速度的话,offset比LEA快得多,但是,灵活性和复杂度,offset远不如LEA。2、利用中断调用,在屏幕上显示1-9中的随机数,中断号为86H流程图:Random子程序是上网百度的,加以调用刚开始运行是这样的结果发生除法溢出错误,检查后发现是AND写成了ADD改正后原子程序如下:运行结果:结果很匪夷所思......是D;检查了一下,发现....我写错了,明明子程序中都把随机数放在BL里保存,而我写的output子程序里,是把AH的值赋给DL,AH的值在POPAX已经改变......最后改正后,随机数出炉了,先看程序:DATASSEGMENTDATASENDSSTACKSSEGMENTSTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AXmovax,0moves,ax;段偏移地址指向0000movbx,86h*4;把中断号86H的地址赋给BXmovax,offsetrandommoves:wordptr[bx],ax;把中断子程序的偏移地址存入;ES:[BX]movax,segrandom;取中断子程序的段基地址moves:wordptr[bx+2],ax;把段基地址存入ES:[BX+2]int86h;调用中断向量表的86号即RANDOM子程序calloutput;调用output子程序MOVAH,4CHINT21H;结束randomprocPUSHCXPUSHDXPUSHAX;寄存器保护STI;开中断,后面要调用int1ahMOVAH,0INT1AH;读取时钟滴答计数MOVAX,DX;把随机数存入AXandax,15MOVDL,10DIVDL;除以10,获得1-9的随机数MOVBL,AH;把随机数存入AHPOPAXPOPDXPOPCX;恢复寄存器的值IRETrandomENDP;子程序返回outputprocnearaddbl,0movdl,blmovah,02hint21hRet;很简单的输出子程序outputendpCODESENDSENDSTART运行结果因为是随机的,所以就不一一运行了结束!3、键盘输入10个学生的成绩,编写一个程序统计60-69,70-7

文档评论(0)

ddf55855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档