当前位置:文档之家› 微机原理与接口技术汇编子程序涉及

微机原理与接口技术汇编子程序涉及

试验五汇编子程序设计一、试验目的(1)掌握汇编子程序设计的一般方法;(2)掌握汇编子程序的调试方法;(3)掌握递归子程序设计与调试方法。

二、输入输出子程序1、十进制数输入子程序decibin子程序名:decibin子程序功能:用户输入十进制数放在BX中入口参数:无出口参数:BX存放输入的十进制数受影响的寄存器:AX、BX、CX、DX和标志寄存器注意:①用户输入字符‘0’~‘9’,当输入非法字符时结束输入,如回车;②十进制数位数可以是1位、2位等,范围0~65535。

decibin proc nearmov bx , 0newchar: mov ah , 1int 21hmov dl , alsub al , 30hjl exit1cmp al , 9jg exit1cbwxchg ax , bxmov cx , 10mul cxxchg ax , bxadd bx , axjmp newcharexit1: retdecibin endp2、十六进制数输入子程序hexibin子程序名:hexibin子程序功能:用户输入十六进制数放在BX中入口参数:无出口参数:bx存放输入的十六进制数受影响的寄存器:ax、bx、cx和标志寄存器注意:①用户输入0ah~0fh的数字时,输入大写字母‘A’~‘F’,小写字母‘a’~‘f’无效;②子程序不能控制数的位数可能0位、1位、2位……等位数,如果输入位数大于4位,则以最新的4位十六进制数为准;③输入字符可以按回车结束,当输入任何非法字符时也能结束数据输入。

hexibin proc nearmov bx , 0newchar: mov ah , 1int 21hsub al , 30hjl exitcmp al , 10jl add_tosub al , 7cmp al , 0ahjl exitcmp al , 10hjge exitadd_to: mov cl , 4shl bx , clmov ah , 0add bx , axjmp newcharexit: rethexibin endp3、十进制数显示子程序binidec子程序名:binidec子程序功能:将bx寄存器存放的数以十进制的形式显示出来入口参数:bx存放要显示的数出口参数:无受影响的寄存器:ax、bx、cx、dx和标志寄存器binidecdec_div图5-1 子程序binidec模块层次图binidec proc nearmov cx , 10000call dec_divmov cx , 1000call dec_divmov cx , 100call dec_divmov cx , 10call dec_divmov cx , 1call dec_divretbinidec endpdec_div proc nearmov ax , bxmov dx , 0div cxmov bx , dxmov dl , aladd dl , 30hmov ah , 2int 21hretdec_div endp4、十六进制数显示子程序binihex子程序名:binihex子程序功能:将di寄存器存放的数以十六进制的形式显示出来入口参数:di存放要显示的数出口参数:无受影响的寄存器:ax、bx、cx、dx和标志寄存器注意:显示十六进制数用到字符‘0’~‘9’和字符‘A’~‘F’,没有用到字符‘a’~‘f’。

binihex proc nearmov bx , 4lp: mov cl , 4rol di , clmov dx , diand dl , 0fhcmp dl , 9jbe nextadd dl , 07hnext: add dl , 30hmov ah , 2int 21hdec bxjnz lpmov dl , 'h'mov ah , 2int 21hretbinihex endp5、二进制数显示子程序binshow子程序名:binshow子程序功能:将bx寄存器存放的数以二进制的形式显示出来入口参数:bx存放要显示的数出口参数:无受影响的寄存器:ax、bx、cx、dx和标志寄存器binshow proc nearmov ah , 2mov cl , 16Again: shl bx , 1jnc nextmov dl , '1'push axint 21hpop axjmp mmNext: mov dl , '0'push axint 21hpop axmm: dec cljnz againretbinshow endp三、示例例5.1 显示学生分数等级编制一程序,要求接收从键盘输入的一个班级的学生成绩,并存放在50字的grade数组中。

然后根据grade中的学生成绩给出不同分数等级的学生人数,从终端中显示出来。

输入成绩用十进制,显示统计结果也用十进制数。

input decibin crlf rankp binidecdec_div main图5-2 程序模块层次图模块说明1、分数输入子程序input子程序名:input子程序功能:用户输入若干十进制数,放在grade内存变量中入口参数:无出口参数:grade变量中存放输入若干数据;count变量中记录数据个数受影响的寄存器:ax、dx、si和标志寄存器注意:①由于数据存放在字单元中,范围0~65535,无符号数;②数据间用逗号隔开,如87,75,95,63,90……如果用户输入87,回车,则子程序会出错,变量count统计的数据个数不对,注意逗号后一定跟上数据;③若干数据输入以回车结束或非法字符结束,如果用户输入非法字符,给出'Input Error!'提示;④定义变量 grade dw 50 dup(?)count dw ?mess1 db 'Grade?','$'mess2 db 13,10,'Input Error!',13,10,'$'⑤输入数据个数最多50个。

inputdecibin crlf图5-3 子程序input模块层次图2、统计分数子程序rankp子程序名:rankp子程序功能:将内存中存放的分数按照<60、60∽69、70∽79、80∽89、90以上统计出来,存放在变量中入口参数:CX要统计分数的个数;BX指示统计分数的首地址出口参数:统计结果存放在变量s10、s9、s8、s7、s6、s5中受影响的寄存器:ax、bx、cx和标志寄存器注意:变量s10、s9、s8、s7、s6、s5的初值应为0编程思路根据题目的要求,程序可由三部分组成:(1)输入:以十进制的形式输入班级中的学生分数;(2)统计:根据不同的等级统计学生人数;(3)输出:显示统计结果,以十进制显示。

该例中明显的特色是子程序的调用,图5-2显示了子程序间嵌套调用的关系,一般复杂的程序都是由子程序嵌套调用完成的。

在设计每一个子程序中要明确子程序的功能、入口参数、出口参数,子程序运行时应该注意的细节,其中包括子程序实现中缺陷、程序结束的条件、数据输入的范围等。

外加还要清楚子程序中对寄存器的影响,必要的时候可以利用堆栈或者内存变量保存寄存器的值。

复杂的程序一般都由若干子程序嵌套调用,调用时的层次关系也应该好好设计。

调用子程序前一般要对入口参数进行设置,然后调用子程序。

在本例中,调用子程序rankp,完成对学生分数进行统计,入口参数bx指示存放学生分数变量grade 的首地址,变量cx为分数的个数,指令语句如下:lea bx , grademov cx , countcall rankp参考程序清单datarea segmentgrade dw 50 dup(?)count dw ?s10 dw 0s9 dw 0s8 dw 0s7 dw 0s6 dw 0s5 dw 0mess1 db 'Grade?','$'mess2 db 13,10,'Input Error!',13,10,'$' mess100 db 13,10,'100 mark number:$'mess90 db 13,10,'90 mark number:$'mess80 db 13,10,'80 mark number:$'mess70 db 13,10,'70 mark number:$'mess60 db 13,10,'60 mark number:$'mess50 db 13,10,'no pass number:$' datarea endsprognam segmentmain proc farassume cs: prognam,ds:datareastart:mov ax , datareamov ds , axcall inputlea bx , grademov cx , countcall rankplea dx , mess100mov ah , 09int 21hmov bx , s10call binideclea dx , mess90mov ah , 09int 21hmov bx , s9call binideclea dx , mess80mov ah , 09int 21hmov bx , s8call binideclea dx , mess70mov ah , 09int 21hmov bx , s7call binideclea dx , mess60mov ah , 09mov bx , s6call binideclea dx , mess50 mov ah , 09int 21hmov bx , s5call binidecmov ah , 4chint 21hmain endpbinidec proc nearmov cx , 10000 call dec_divmov cx , 1000 call dec_divmov cx , 100call dec_divmov cx , 10call dec_divmov cx , 1call dec_divretbinidec endpdec_div proc nearmov ax , bxmov dx , 0div cxmov bx , dxmov dl , aladd dl , 30hmov ah , 2int 21hretdec_div endpinput proc nearlea dx , mess1 mov ah , 09int 21hmov si , 0mov count , 0 enter: call decibininc countcmp dl , ','cmp dl , 13je exit2jne errorstore: mov grade[si] ,bxadd si , 2jmp entererror: lea dx , mess2 mov ah , 09int 21hexit2: mov grade[si] ,bxcall crlfretinput endpdecibin proc nearmov bx , 0 newchar: mov ah , 1int 21hmov dl , alsub al , 30h jl exit1cmp al , 9jg exit1cbwxchg ax , bxmov cx , 10mul cxxchg ax , bxadd bx , axjmp newcharexit1: retdecibin endprankp proc nearcompare: mov ax , [bx] cmp ax , 60jl fivecmp ax , 70jl sixcmp ax , 80jl sevencmp ax , 90jl eightcmp ax , 100 jne ninejmp change_addrnine: inc s9jmp change_addreight: inc s8jmp change_addrseven: inc s7jmp change_addrsix: inc s6jmp change_addrfive: inc s5change_addr: add bx , 2loop compareretrankp endpcrlf proc nearmov dl , 0ahmov ah , 02hint 21hmov dl , 0dhmov ah , 02hint 21hretcrlf endpprognam endsend start图5-4 程序运行结果程序调试我们说一说由子程序构成的程序的调试过程。

相关主题