分支程序设计(1)
实验内容:在内存 Score 缓冲区中存放有 100 个学生的成绩数据,为无符号字节数。假设学生成绩在[90, 100]区间为优秀,在[80,90)区间为良好,在[70,80)区间为一般,在[60,70)区间为及格,在[0,60)区间为不及,要求统计出不及格,及格,一般,良好和优秀的人数,分别送入 Notpassed, Passed, Good, Better 和 Best字节单元。 用普通的跳转语句实现上述功能。
分析:实验内容没什么好说的了。首先将一个成绩放到一个寄存器中,然后将该成绩依次和60、70、80、90相比较,并根据比较的结果分别跳到相应的分支中去处理(对应的分数段人数+1),进行100次循环即可。该程序主要是让我们熟悉几条常用的条件转移指令:JL(小于)、JNL(不小于)、JG(大于)、JNG(不大于)。当然还有其他的,像无条件转移指令JMP等等,都可以用来类似高级语言中的if、for、while的条件判断。通常在这些指令前会使用一些改变状态标志的指令比如cmp等。
其中,在这个实验中可以学习到的内容是。在数据段中定义了student变量,包含100个字节元素。这里和高级语言中的数组的概念是一样的。其实回想高级语言的数组声明,也是为变量开辟一块连续的内存空间用来给数组保存数据,变量名保存着数组的首地址。在汇编语言中,也可以像高级语言一样,通过“下标”来访问“数组”的元素。例如:可以通过student[0]来访问第一个元素,通过student[3]来访问第四个元素等等。但是需要注意的是,之所以可以将si+1来顺序访问下一个student元素,是因为student分配的是字节。如果student分配的是字变量,则访问就会有点不同。访问第一个元素时,应为student[0],访问第二个元素时,应该为student[2],访问第三个元素时,应该为student[4]……访问第i个元素,则为student[2*i]。这个主要是要考虑字节在内存中的分配与字在内存中的分配的区别,便可明了。
实现该功能的汇编代码如下:
;使用条件分支结构实现分数统计 stack segment stack db 2014 dup(?) stack ends data segment 'data' student db 70,75,80,85,90,95,70,61,55,45, 90 dup(75) Notpassed db 0 Passed db 0 Good db 0 Better db 0 Best db 0 data ends code segment 'code' assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,ax mov si,0 mov cx,100 again: cmp student[si],60 jl fun0 cmp student[si],70 jl fun1 cmp student[si],80 jl fun2 cmp student[si],90 jl fun3 inc Best jmp done fun0: inc Notpassed jmp done fun1: inc Passed jmp done fun2: inc Good jmp done fun3: inc Better jmp done done: inc si loop again mov bl,Good mov cx,8 show: mov ah,02H shl bl,1 mov dl,0 adc dl,30H int 21H loop show mov ax,4c00H int 21H code ends end start