微机原理软件实验报告.doc_第1页
微机原理软件实验报告.doc_第2页
微机原理软件实验报告.doc_第3页
微机原理软件实验报告.doc_第4页
微机原理软件实验报告.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机原理软件实验班级:姓名: 学号:实验目的通过自己编写汇编程序,掌握一门新的编程语言,加深对微机原理这门课程的理解并为以后的进一步学习巩固基础,以及增强个人的实践能力及编写调试代码的能力。实验任务及内容微机原理软件实验共有四个题目,如下:实验一、debug的使用。对给定的代码进行编译连接及执行,并通过单步调试来熟悉代码调试的方法,读懂所给代码所能实现的功能。实验二、编写一个汇编程序,实现分支和循环的功能。具体内容为:安排一个数据区,内丰有若干个正数,负数和零(第类数的个数都不超过9);编写一个程序统计数据区中的正数,负数和零的个数并将统计的在屏幕上显示。实验三、从键盘上输入若干两位十进制数,寻找其中的最小值,并在屏幕上显示。每两个十进制间要有自定义的分隔符;对输入字符要有措施并有适当的提示。将整个程序分解成若干模块,并分别用子程序实现。实验四、从键盘上输入学生的科目成绩,最后统计学生的总分并给出其排名,并将其结果显示在屏幕上。对输入要有一定的检错能力,输出要尽可能的考虑美观。代码设计思路及实验结果实验一因为该实验中的代码是给定的,故对该代码的设计思路就不详细的说明了。实验过程如下:将所给的代码拷到一个txt文档里面,保存后改名为 a.asm 。在cmd窗口内能过cd改变路径到.asm文件所在的目录下,输入masm a.asm,生丰a.obj 文件,然后再输入 link a.obj 生成一个可执行文件即完成编译和连接的过程。 由于所给的代码中没有包含显示出运行结果的代码,因些要看实验运行的结果还得通过debug的方法查看寄存器所存储的数来观察所得的结果。在前面的基础上,在cmd窗口中输入 debug a.exe 即可。运行结果如上图所示,命令g 003e 是让程序直接执行到003e处然后停下来,再观察此时内存里面所存储的数据。在代码中,数据段的定义如下:datsegmentadb20 ;(自定)bdb15 ;(自定)ydb3dup(0)zdb0,0dat ends由此可得各变量的内存的偏移量为:a:0000h;b:0001h;y:0002h;z:0005h。四个变量中,其中a和b为自定的一个参数(变量),而计算所得的结果存放在三个字节的变量y中(按高位放在高字节的原则存放),而z是一个临时的变量,用作调用子程序所传递的参数的存放位置。由图中可知,输入的变量a=14h,b=0fh,输出的结果为y=4c9h。通过阅读源程序可以知道这一段代码的作用是求出两个数的和的平方,其计数的方法是:y=a+b2=a2+2 a b+b2。其流程图好下所示:实验二源程序见附件。设计的基本思路是设置三个寄存器,用于分别记录正数,负数,零的个数。每当判断出一个数的正负性,则相应的寄存器自増1。最后将三个寄存器内的数据写到内存里面,并通过调用中断把结果显示到屏幕上。其流程如右图所示:主要的汇编代码如下:movbl,0;存放正数的个数movbh,0;存放负数的个数movdh,0;存放0的个数movcl,lenmovch,0movsi,offsetnumber;数据存储的初;始地址循环体cldlp:lodsb;读取一个数据区的数据cmpal,0jzzerojgposinega:incbh;负数加1jmpnextzero:incdh;零加1jmpnextposi:incbl;正数加1next:looplp程序运行的结果:其中数区的定义如下:datasegmentnumberdb0ffh,00h,78h,80h,24h,66h,89h,0fh,00h,45h,0efh,10h ;定义数据区lendb$-numbercountdb3dup(0);用于计数strdbthere are totally ,$str1db positive number.,0ah,0dh,$str2db negative number.,0ah,0dh,$str3db zeros.,0ah,0dh,$dataends如果对上面的结果再进一步处理,还能分别统计出正奇数,正偶数,负奇数,负偶数以及零的个数。其方法是在初步判断出一个数的正负性后再进行一次奇偶性的判断即可。其具体的实现代码如下:movcl,lenmovch,0movsi,offset number;循环体cldlp:lodsbcmpal,0saral, 1 ;进行一次右移,使其最低位移到标志位cf,通过cf来;判断该数的奇偶性jzzero;先判断该数的正负性jgposinega:jcneodjmpneevzero:movbl,count+4;零的个数加1inc blmovcount+4,bljmpnextposi:jcpoodjmppoev;若该数不为零,则判断其奇偶性pood:inc count;正奇数的个数加1jmpnextpoev:inccount+1;正偶数的个数加1jmpnextneod:inccount+2;负奇数的个数加1jmpnextneev:inccount+3;负偶数的个数加1next:looplp运行结果如下:其中数据段的定义如下:datasegmentnumberdb0ffh,00h,78h,80h,24h,66h,89h,0fh,00h,45h,0efh,10h ;定义数据区lendb$-numbercountdb5dup(0);用于计数,正奇,正偶,负奇,负偶,零strdbthere are totally ,$str1db positive odd number.,0ah,0dh,$str2db positive even number.,0ah,0dh,$str3db negative odd number.,0ah,0dh,$str4db positive even number.,0ah,0dh,$str5db zeros.,0ah,0dh,$dataends实验三该实验的流程图如右边所示,主要分成输入,处理和输出三个模块,其关系如下图所示。输入模块主要的作用是输入该程序中所要处理的数据。输入的格式是“*,*,*,*”其中“*”是两位十进制数,“,”是程序中定义的分隔符。在输入模块中并没有检错功能,检错这一功能由处理模块承担。另外,输入的字符串最大长度为29,因此该程序中能处理的最多的两位十进制数的个数为10。处理模块有两个主要的功能,其一是检错,一旦发现了输入的字符串中有不合法的部分,则报错且终止程序的运行;其二是找中所有输入数据中的最小值。最右边的模块可以看出,程序中用来寻找是小值的算法是最简单的逐个比较的方法。另外,检错主要有以下几个方面:1、检查输入的字符串的长度是否合法,因为输入的格式是固定的,因此其长度n应满足以下条件n mod 3=2,即n除以3后的余数为2;2、分隔符是否合法,在该程序中,唯一合法的分隔符是“,”,因此在应该出现分隔符的地方就只能是“,”而不能是别的其它任何符号;3、分隔符以处的字符是否对应于数字09的ascii码,如果不是的话则判断其为不合法的输入。输出模块的主要功能是显示程序最终的结果。程序运行结果如下,下面的为输入合法的情况,其中第一行为输入的数据:下面为输入不合法的情况:实验四由于该程序比较复杂,因此该程序的流程图分模块给出,首先是一个程序的主体流程图。初始化模块如下图所示。其中写入内存的操作包括计算出学生三科成绩的总分以及把总分写到内存里面。排序模块如下所示。显示模块的流程如下图所示。由于代码量较大,具体的代码实现就不一一在这里解释了,这里只说明一些的方法。由于每一个学生在存储的信息有他的8位学号以及三科成绩(满分为100分),每一科成绩只需要一个字节的空间即能存储,而总分满分为300分,至少需要两个字节对能存储,因此对应每个学生都需要有13个字节的存储空间,这是程序设计的最基本的构想。另外,输入的格式是“分数,分数,分数”,其中的分数可以是0到100任意的数字,超出范围则会报错。另外,对于不合法的分隔符也会报错。对于排序模块,产生一个索引表的目的是方便对每一个学生分数的查询,整个程序中只会根据一个学生的叫分而排名。而存储每个学生的总分的内存空间(两字节)的初始地址的计算公式为position=stu+13*i-1+11,其中stu为存放学生信息的初始偏移地址, i为学生的序号。由于计算公式比较复杂,因此另外建立一个索引表来方便对学生成绩的查询。具体的实现方法是初始化另一版内存空间,用来专门存放学生的总分。然后每一个学生的总分就可以通过该索引查询得到,其具体的计算公式为position=table+i+i-2,其中table为索引的初始偏移地址。最后要说明的是显示部分的内容,在初始化程序的时候已经先定义了一片内存空间,定义如下:headdbrank,9h,no.,9h,9h,chn,9h,math,9h,eng,9h,all,0ah,0dh,$rnkdb2dup(?)db9h,9hshownumdb8dup(?)db9hchndb3dup(?)db9hmathdb3dup(?)db9hengdb3dup(?)db9halldb3dup(?)db0ah,0dh,$其中head是显示表头所用的字符串,接下来的几个字节分别是学生的排名(rnk)、学号(shownum)、语言成绩(chn)、数学成绩(math)、英语成绩(eng)、总分(all)。每次显示一个学生的信息之前只需修改其中的rnk、shownum、chn、math、eng、all几项即可。程序运行结果如下所示:预习题回答实验一、1. 熟悉常用的 debug 命令.略。2.阅读并分析程序的功能.该程序的功能是计算出两个给定的数的和的平方,并把计算所得的结果存储到内存段是偏移量为02h开始的三个连续的字节空间。3.若 ss=2000h,sp=ffffh, 向堆栈中压入 4 字节数据后,如何用 d 命令显示压入堆栈的内容?在debug的环境下输入-d 2000:fffc ffff即可看到压入栈里面的四个字节的数据。实验二、1.十进制数 0 - 9 所对应的 ascii 码是什么? 如何将十进制数 0 - 9 在屏幕上显示出来?十进制数 0 - 9对应的ascii码为30h39h。将十进制数0 - 9 在屏幕上显示须先将这一个数加上 30h即可。如寄存器al里面存着01h,要在屏幕上显示出来,先执行代码add al 30h,然后再调用中断即可。2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?(不妨假设该数已经存在寄存器al里面),通过一次计算,使得al里面的值不发生变化而只影响标志位。然后通过标志位zf和sf来判断其正负性。计算的方法有以下几种:addal0hsub(cmp)al0horal0htest(and)al0ffhxoral0h实验三、1.如何将输入的两个字符(0 - 9)变为十进制或二进制数?输入后,存储在内存中的数据是十位和个位所对应的ascii码,且十位在低位,个位在高位。十位和个位的ascii码各自减去30h,就可得到该十进制数的bcd码(十位依然在内存低位,个位在内存高位),最后将对应十位和个位的内存中所存的数据交换即可变为十进制数(非压缩bcd码)。若要变为二进制数,只需将十位上的数乘以10再加上个位即可。2.如何将选出的最小值(二进制或十进制)变为 ascii 码再进行显示?方法有两种:方法一:不妨假设程序中是通过非压缩的bcd码比较大小且存储,此时只要将对应的位数上加上30h,再交换其位置即可。方法二:数据输入后,并不将其转换成十进制或二进制后比较大小,可以直接通过其ascii码直接比较大小。但要注意数据输入后,所输入的两位十进制数的十位存放在内存的低位,而个位存放在内存的高位,因此在比较前应先交换两者的位置再作比较。这样做的好处是,不必将输入的ascii码转换成十进制或二进制数,比较后不必再将其转换成ascii码,大大增加其运行效率方。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?在十进制和十进制中运算中,用十进制进行运算会比较合适,因为采用十进制的话只需将对应的数据减去30h即可完成所需的转换,而不必像二进制转换那样还需通过求余而转换成二进制数。但个人感觉直接采用acsii码比较大小会更加合适这个实验,方法就如问题二回答所述那样。实验四、1.如何确定一个学生在这门科目中的名次? 将学生的成绩记录下来,并选用适当的排序方法即可产生学生的名次。具体的方法可能在内存定义一块区域,用来存储对应学生的名次结果。2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单? 可以使用直接插入排序或冒泡排序的方法。3.准备好模块层次图. 该程序中,模块的实现方法是子程序。主要的模块有:初始化模块,输入模块,排序模板,索引生成模板,显示模板,ascii码生成模板。4.给出输出显示的形式. 实验总结和c/c+这些高级语言相比起来,汇编语言代码的编写就更加复杂了,也难怪之前c+的老师说学好java只需要三个月,而学好c+要两三年,而学好汇编至少得要四五年。到现在才开始体会到底层代码汇编学习的困难,几乎所有的功能都得自己来实现,就连在c+中最基本的数组操作在汇编语言里面用起来都是非常费劲的。初步接触了汇编语言,才开始意识到面向对象编程的重要性,如果所有的底层代码都得自己来写的话,那么开发一个软件是多么费劲的一件事啊!当一名程序员是多么的悲剧啊!虽然说汇编难学,不如别的高级语言用起来方便。但在一些情况下还是不得不用汇编语言,例如在做一些底层东西,或者是做一些接口的时候,就不得不用汇编语言了。还好,我对编程还是挺感兴趣的,至少比起那些无聊的理论课程,如电磁波与电磁场,汇编有意思多了还是说回这个实验吧,第一和第二个实验还是非常简单的,由于之前自己研究过java语言,同样是在cmd的窗口下进行编译的,所以第一个实验很快就完成了。至于第二个,基本上就是一些基本的编程方法,也没有什么难的地方。第三个也不算难,主要是在字符串的读入。怎么判断用户输入的字符串是否合法等一系列问题也困扰了我一段时间。还好,我的编程能力还是比较强的,这些小问题都很快就被我解决掉了。一口气下来,前三个实验就做完,事后都不记得自己写过这几个程序的代码了。当然,在这之中也遇到过一些困难,比如我在输入单个字符的时候,把输入后的字符显示出来后发现会是一个固定的字符$。当时我写的代码是先调用一次中断,进行单个字符的输入,然后再调用一次中断,进行换行并输出一些提示的语句,再把刚才输入的那个字符用显示单字符的方法显示出来。结果发现我用键盘输入任何键,最后显示出来的字符都是一个$。为了弄明白这个问题,我对那几句简单的程序也调试了整整两天了,最后才弄明白出现这种现象的原因:单字符输入后,字符是存储在寄存器al里面,而再次调用中断进行字符串输出的时候会改变寄存器al里面的内容!当时我并不知道会有这样的情况发生,且书上也没有相关的说明。在这几个实验里面,最难的莫过于第四个了(第五个因为时间问题没有做)。当我一看到这个题目的时候,我就冒出这样一个构想,要写出一个简单的系统,可以管理记录学生的成绩和排名,想到个人精力的问题,还是把自己之前的构想给简化了。简化成一共可以处理最多50个学生的信息,每个学生有三科成绩,给每一个学生输入对应的分数后会得出每一个学生三科成绩的总分,并根据其部分进行排名,最后的结果以一个简单的表格给出。就按照自己这种构思开始写起代码来了。在这之中,最难的就是读入学生的成绩了。由于是同时输入一个学生三个科目的成绩,而每一科成绩可能是一位数,也可能是两位数,还可能是三位数!所以读入一个学生三个科目的成绩的算法就变得非常的复杂,但我还是厚着头皮开始写了起来了。当我把这个算法写得差不多的时候,代码都已经有200多行了而后面还有排序显示等一大堆代码要写。当我在郁闷这个程序怎么会这么难写的时候,我看了一下周边一些同学的代码,大多都只有一百多行。问了他们才知道,原来是我理解这个题目理解错了,而我写的这个程序已经超出了原来的要求算了,都写了一半了,还是坚持写下去吧。凭着这一股傻劲又继续写起我的代码。苦战了两天,总算把这五百行的代码写完了。写完了之后就是无尽bug的调试改好了一个bug后又会冒出另一个新的bug,调试程序最痛苦的事情莫过于此了。又用了两天的时间才把程序里面一些大大小小的bug一个一个改完了,程序也总算正常动作起来了,一些非法的输入也能有必要的处理。终于写完了,程序总算能按我的想法运行起来了!也许,对于一个程序员来说,这就是他们最能感到欣慰的事情了。从最开始知道自己面对的困难,然后接受困难的挑战,最后战胜困难,这能大幅度提升一个人的能力。我也相信通过这一次微机原理的软件实验,我的实践能力,尤其是编程能力也会有大幅度的提升,从而为我人生前进的道路再铺上了一块坚实的砖块。附件实验b代码datasegmentnumberdb0ffh,00h,78h,80h,24h,66h,89h,0fh,00h,45h,0efh,10h ;定义数据区lendb$-numbercountdb3dup(0);用于计数strdbthere are totally ,$str1db positive number.,0ah,0dh,$str2db negative number.,0ah,0dh,$str3db zeros.,0ah,0dh,$dataendsstacksegmentstackstackdb 100hdup(?)stackendscodesegmentassumecs:code,ds:data,ss:stackstartprocfarpushdsxorax,axpushaxmovax,datamovds,axmovbl,0;存放正数的个数movbh,0;存放负数的个数movdh,0;存放0的个数movcl,lenmovch,0movsi,offset number;循环体cldlp:lodsbcmpal,0jzzerojgposinega:incbhjmpnextzero:incdhjmpnextposi:incblnext:looplpmovbyte ptr ds:count,blmovbyte ptr ds:count+1,bhmovbyte ptr ds:count+2,dh;显示结果movah,09hmovdx,offset strint21hmovah,02hmovdl,ds:countadddl,48int21hmovah,09hmovdx,offset str1int21hmovah,09hmovdx,offset strint21hmovah,02hmovdl,ds:count+1adddl,48int21hmovah,09hmovdx,offset str2int21hmovah,09hmovdx,offset strint21hmovah,02hmovdl,ds:count+2adddl,48int21hmovah,09hmovdx,offset str3int21h;等待用用户按下一个键后退出程序movah,1int21hretstartendpcodeendsendstart实验b选做题代码datasegmentnumberdb0ffh,00h,78h,80h,24h,66h,89h,0fh,00h,45h,0efh,10h ;定义数据区lendb$-numbercountdb5dup(0);用于计数,正奇,正偶,负奇,负偶,零strdbthere are totally ,$str1db positive odd number.,0ah,0dh,$str2db positive even number.,0ah,0dh,$str3db negative odd number.,0ah,0dh,$str4db positive even number.,0ah,0dh,$str5db zeros.,0ah,0dh,$dataendsstacksegmentstackstackdb 100hdup(?)stackendscodesegmentassumecs:code,ds:data,ss:stackstartprocfarpushdsxorax,axpushaxmovax,datamovds,axmovcl,lenmovch,0movsi,offset number;循环体cldlp:lodsbcmpal,0saral, 1 ;进行一次右移,使其最低位移到标志位cf,通过cf来判断该数的奇偶性;先判断该数的正负性jzzerojgposinega:jcneodjmpneevzero:movbl,count+4inc blmovcount+4,bljmpnextposi:jcpoodjmppoev;若该数不为零,则判断其奇偶性pood:inc countjmpnextpoev:inccount+1jmpnextneod:inccount+2jmpnextneev:inccount+3next:looplp;显示结果movah,09hmovdx,offset strint21hmovah,02hmovdl,ds:countadddl,48int21hmovah,09hmovdx,offset str1int21hmovah,09hmovdx,offset strint21hmovah,02hmovdl,ds:count+1adddl,48int21hmovah,09hmovdx,offset str2int21hmovah,09hmovdx,offset strint21hmovah,02hmovdl,ds:count+2adddl,48int21hmovah,09hmovdx,offset str3int21hmovah,09hmovdx,offset strint21hmovah,02hmovdl,ds:count+3adddl,48int21hmovah,09hmovdx,offset str4int21hmovah,09hmovdx,offset strint21hmovah,02hmovdl,ds:count+4adddl,48int21hmovah,09hmovdx,offset str5int21h;等待用户输入任意键后退出程序movah,1int21hretstartendpcodeendsendstart实验c代码;宏定义;宏print用于输出字符串printmacrostringpushaxpushdxmovah,09hmovdx,offset stringint21hpopdxpopaxendm;宏getl用于取出一个较大的数,存在bx里面;getlmacro;localjump;cmpbx,si;jajump;movbx,si;jump:nop;endm;宏check判断一个字符是否一个数checkmacrocmpal,0jbsetbackcmpal,9jasetbackcmpah,0jbsetbackcmpah,9jasetbackendm;数据段的定义datsegmentstrenddbpress any key to quit.,0ah,$strerrdbinvalid input!,$ansdbthe smallest number you input is ansnumdw0hdb .,0dh,0ah,$;buffer用来存储用户输入的字符串bufferdb30lendb0hbufdb30dup(0)nelidb0ah,0dh,$;data用来存储用户输入的数据datendsstacksegmentstackstackdb100hdup(?)stackendscodesegmentassumecs:code,ds:dat,ss:stackstart:movax,datmovds,axcallinputmovah,09hmovdx,offsetneliint21hmovdl,0;dl用作输出,用来判断数据输入是否有误callgetdacmpdl,0jzokprintstrerrjmpexitok:calldispexit:printstrendmovah,1int21hmovax,4c00hint21hinputprocnearmovdx,offset buffermovah,0ahint21hretinputendpgetdaprocnear;先计算输入字条串的长度,以计算出输入数据的个数moval,lenincalmovah,0hmovbl,3;divbl ;bl里存放的是输入字符串中数据的个数cmpah,0jzcontisetback:movdl,0ffhretconti:leasi,bufmovcl,al;将bl里面的数据转存到cx里面movch,0h;movbx,3939hlpget:lodswcheck;宏调用xchgal,ahcmpbx,axjbgomovbx,axgo:cmpcx,1hjzgetdaelodsb;判断是否使用了合法的分隔符cmpal,jnzsetbacklooplpgetgetdae:retgetdaendpdispprocnearxchgbl,bhmovansnum,bxprintansretdispendpcodeendsendstart实验d代码;第一部分为宏定义printmacrostring;打印用的宏pushaxpushdxmovah,9hleadx,stringint21hpopdxpopaxendminputmacrodes;输入用的宏,且输入后能够自动换行pushaxpushdxmovah,0ahleadx,desint21hprintnel;调用打印宏,实现换行popdxpopaxendmisnummacroreg,notnum;jump为输入非数字时跳向的标号localtemp1,temp2cmpreg,09hjatemp1jmptemp2temp1:jmpnotnumtemp2:nopendmissepmacroreg,notseplocalsepacmpreg,;若reg里面的是一个逗号,则它是一个合法的分隔符jzsepacmpreg,0dh;若reg里面的是一个回车,它也是一个合法的分隔符jnznotsepsepa:nopendm;以下这个宏的作用是查表,al和ah为表的下标,也即表range的下标,将对应的叫分成绩分别放到寄存器bx,dx里面refermacropushaxmoval,ahmovah,0hleabx,rangeaddbx,ax;找到在ah位置的学生的序号,并把他的成绩存到dx里面moval,bxleabx,tableaddbx,axaddbx,axsubbx,2hmovdx,bxmovbp,spmovax,bpmovah,0hleabx,rangexlatrange;找到在al位置的学生的序号,并把他的成绩存到bx里面decalleabx,tableaddbx,axaddbx,axmovax,bxmovbx,axpopaxendmexchgmacropushaxmoval,ahmovah,0hleasi,rangeaddsi,axpopaxmovah,0hleadi,rangeadddi,axmoval,sixchgal,dimovsi,alendm;*datsegmentstrenddbprogram is over.please press any key to quit.,0ah,0dh,$;开始运行程序时显示的欢迎字符串;用于输入提示的字符串input1dbplease input the the number of students in your class :,$input2dbplease input the score of student with the number snumdb8dup(0)db (chinese,math,english): ,$strerrdb0ah,0dh,invalid input!plesase input the data again: ,$neldb0ah,0dh,$;用于换行的字符串 headdbrank,9h,no.,9h,9h,chn,9h,math,9h,eng,9h,all,0ah,0dh,$rnkdb2dup(?)db9h,9hshownumdb8dup(?)db9hchndb3dup(?)db9hmathdb3dup(?)db9hengdb3dup(?)db9halldb3dup(?)db0ah,0dh,$bufferdb12db0bufstrdb12dup(?)stubegdb082100count2db0;把最后两个数字单独提取出来,以方便改变,这个是十位count1db0;这个是个位stunumdb0;学生的个数studb650dup(0);每个学生占有13个字节空间,前八个记录学号,最多50个学生;第9到第11个记录三个科目的成绩;最后两个字节存储学生的总分tabledw50dup(0);方便排序时查每一个学生总分所使用的表rangedb50dup(0);存储排序后的结果tempdb3dup(?)datends;*stasegmentstackstackdb100dup(?)staends;*codsegmentassumecs:cod,ss:sta,ds:dat,es:datstart:movax,datmovds,axmoves,ax;*主程序部分*callinicallsortcallshow;*主程序结束*printstrendmovah,1hint21hmovax,4c00hint21h;*;初始化子程序iniprocnearcldprintinput1stini:movah,0ahleadx,bufferint21hprintnelleabx,buffermoval,bx+1;取得输入字符的个数cmpal,2hjbenext1;输入的字符串小于等于2时,则判定为合法的输入,并进入下一步的处理err1:printstrerrjmpstini;返回重新输入next1:jzlen_2;分输入字符串的长度为1和2两种情况处理moval,bx+2;长度为1的情况movah,30h;使ah为0,其中30h为0的ascii码subax,3030h;转ascii码为十六进制数isnumal,err1jmpisanum;确定输入的是一个合法的数len_2:movax,bx+2;长度为2的情况xchgal,ahsubax,3030hisnumal,err1isnumah,err1isanum:cmpax,500h;确定输入的是一个数字,则跳到此处jaerr1;输入的学生个数大于50,则报错movdl,almoval,ahmovah,0hmovdh,0ahmuldhaddal,dlmovstunum,almovcx,ax;开始为每一个学生产生一个学号movdl,0h;dl作为第二个计数变量numlp:moval,count1;循环的第一步是,让目前的学号自增1cmpal,39hjnznext2moval,2fhinccount2next2:incalmovcount1,alleasi,stubeg;进行第一次学号的拷贝,拷贝至字符串输出区leadi,snumpushcxmovcx,8hrepmovsbpushaxmoval,0dhmuldl;计算第学号第二次拷贝的内存地址,其计算公式为 stu + 13 * dlleabx,stu;并把计算的结束存到bx里面addbx,axpopaxmovdi,bxleasi,stubegmovcx,8hrepmovsb;进行第二次拷贝callgetnum;调用函数popcxinc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论