汇编成绩等级判断实验
一、实训目的
1.熟练运用汇编语言数据定义伪代码实现数据的定义与分配
2.运用比较指令,实验整数大小的判断
3.运用条件跳转指令,实现不同用户输入情况下实现不同的成绩等级输出
4.运用IDA Pro进行单步调试,并记录寄存器、内存空间值的变化
二、实训内容
1.编写一个汇编程序,完成如下要求:
(1)程序包含必要的数据定义语句,保存中间运算结果。
(2)程序通过键盘输入学生的姓名,科目与成绩
(3)程序根据学生的成绩判断成绩等级,90-100为excellent、80-89为good,70-79为medium,60-69为pass,60以下为failed
(4)程序输出的内容为:如果学生成绩在60以上,输入内容为:
congratulations 学生姓名, your 课程名 grade is 等级。
如果学生成绩在60以下,输出内容为:
sorry 学生姓名, your 课程名 grade is 等级。
2.使用IDA Pro对程序进行逆向及调试,要求如下:
(1)在每次用户输入后程序位置设置断点
(2)记录当前寄存器的值,并对于程序代码相关的寄存器值进行解读
(3)记录每次输入后,程序定义的变量空间的值,并结合用户输入情况进行解读
(4)在程序程序跳转前设置断点,记录与程序代码相关的标记寄存器变化
(5)输出汇总结果前设置断点,并对于程序相关的寄存器和内存空间的值进行解读
代码片
.
INCLUDE Irvine32.inc ;从Irvine32文件中复制所需要的定义和设置信息
.data ;后面插入变量
;学生姓名
cyy118_name Byte 20 dup(?)
cyy118_class byte 30 dup(?)
cyy118_score byte ?
congratulations BYTE "congratulations ",0
sorry BYTE "sorry ",0
your BYTE ",your ", 0
grade BYTE " grade is ",0
excellent BYTE "excellent.", 0
good BYTE "good.", 0
mediu BYTE "medium.", 0
pass BYTE "pass.", 0
failed BYTE "failed.", 0
.code
main PROC
mov edx,offset cyy118_name
mov ecx,lengthof cyy118_name
call ReadString
mov edx,offset cyy118_class
mov ecx,lengthof cyy118_class
call ReadString
call ReadInt;读入分数直接存入eax
;判断分数为多少,做出对应选择
cmp eax,90
jae p1
cmp eax,80
jae p2
cmp eax,70
jae p3
cmp eax,60
jae p4
cmp eax,0
jae p5
p1:
mov edx,offset congratulations
call WriteString
mov EDX,OFFSET cyy118_name
call WriteString
mov EDX,OFFSET your
call WriteString
mov EDX,OFFSET cyy118_class
call WriteString
mov EDX,OFFSET grade
call WriteString
mov EDX,OFFSET excellent
call WriteString
exit
p2:
mov edx,offset congratulations
call WriteString
mov EDX,OFFSET cyy118_name
call WriteString
mov EDX,OFFSET your
call WriteString
mov EDX,OFFSET cyy118_class
call WriteString
mov EDX,OFFSET grade
call WriteString
mov EDX,OFFSET good
call WriteString
exit
p3:
mov edx,offset congratulations
call WriteString
mov EDX,OFFSET cyy118_name
call WriteString
mov EDX,OFFSET your
call WriteString
mov EDX,OFFSET cyy118_class
call WriteString
mov EDX,OFFSET grade
call WriteString
mov EDX,OFFSET mediu
call WriteString
exit
p4:
mov edx,offset congratulations
call WriteString
mov EDX,OFFSET cyy118_name
call WriteString
mov EDX,OFFSET your
call WriteString
mov EDX,OFFSET cyy118_class
call WriteString
mov EDX,OFFSET grade
call WriteString
mov EDX,OFFSET pass
call WriteString
exit
p5:
mov EDX,OFFSET sorry
call WriteString
mov EDX,OFFSET cyy118_name
call WriteString
mov EDX,OFFSET your
call WriteString
mov EDX,OFFSET cyy118_class
call WriteString
mov EDX,OFFSET grade
call WriteString
mov EDX,OFFSET failed
call WriteString
exit
main ENDP ;后跟其他子程序
END main ;最后一行