东北大学汇编上机实验6

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六子程序设计实验
一、实验目的
1.掌握过程调用指令与过程返回指令的用法;
2.掌握主程序与子程序之间的参数传送方法;
3.掌握调用子程序时堆栈的变化情况及利用压栈、出栈保护现场的方法;
4.掌握嵌套及递归子程序的设计方法。

二、实验要求
1.仔细阅读教材中有关子程序设计的章节;
2.学会编写子程序说明文件;
3.学会设置断点检查堆栈指针的变化及堆栈内容;
4.学会用DEBUG中的P命令调试子程序;
5.学会在子程序设计中保护所用到的寄存器。

三、实验内容
1.采用一般子程序设计方法和递归子程序设计方法,编写计算X n 的子程序
要求:X值与n值由键盘输入,计算结果以十六进制形式在屏幕上显示。

2.编写程序,完成一位十六进制数的加、减、乘、除运算。

要求:从键盘输入参加运算的一位十六进制数,运算结果以十六进制形式在屏幕上显示,加、减、乘、除运算要用子程序编写。

四、解题思路
1.对于实验内容1,X值和n的值可以利用INT 21H的1号功能从键盘上输入,计算结果利用INT 21H的2号功能从键盘上输出。

可以用递归子程序实现X n(次幂)的计算;
2.对于实验内容2,键盘输入的数和运算符号,输入的运算符号和’+’,’-’,’*’,’/’比较,与那个符号相等就转去执行相应的子程序。

子程序的结果可以都把出口条件设置为相同的寄存器,这样便于程序输出结果。

五、编程实现
5.1 内容1
子程序说明文件如下:
(1)子程序名:CIMI;
(2)子程序功能:计算X^n;
(3)入口条件:X的值放在DL中;
(4)出口条件:X^n值在AX中;
(5)受影响的寄存器:AX,BX和标志寄存器F。

程序清单如下:
DSEG SEGMENT
RLT DW 0
DSEG ENDS
SSEG SEGMENT STACK
SKTOP DB 100 DUP(0)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG
ASSUME DS:DSEG
ASSUME SS:SSEG
START: MOV AX,DSEG
MOV DS,AX
MOV AX,SSEG
MOV SS,AX
MOV SP,SIZE SKTOP
MOV AH,01H ;输入X
INT 21H
SUB AL,30H
MOV DL,AL ;保存X在DL中 PUSH DX
MOV DL,'^' ;输出符号‘^’ MOV AH,02H
INT 21H
POP DX
MOV AH,01H ;输入n
INT 21H
MOV BL,AL ;保存n在BL中
XOR BH,BH ;BH清零
PUSH DX
MOV DL,'=' ;输出‘=’号
MOV AH,02H
INT 21H
POP DX
MOV AL,DL ;默认的入口条件AL存X数据
CALL CIMI ;调用子函数
MOV RLT,AX ;保存结果在RLT单元
MOV BL,AL ;保存结果便于输出
MOV BH,AL
MOV CL,4
SHR BH,CL
MOV DL,BH ;输出结果高四位 CMP DL,9
JNA SHU1
ADD DL,7
SHU1: ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL ;输出结果低四位
AND DL,0FH
CMP DL,9
JNA SHU2
ADD DL,7
SHU2: ADD DL,30H
MOV AH,02H
INT 21H
MOV AH,4CH
CIMI PROC NEAR ;子程序清单
AND BX,BX
JZ CIMI1
DEC BX
CALL CIMI ;递归调用
MUL DL
RET
CIMI1: MOV AL,1
RET
CIMI ENDP
CSEG ENDS
END START
运行结果如下如图6-1
图5-1 内容1的运行结果
5.2 实验内容2
子程序设计思路:设计四个子程序,分别完成两数相加、相减、相乘、相除的功能。

子程序说明文件1:
(1)子程序名:JIA;
(2)子程序功能:计算两个数a,b之和;
(3)入口条件:a的值放在BH中,b的值放在BL中;
(4)出口条件:结果值在AL中;
(5)受影响的寄存器:AX,BX。

子程序说明文件2:
(1)子程序名:JIAN;
(2)子程序功能:计算两个数a,b之和;
(3)入口条件:a的值放在BH中,b的值放在BL中;
(4)出口条件:结果值在AL中;
(5)受影响的寄存器:AX,BX。

子程序说明文件3:
(1)子程序名:CHENG;
(2)子程序功能:计算两个数a,b之和;
(3)入口条件:a的值放在AL中,b的值放在BL中;(4)出口条件:结果值在AL中;
(5)受影响的寄存器:AX,BX。

子程序说明文件4:
(1)子程序名:CHU;
(2)子程序功能:计算两个数a,b之和;
(3)入口条件:a的值放在AX中,b的值放在BL中;(4)出口条件:结果值在AL中;
(5)受影响的寄存器:AX,BX。

程序清单如下:
DSEG SEGMENT
RLT DW 0
DSEG ENDS
SSEG SEGMENT STACK
SKTOP DB 100 DUP(0)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
ASSUME SS:SSEG
START: MOV AX,DSEG
MOV DS,AX
MOV AX,SSEG
MOV SS,AX
MOV SP,SIZE SKTOP
MOV AH,01H
INT 21H
SUB AL,30H
MOV BH,AL ;输入第一个数据保存在BH中
MOV AH,01H
INT 21H
MOV CH,AL ;输入符号保存在CH中 MOV AH,01H
INT 21H
SUB AL,30H
MOV BL,AL ;输入第二个数据保存在BL中
CMP CH,'+' ;输入的是‘+’转 JZ JIA1
CMP CH,'-' ;输入的是‘-’转 JZ JIAN1
CMP CH,'*' ;输入的是‘*’转 JZ CHENG1
CALL CHU ;否则认为是输
入‘/’顺序执行
JMP OUT1
JIA1: CALL JIA
JMP OUT1
JIAN1: CALL JIAN
JMP OUT1
CHENG1: CALL CHENG
JMP OUT1
OUT1: MOV CL,04H
MOV BH,AL
MOV BL,AL
MOV DL,'=' ;输出‘=’
MOV AH,02H
INT 21H
SHR BH,CL
MOV DL,BH
ADD DL,30H ;输出结果高四位
MOV AH,02H
INT 21H
AND BL,0FH
MOV DL,BL ;输出结果低四位
ADD DL,30H
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
JIA PROC NEAR ;子程序JIA实现两数相加
ADD BH,BL
MOV AL,BH
RET
JIA ENDP
JIAN PROC NEAR ;子程序JIAN实现两数相减
SUB BH,BL
MOV AL,BH
RET
JIAN ENDP
CHENG PROC NEAR ;子程序CHENG实现两数相乘
MOV AL,BH
MUL BL
RET
CHENG ENDP
CHU PROC NEAR ;子程序CHU实现两数相除
MOV AL,BH
XOR AH,AH
DIV BL
RET
CHU ENDP
CSEG ENDS
END START
运行结果如图5-2:
图5-3 内容2运行结果
六、实验总结
遇到的问题
1.实验内容以十六进制输出结果时,大于9的数和小于9的数的输出有区别,这里我用了一个有条件跳转语句实现该功能;
2. 第一道题用递归子函数编写的,比较简单。

但是开始时我在加入显示’^’,’=’的时候,没有保护AL中的内容,以至于后面运行结果出乱。

相关文档
最新文档