汇编语言实验报告
Assembly Language Programming Lab Reports
______________________________________________________________________________ 班级:姓名:学号:实验日期:
学院:专业:
实验顺序:原创:___ 实验名称:子程序设计
实验分数:_______ 考评日期:________ 指导教师:
______________________________________________________________________________ 一.实验目的
1、掌握过程调用伪指令: PROC,ENDP,NEAR和FAR。
2、掌握 CALL,RET,RET n。
理解子程序调用时现场保护和恢复现场的意义。
3、掌握子程序传递参数的三种方式,寄存器,内存单元,堆栈。
4、培养在复杂的程序设计时,采用模块化结构划分功能,分解程序的意识。
5、对子函数的嵌套调用和递归调用有一定的理解。
______________________________________________________________________________二.实验环境
操作系统:windows 8
编译程序:masm 5.0
______________________________________________________________________________三.实验原理
1.子程序递归,堆栈传参
2.寄存器、存储器传参
______________________________________________________________________________
四.实验步骤及结果分析
1.子程序递归调用(求阶乘) 用堆栈进行传递参数
高级语言函数调用过程
Fac(n) = fac(n-1)*n n>0
Fac(n)= 1 n=0
高级语言递归调用,形参中的内容在这层递归调用结束后才会被释放
实参5 实参 4 实参 3 实参2 实参 1
形参n=5 形参n =4 形参n =3 形参n =2 形参n =1
Int fac(int n)
{
int f;
If (n<=0)
F==1;
Else f=fac(n-1)*n;
}
在汇编语言中子程序没有形参和实参,直接更改的是给定寄存器或者内存单元或者栈中的数据,需要自己开辟类似形参的空间去保存相应的数据,在这里最好的办法就是用栈。
源代码:
stack segment stack
db 100h dup(?)
stack ends
data segment
result dw ?
data ends
code segment
main proc far
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ax,5
push ax
call fact
mov result,ax
mov ah,4ch
int 21h
main endp
fact proc near
push bp
mov bp,sp
mov ax,[bp+4]
cmp ax,0
ja result1
mov ax,1
jmp result2
result1:dec ax
push ax
call fact
mov bx,[bp+4]
result2:pop bp
ret 2
fact endp
code ends
end start
实验结果:
2.实现两个输入的十进制数相减法,相乘,相除,三者任选一个。
给出设计思路,各个子程序必要时给出程序框图,给出代码,正确运行结果。
两数相减设计思路:
1.主程序:调用三个子程序。
主程序用JMP 构成循环,可以做多次计算。
2.子程序surb1:功能是键盘输入,数字键ASCII 码→ 十进制数(该十进制数保存为二进制数),用存储单元x 传参。
3.子程序surb2:功能为两数相减,以寄存器bx 传参
4.子程序surb3:功能为显示十进制数。
先将二进制数→十进制数。
将传参寄存器bx 中的二进制数用除以10 取余数的方法转换为十进制数,再将余数加30h 变为十进制数的ASCII 码,然后显示。
子程序1:
是
否
是
否
键盘输入 是否回车
小于0 or 大于9? 以二进制保存
Exit Cx=0? Out1
存储单元x 传
源代码:
data segment
x dw ?,?
cc1 db 0ah,0dh,'x1=$'
cc2 db 0ah,0dh,'x2=$'
cc3 db 0ah,0dh,'x1-x2=$' data ends
code segment
assume cs:code,ds:data start:
mov ax,data
mov ds,ax
main proc far
mov bx,0
mov si,0
mov dx,offset cc1 mov ah,9
int 21h
call surb1
mov dx,offset cc2 mov ah,9
int 21h
mov bx,0
mov cx,0
mov si,2
call surb1
call surb2
mov dx,offset cc3 mov ah,9
int 21h
call surb3
jmp main
out1:
mov ah,4ch
int 21h
main endp
surb1 proc near mov ah,1
int 21h
cmp al,0dh
jz exit
cmp al,'0'
jl out1
cmp al,'9'
jg out1
and ax,000fh xchg ax,bx
mov cx,10
mul cx
add bx,ax
jmp surb1
exit:cmp cx,0
jz out1
mov x[si],bx
ret
surb1 endp
surb2 proc near mov bx,x
cmp bx,x+2 jae jet1
xchg bx,x+2 jet1:sub bx,x+2 ret
surb2 endp surb3 proc near mov ax,bx mov cx,0
mov bx,10
let1:mov dx,0 inc cx
idiv bx
push dx
cmp ax,0
jnz let1
let2:
pop ax
add ax,0030h mov dl,al
mov ah,2
int 21h
loop let2
ret
surb3 endp code ends
end start
运行结果:
____________________________________________________________________________
五.实验心得疑问建议
通过本次实验,学习了子程序的调用、嵌套和递归以及三种传参方式,收获很多。
并且进一步学习了使用debug。