实验4 利用跳转指令构造循环
我从前最怕旁人火眼金睛,如今,倒是盼着有人能够洞幽烛远。如此,就能赠我一点欢喜。
一、实验目的
- 能分析跳转指令构成的程序的运行原理
- 会用跳转指令构造循环解决应用问题
- 体验显示缓冲区的要求
二、实验内容过程记录
任务1-奇怪的程序?(教材实验8)
人工分析下面的程序,然后再在Debug程序中单步执行,观察每一步完成后的结果,并解释出现的现象。
程序如下:
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax, 0
s: nop
nop
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
s0:jmp short s
s1:mov ax, 0
int 21h
mov ax, 0
s2:jmp short s1
nop
codesg ends
end start
程序的执行结果将是:
程序可以正常执行结束!故mov ax,4c00 int 21h这两条语句是有执行的。
将连接好的程序加载后单步运行。
EBF6为jmp 0000的机器代码,跳到程序地址为0的地方,汇编指令为mov ax,4c00处。
下面是运行过程中看到的代码变化的截屏:
(特别注意程序未开始执行时s处和s2处对应的指令及机器码,以及程序执行到s0处时,s处对应的指令和机器码。)
未开始的时:
执行到s0处时:
从这个程序中,我学到了……
任务2- 循环程序的实现
在下面的数据段中,给出了全班3名同学OS、AL、SE、DB课程的成绩,请编程计算出平均成绩,写在 ? 处。要求用jcxz指令构造循环
datasg segment
db '201658501101','ZhangSan',90,100,76,89,0
db '201658501102','LiSi ',97,82,79,88,0
db '201658501103','WangWu ',77,98,89,91,0
db 4 ;这是课程门数,将要用于作除数,偏移量为75
datasg ends
下面是程序流程图:
下面是程序,以及运行后的截图,程序中已经加入了必要的注释:
任务3- 向显存中传入字符(即教材实验9)
编程序,在屏幕的中间分别显示绿色、绿底红色、白底蓝色的字符串 'YantaiUniversity'
提示:要计算出“屏幕的中间”对应的内存单元,然后将字符以及对应的属性字节写入到内存中。
一共25行,需要显示3行,所以中间位置首先要找到第12行,每行160个字节,所以到中间地址为11*106=6e0H,显示16个字符,因为每个字符还要有属性,所以一行占据32个字节,故中间物理地址为b8000h+6e0H+(160-32)/2=0b872h。
下面是程序,以及运行结果