计算机模拟学,传统计算机模拟学习程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

⑶程序说明。

本试验在内存的第一个区域保存一个字符串,在第二个区域保存若干字符串,其中有一个与前一区域的一样。运行时,把第一区域的字符串与第二区域的字符串相比较,当找到后等待键盘指示,按任意键后结束程序。如果在第二区域没有写入与第一区域相同的字符串,程序在找不到后不等待键盘指示,直接结束。

PUSH与POP分别是入栈和出栈指令,它们往往要成对使用才不会造成堆栈中数据的混乱,它们经常写在程序的不同部分,要遵循先入的后出原则,出栈的位置往往要根据需要,已经用不着的入栈数据可以作把它无用出栈。多个数据入栈时,谁先入谁后入必须认真考虑,错了数据就张冠李戴了。它们的用途有两种:一种是暂时在堆栈中保存一下数据以防丢失;另一种是用堆栈传递数据,特别是向不能直接使用MOV指令但能使用POP指令接收数据的寄存器。在这里DI的入、出栈是第一种功能,由于比较时DI的数值要变,重新比较时要出栈使它恢复原来的数值,以便于移动指针。这里还使用了PUSH与POP指令的第二个功能,即传递数字功能。由于“反复比较”指令要使用数据段(DS)和附加段(ES),要在段寄存器中写入这些段的实际地址。而这些段寄存器又不能直接用MOV指令传递数据,要先把数据传入AX中,再由AX传入它们中(第一节就用这种方法把CS的值传到DS中)。而入、出栈指令可以直接对这些段段寄存器操作,并且是单字节指令,可以减少程序长度。在这里的入、出栈操作实际是把CS的段地址传递给DS和ES,作为DS和ES的段地址。

字符串比较的核心指令是CMPS,它又有两种形式:CMPSB是每次比较字符串的一个字节,CMPSW是每次比较字符串的一个字(两字节)。指令前面又可以加前缀REPZ,它表示反复比较,反复的次数由CX中的数值确定,这样CX的值就是字符串的长度。没有前缀就只比较一字节或一字。CLD是与STD对应的,STD是设置比较由后往前进行,而CLD是清除STD的设置的。如果能够确定前面确实没有STD指令,不使用CLD也不会产生从后往前找的效果,使用了也不会产生别的效果。在使用CMPS指令时还有一些规定:比较的源串由DI指出地址,目的串由SI指出地址。它们只能指出段内地址,规定DI的段地址由ES给出,SI的段地址由DS给出。这样,在执行CMPS指令前要作很多准备工作:设置数据段和附加段的地址,设置源串和目的串的指针,设置比较次数等。比较工作是这样进行的:先按SI和DI的指出地址各取出一个字或字节进行比较,并把CX减一,DI、SI分别减二或减一,再按新SI和DI的指出地址各取出一个字或字节进行比较,如果比较中有一个字节不同就停止比较(显然整个字符串已不可能相同),或直到CX为零停止比较。这样就比较了一个字符串。找到要找的字符串时,SI和DI分别是在字符串后面的存储单元地址,如果把与要找字符串相关的内容写在后面,就可以依据它找到那些内容。

实际比较是用一个字符串与一些字符串比较,因此要设置循环进行反复比较。这里用JMP这个绝对转移指令实现循环。编制程序时对循环内外要格外留心。这里,CX、SI在比较一个字符串后就要变化,反复比较时要再设回原值,所以放在循环以内。DI的变化表示被比较的一些字符串的变动,但在每个字或字节比较时它也变动,所以要在字符串比较前保存DI的原值,在每次比较停止后再恢复原值。DI原值加字符串字节数就是下一个字符串的首址。由于采用绝对转移指令,必须设置循环出口,才能避免无限循环。这里设置了两个循环出口,以反映能找到和不能找到两种情况。紧接在CMPSW后面的JZ指令是找到后的出口,它转移到循环外的键盘输入中断调用功能块,用该功能块实现等待。“CMP DI,XX”是检查数据区是否结束的,XX是数据区的尾址。当到了数据区尾仍旧找不到要找的字符串,显然不可能找到了。就由紧接在其后的JZ指令转移到返回DOS中断调用功能块,不等待而直接结束程序。如果没有这个设置,程序会一直循环下去,造成死机。这里还要注意:用JZ指令的意义太狭窄,有时已经超过数据区的尾址,但是没有相等过,所以还是无限循环下去。用大于等于指令比较保险。本程序中DI是等量增长,所以一定能出现相等的情况。

由于要在一些字符串中寻找一个字符串,就要有保存这些字符串的数据区。而且字符串越多,数据区越大。这里由于数据较少,我们把源串和目的串都保存在代码段。并设置ES、DS与CS同一段。130处保存着要查找的字符串“你在干什么?”。140处保存着被查找的“你想干什么?”、“你在想什么?”、“你是什么人?”、“你在干什么?”等一些字符串。往程序的数据区中写这些字符的方法很简单:在中文操作系统下进入DEBUG,用E或F命令都可以,但是E比F方便,E只要给出首址就可以了,F却要给出首、末地址。

⑷程序的制作和使用。这个程序编成名为BIJIAO.COM文件,可以在DOS下运行。但是由于找到的字符串不显示。在DEBUG中执行效果更好。由A命令把汇编语言翻译为代码语言后,可以在T=100的命令下一条条地执行。由于是在DEBUG中执行,数据区可以修改,观察到能够找到和不能找到两种情况。执行时还可以观察到反复执行CMPSW的情况:CX不断减少、DI和SI断减少。也可以观察到找到后的转移、找不到后的转移等�

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大生群体。无论你是计算机相关专业的生,还是对其他领域编程感兴趣的生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值