北京邮电大学_微机原理软件实验报告 下载本文

mov dx,0 mov bx,0 jmp print print: mov cl,[si] cmp cl,'$' je print_data mov byte ptr es:[di],cl inc di mov byte ptr es:[di],07H ;07H~代表颜色为黑底白字 inc di inc si jmp short print print_data: ;打印记录存储的数据值 push si mov si,offset s1 mov cl,[bx] add cl,48 mov byte ptr es:[di],cl inc di mov byte ptr es:[di],71H ;71H~代表颜色为白底蓝字 cmp dx,640 je ending add dx,160 mov di,dx pop si inc si inc bx jmp print ending: mov ax,04c00H int 21H code ends end start

六、实验过程及解释

本次实验要求统计数据区内正奇数、正偶数、负奇数、负偶数、零的个数,首先将数据区的数值与0比较,按数字的正、负或零的特性分别跳转至处理正数的子程序段、处理负数

的子程序段、处理零的子程序段。其中,在处理正、负数的子程序段,对于正负数进行带符号的除二运算,通过判别余数是否为零判别该数是偶数还是奇数,并且判别后将各个对应的 正奇数、正偶数、负奇数、负偶数、零的个数进行统计。程序在统计完所有类型的数的个数后,会向显存中写入数字,将统计好的数值以可视化形式呈现出来。 编译运行程序结果如下: a.

通过masm和link命令使得程序编译链接成功。 b.

由运行结果可看到与数据区设置的正奇数、正偶数、负奇数、负偶数、零的个数一致。

七、实验总结

这次实验相较于第一次实验而言,程序需要自己独立设计并且首次涉及到了向屏幕打印数据的程序编写。为了充分理解向屏幕打印数据的细节方面,我没有选择中断的调用去打印数据,而是自己往显存中直接写入数据并且在屏幕上呈现。为了编程实现字符向屏幕端的打印,我需要理解显存的数据存储,如一个ASCII码在屏幕端的显示需要两个字节,屏幕通常一行是显示80个字符,也即一行对应160个字节,同时要使得数据呈现时比较美观,还需要自己设计换行等数值的运算,这些都花了我很多时间去调试,不过这也使得我更完整地理解了显存的工作原理,为之后实验打下了基础。

实验三 代码转换程序设计

一、实验目的

1.掌握几种最基本的代码转换方法; 2.运用子程序进行程序设计。

二、实验内容

1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。 2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。 3.对输入要有检错措施,以防止非法字符输入,并有适当的提示。

4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图。

三、 预习题

1.如何将输入的两个字符(0~9)变为十进制或二进制数?

答:输入的字符0~9是ASCII码表示的,对应于30H~39H,通过减去30H,可

以转换为相应的二进制数。

2.如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示?

答:由于在数据区存储的最小数的数值为二进制数,同时要以十进制易于读的形式转

化为ASCII码并显示,需要进行除十取商及取余运算,并将取出的二进制形式的商、余数加上30H,转化为对应的ASCII码值。 3.你觉得采用二进制运算还是十进制运算更适合于这个实验?

答:由于存储器、寄存器中存储的数据形式都是二进制形式的,所以我觉得采用二进

制运算更适于本实验,我在程序的设计、编写中也是采用了二进制运算。

四、 程序流程图

a. 模块层次图

b.完整程序流程图

五、程序源代码

;****************************************************************************** ;* 作者:LQ * ;* 日期:2017/11/22 * ;* 功能: * ;* 输入若干两位十进制数,寻找最小值,并打印至屏幕(默认十进制数均为正数) * ;****************************************************************************** assume cs:code data segment db 'Wrong Input!','$' db ' ','$' ;前两行字符串,用于向屏幕打印发生错误时的字符串 db 127,0,0 ;用于存储输入的数字,并且于首位存储着最小的数值 data ends code segment message:db 'The minimum num is:','$' ;用于最后向屏幕打印最小值的字符串 start: mov ax,data mov ds,ax xor si,si mov di,1AH ;1AH对应着存储数字的区域 main: mov ah,0 ;int 16h 0编号功能是从键盘缓冲区读取一个键盘值输入 int 16h ;结果 ah存储扫描码,al 存储ascii码值 cmp ah,1cH ;1ch 为回车键的扫描码,一旦按下回车表示程序输入结束 je print_prog1 cmp ah,39H ;空格键的扫描键,作为两个十进制数之间的分隔符 je compare cmp ah,02H jb error cmp ah,0BH ja error call show add si,2 jmp short main show: