资源描述:
《汇编程序设计 分支结构的程序设计 实验报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1《汇编语言程序设计》实验报告2实验五分支结构程序设计实验目的1、掌握利用无条件转移指令JMP和有条件转移指令实现多分支程序的设计方法。2、掌握用DOS的中断调用,实现在程序执行过程中从键盘动态输入字符串的方法。3、掌握程序中标号的定义和使用。实验内容实现从键盘输入一个月份数值(1-12),根据输入的月份数值显示相应的月份英文单词缩写,如输入5则显示May。实验步骤1、编辑下列程序:.modelsmall.stack.datamondb'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,No
2、v,Dec'msg1db'Pleaseinputamonth(1-12):',13,10,'$'msg2db'Inputerror!Nowtryagain...',13,10,'$'bufferlabelbyte;定义输入月份的输入缓冲区maxlendb3;最多2个数字,包括一个回车actlendb?;保存实际输入的字符个数stringdb3dup(?);保存输入的月份数字内容(ASCII码).code.startupshuru:;开始输入月份编号leadx,msg1movah,09hint21h;显示提示信息leadx
3、,buffermovah,0ahint21h;输入月份数值cmpactlen,0;若没有输入月份则转出错处理jeshuruerr;以下判断输入月份是否合法3leadi,stringcmpactlen,2jeda10;若输入的是2位数月份值则转到da10标号处执行moval,string;若只输入1位数字月份值,则读出该值andal,0fh;把ASCII码转换为对应数字jmpjisuanda10:moval,stringandal,0fh;把月份数值十位的ASCII码转换为对应数字(如12月的1字)movbl,10mulb
4、landstring[1],0fh;把月份数值个位的ASCII码转换为对应数字addal,string[1];十位加上个位(如12月)jisuan:;以下计算偏移地址cmpal,1;比1小是非法月份jbshuruerr;若月份值小于1则转出错处理cmpal,12jashuruerr;比12大也是非法月份subal,1;月份值减1shlal,1shlal,1;月份再乘4对应了MON字符串中从首地址开始的字符相对位置xorah,ah;1月份从0位置开始即JAN,...5月份从位置16开始即MAYleasi,mon;找到被显示
5、月份字符的位置addsi,axmovcx,3output:movdl,[si];输出对应月份英文缩写movah,2int21hincsiloopoutput.exit0shuruerr:leadx,msg2;输入出错时提示出错,并转到程序起始处重新执行movah,09hint21hjmpshuruend4图5-1键入代码5图5-2编译通过2、程序汇编通过后,运行程序察看输出结果。图5-3程序运行结果3、程序运行中不输入月份值(直接回车),或输入非法月份值,观察程序执行的情况。图5-4直接回车或输入非法月份值观察输出实验体
6、会1.无条件转移指令JMP(UnconditionalJump):JMP指令的一般形式:JMP标号/Reg/MemJMP指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个短(short)转移(偏移量在[-128,127]范围内),近(near)转移(偏移量在[-32K,32K]范围内)或远(far)转移(在不同的代码段之间转移)。短和近转移是段内转移,JMP指令只把目标指令位置的偏移量赋值指令指针寄存器IP,从而实现转移功能。但远转移是段间转移,JMP指令不仅会改变指令指针寄存器IP的值,而且还会改
7、变代码段寄存器CS的值。该转移指令的执行不影响任何标志位。2.无符号数的条件转移指令(JumpsBasedonUnsigned(Logic)Data)6图5-5无符号数的条件转移指令3.在编写分支程序时,要尽可能避免编写“头重脚轻”的结构,即:当前分支条件成立时,将执行一系列指令,而条件不成立时,所执行的指令很少。这样就使后一个分支离分支点较远,有时甚至会遗忘编写后一分支程序。这种分支方式不仅不利于程序的阅读,而且也不便将来的维护。所以,在编写分支结构时,一般先处理简单的分支,再处理较复杂的分支。对多分支的情况,也可遵循
8、“由易到难”的原则。因为简单的分支只需要较少的指令就能处理完,一旦处理完这种情况后,在后面的编程过程中就可集中考虑如何处理复杂的分支;4.在屏幕上从当前光标位置开始显示一个字符串:MOVDX,OFFSETSTRING;取字符串的首地址MOVAH,09H;系统调用功能号送AHINT21H此调用的入口参数为内存缓冲区中字