1、学习程序设计的基本方法和技能;
2、熟练掌握汇编语言设计、编写、调试和运行;
二、实验内容和要求
1、汇编语言程序上机操作方法
编写一程序,比较两个字符串STRING1和STRING2所含字符是否相同,若相同刚在屏幕上显示‘MATCH’,否则,显示‘NOT MATCH’。
三、实验主要仪器设备和材料
计算机一台
四、程序
略
五、调试过程:
1、执行程序
表示两字符串相同 2、u命令反汇编:
3、在程序执行以前的寄存器情况:
内存情况:
4、用E命令修改数据区字符串及修改前后内存数据区的对比:
5、用G命令查看修改后的情况:
修改后的字符串不相同了。
六、程序功能与调试过程中遇到的问题
1、分析程序功能
程序的功能是比较string1与string2所含字符是否相同,若相同则在屏幕上显示‘MATCH’,否则,显示‘NOT MATCH’。
因为string1为‘Move the cursor backward’,string2为’ Move the cursor backward’。所以string1与string2相同,显示’MATCH’。后面用重新修改了下这些字符,会显示“not Match”
2、调试程序过程中遇到的问题
对汇编认识停留在上课老师的文字表达,至于实际操作,可以说完全不懂,只能在实验室里对着实验书一步步做下去,没遇到什么问题。但是回到宿舍中,连在哪输入都不知道,可想而知对汇编的认知度。好在在同学们的帮助下,还是能够顺利的完成了实验。只是做的时候对有些过程与指令不太明白,经过查阅相关资料后之后,也弄明白了个大概,希望在以后的微机课程学习中多用心。
七、思考题
1、将内存DATA1单元开始的0~15共16个数传送到DATA2单元开始的数据区中。 MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,DATA1 LEA DI,DATA2 MOV CX,16 CLD
REP MOVSB
2、将程序中的指令JZ MATCH改为JNZ MATCH,程序结果如何?为什么?
JZ为零标志为1转移,而JNZ为零标志为0转移。所以当为JNZ MATCH后,当两字符串比较时,输出为‘NO MATCH’,不相同时为‘MATCH’。因此,程序结果为‘NO MATCH’。
实验二 分支、循环、及子程序设计 一、 实验目的
1、 2、
学习循环程序的基本结构和设计方法; 熟练掌握程序的调试方法;
二、 实验内容和要求
本程序采用两重循环来实现,内层对应学生的名次计算,外层解
决所有学生的名次;以GRADE为首地址的10个字保存学生的成绩,RANK为地址的10个字填入学生的名次。本程序对应的寄存器分配情况说明如下:
AX:存放当前被测学生的成绩; BX:存放当前被测学生的相对地址指针; CX:内循环计数值;
DX:当前被测学生的名次计算值; SI:内循环测试时的地址指针; DI:外循环计数值;
三、 实验主要仪器设备和材料:
计算机一台;
四、 实验方法、步骤及结构测试 1程序略 2程序框图如下:
开始 外循环初始化工作: 外循环计数器(DI)= 10 外循环指针(BX)= 0
AX = 学号为[BX]的学生的成绩
内循环初始化工作: 名词值(DX)= 0 内循环计数值(CX)= 10 内循环指针SI=GRADE首地址
AX > SI ? Y
N DX++ 内循环指针SI+2
CX-- N CX = 0 ?
Y
Rank[BX] = DX BX+2 DI-- N DI = 0 ? Y
结束
3程序执行
在调试模式下,利用反汇编指令(U)得到的程序代码段如下截图所示:
五 实验报告要求
1 程序框图上图即是,双重循环结构外循环包含内循环,当外循环结构每执行
一次循环时,内循环结构在一般情况下要从循环的开始到循环的正常结束从头到尾执行一遍。
2改变程序的结果为10进制
通过修改程序代码,实现了将程序结果改为10进制形式。程序代码及运行结果截图如下(修改或增加部分用下划线标识):
Data SEGMENT Grade dw 88H,75H,95H,63H,98H,78H,87H,73H,90H,60H ;实际上,若将两个十六进制数(各位数字仅限于(0~9))直接看成十进制数用以相比较,则大者恒大。 小了可以支持的数字大小 ;所以可以在定义数据段就直接将分数(十进制数)当十六进制数输入,虽然缩;范围,但不影响程序功能。通过这样可以实现输出结果更加直观。 Rank dw 10 dup(?) Data ENDS Program segment Main proc far Start: Push ds Sub ax,ax Push ax Mov ax,data Mov ds,ax Mov di,10 Mov bx,0 Assume cs:program,ds:data Loop1: Next: Daa Mov ax,grade[bx] Mov dx,0 Mov cx,10 Lea si,grade Cmp ax,[si] Jg no_count Push ax Mov ax,dx Add ax,1 ;将ax的内容压入堆栈进行保护 ;将dx的内容传给ax并加一,同时用Daa指令调整为十进制 Mov dx,ax Pop ax ;将调整后的内容返回给dx ;恢复ax的原内容 No_count: Add si,2 Loop Next Mov rank[bx],dx Add bx,2 Dec di Jne loop1 ret Main endp Program ends end Start 结果截图:
六 思考题 1、
调试程序时,当用户数据设置好后,程序应运行到什么位置才
可以查看结果
答:应通过G命令运行到RET指令所在行,并用D指令查看数据段起始地址的内容。 2、
程序的数据段定义为字单元,可否用字节来定义?
答:可以,只需在数据段定义里把DW修改为DB,并且在程序里作出相应修改则可。 七 总结
两次微机上机实验真的让我受益良多,上课的时候几乎都不知道那些指令指的的什么意思,按照课本做完了,才回到宿舍去找资料填补这方面的知识欠缺,还有很多不懂的,希望老师能多多指教。
实验三 显示程序设计实验(一)
一.实验目的
1,学习显示器I/O程序设计方法; 2,了解系统功能中断的设计方法; 3,了解键盘光标键是如何公职;
二.实验内容和要求
1,用键盘上的上下左右键控制光标的移动.
2,按行号*列号的形式给方块字符(ACS2码为0BDH)在屏幕上定位,按上下左右光标键使光标在屏幕上移动,光标的移动由方块字符组成的图形而在屏幕上保留下轨迹.
三.实验主要仪器设备和材料 计算机
四.实验方法,步骤及结构测试 源程序略 运行结果
五,实验报告要求
1,显示器是如何定义窗口的大小的?
显示器根据数据显示的单元数,v_buff db 25*80*2 dup(?)定义窗口大小的. 2,在文本方式下,什么是属性值?
block equ 0dbh是定义的属性值,v_buff+bx+1,是放每个单元(一共25*80个)属性值的地方,即每个单元的高字节。 六,思考题
光标轨迹运行到边界后,为什么光标会闪烁和改变颜色?若要光标不变,应如何修改程序?
答:光标移位所使用的语句是循环移位,当光标由边界移到另一边边界时方块字符的属性值发生错位相乘,所以光标会闪烁和改变颜色。若要光标不变,应将循环移位ROL改为逻辑移位SHL。 七,实验心得
在第一次按照书上输入代码后发现运行不了,检查后发现书上代码有误,根据错误显示排除了错误Jnz not_down,还有一些标点加上后,在运行后根据代码内容了解了光标移位为循环移位.另外根据程序修改了前背景色和后背景色 0700h可以根据自己的想法去修改,最后还添加了7色光标效果,感觉很神奇,贪食蛇游戏应该与这个程序有关。
显示程序设计实验 (二)
一,实验目的
1)了解INT 21H部分功能号的功能和使用方法 2)掌握字符方式下PC机显示器显示控制. 实验程序1运行结果:
修改程序: stack SEGMENT DW 64 DUP(?)
stack ENDS code SEGMENT
ASSUME CS:code,SS:stack start:
MOV CX,0008h a0: PUSH CX MOV BL,31h MOV CX,0009h MOV AH,02h a1: MOV DL,BL INT 21h INC BL PUSH CX a2: LOOP a2 POP CX DEC CX JNZ a1
MOV AH,02h
MOV DL,20h
INT 21h
POP CX DEC CX JNZ a0 MOV AH,4ch INT 21h code ENDS END start 结果:
因篇幅问题不能全部显示,请点此查看更多更全内容