汇编语言程序设计实验二

  分支程序设计(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

 

posted @ 2015-10-25 00:06  Num.Zero  阅读(1617)  评论(0编辑  收藏  举报