收藏 分享(赏)

合肥工业大学——汇编语言程序设计_4_2.ppt

上传人:dreamzhangning 文档编号:2721657 上传时间:2018-09-26 格式:PPT 页数:25 大小:456KB
下载 相关 举报
合肥工业大学——汇编语言程序设计_4_2.ppt_第1页
第1页 / 共25页
合肥工业大学——汇编语言程序设计_4_2.ppt_第2页
第2页 / 共25页
合肥工业大学——汇编语言程序设计_4_2.ppt_第3页
第3页 / 共25页
合肥工业大学——汇编语言程序设计_4_2.ppt_第4页
第4页 / 共25页
合肥工业大学——汇编语言程序设计_4_2.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、汇编语言程序设计 Assembly Language Programming,第四章 汇编语言程序设计,顺序程序设计。分支程序设计。(地址表、转移表)循环程序设计。(逻辑尺),5. 过程,过程(子程序)定义伪操作procedure_name PROC NEAR ( FAR ) procedure_name ENDP(1)NEAR属性:调用程序和子程序在同一代码段中(段内调用)(2)FAR属性:调用程序和子程序不在同一代码段中(段间调用),code segment assume Start:call subr1Mov ah,4ch int 21hsubr1 proc nearret subr1

2、endpcode ends,code segmentmain proc farcall subr1ret main endpsubr1 proc nearret subr1 endpcode ends,调用程序和子程序在同一代码段中,调用程序和子程序不在同一代码段中subseg segmentsubt proc farretsubt endpsubseg endsmainseg segmentcall subtmainseg ends,调用方式,Direct CALL SUB;段内和段间 Indirect LEA AX,SUB ;段内 CALL AX 或CALL WORD PTR 内存 ;段内

3、 或CALL DWORD PTR 内存 ;段间,子程序调用(中断调用):隐含使用堆栈保存返回地址call near ptr subp (1) 保存返回地址 PUSH IP(2) 转子程序(IP) subp的偏移地址call far ptr subp (1) 保存返回地址 PUSH CS;PUSH IP(2) 转子程序(CS) subp的段地址(IP) subp的偏移地址,子程序的调用和返回,注意事项,在过程定义体内,必须有一条RET指令能被执行到。 调用时,最好不要强制改变调用类型。 子程序保护现场。 堆栈操作指令必须配对。 定义允许嵌套和递归。,保存与恢复现场 subt proc farpu

4、sh axpush bxpush cxpush dxpop dxpop cxpop bxpop axretsubt endp,CALL 与RET指令的模拟,CALL模拟 PUSH CS;段间需要 MOV AX,OFFSET RETADD; PUSH AX JMP 过程名 RET模拟 POP AX; 弹出IP JMP AX;段内 段间怎么办?,程序与子程序之间的参数传递,区分 传入参数和传出参数 传值和传地址 方式 无参数传递 用寄存器来传递参数 用内存单元传递参数 用堆栈来传递参数,无参数传递,实现回车换行,LF_CR PROCMOV DL,0DHMOV AH,2INT 21HMOV DL,0

5、AHMOV AH,2INT 21HRET LF_CR ENDP CSEG ENDS END START,CSEG SEGMENT ASSUME CS:CSEG START: CALL LF_CR MOV AH,4CHINT 21H,;恢复现场,; 保存现场,用内存数传递参数,适用于传递全局变量的情况,PRINTSTR PROCLEA DX,STRMOV AH,9INT 21HRET PRINTSTR ENDPCSEG ENDS END START,DSEG SEGMENTSTR DB GOOD$ DSEG ENDSCSEG SEGMENT ASSUME START:CALL PRINTSTRM

6、OV AH,4CHINT 21H,用寄存器来传递参数(1),传输单个变量 适用于参数较少的情况 例子:编写一个子程序,完成求平方的功能,输入参数通过DL传递,输出通过DX传递,SQUARE PROC NEARPUSH AXMOV AL,DLMUL ALMOV DX,AX POP AXRET SQUARE ENDP,用寄存器来传递参数(2),传输指针 传递一个缓冲区 例子:编写子程序累加长度为100的无符号字节缓冲区buffer,首地址通过BX传递,结果通过DX传回,SUM PROC NEARPUSH CXMOV CX, 100MOV DX,0 AGAIN:ADD DL,BXADC DH,0AD

7、C BXLOOP AGAIN POP CXRET SUM ENDP,用堆栈来传递参数,适用性极大,高级语言均采用此方式 注意: 段内调用时只有IP入栈 段间调用时有CS,IP入栈,主程序通过堆栈传参数到子程序。设参数为X (WORD),子程序为FAR,主程序动作 PUSH X PUSH CS PUSH IP,X,CS 断点,IP 断点,堆栈,子程序提取数据X PUSH BP MOV BP,SP WORD PTR BP+6如果是Near调用 WORD PTR BP+4,X,CS 断点,IP 断点,原BP,主程序通过堆栈传参数到子程序。设参数为X (WORD),子程序为FAR,主程序通过堆栈传入和

8、传出参数。设传入参数为X ,传出参数为Y (X,Y为WORD) ,子程序为NEAR,主程序动作 SUB SP,2 PUSH X PUSH IP,分配Y,X,IP 断点,堆栈,子程序提取数据X PUSH BP MOV BP,SP WORD PTR BP+4 传出数据 WORD PTR BP+6,分配Y,X,IP 断点,原BP,主程序通过堆栈传入和传出参数。设传入参数为X ,传出参数为Y (XY为WORD) ,子程序为NEAR,主程序通过堆栈传入和传出参数。设传入参数为X ,传出参数为Y (X,Y为WORD) ,子程序为NEAR,RET 局部变量的销毁 主程序完成 ADD SP,2 子程序完成 R

9、ET 2 取出传回的值 POP AX,分配Y,X,IP 断点,堆栈,用堆栈来传递参数,编写子程序完成a-b=c,DATA SEGMENTA DW 2B DW 1SUM DW 0 DATA ENDSSUBSEG SEGMENT ASSUME CS:SUBSEG,DS:DATA HTON_F PROC FARPUSH BPMOV BP,SPPUSH AXPUSH BXMOV BX,BP+8MOV AX,BP+6SUB AX,BXMOV BP+10,AXPOP BXPOP AXPOP BP RET 4 HTON_F ENDP SUBSEG ENDS,CSEG SEGMENT ASSUME CS:CS

10、EG, DS:DATA START:MOV AX,DATAMOV DS,AXSUB SP, 2PUSH BPUSH ACALL HTON_FPOP SUM MOV AH, 4CHINT 21HCSEG ENDS END START,预留给C,b,a,CS:IP,原BP,BP,P168.递归求解:Sum(n)=1+2+n, PUSH AX PUSH nCALL SUM POP Result,SUM PROC FAR PUSH BPMOV BP,SPPUSH AXMOV AX,BP+6CMP AX,0JNZ SUM1MOV AX,0JMP EXIT SUM1: SUB SP,2DEC AXPUSH

11、 AXCALL SUMPOP AXADD AX, BP+6 EXIT:MOV BP+8,AXPOP AXPOP BP RET 2,若n=0,Sum(n)=0; 否则= Sum(n-1)+ n,预留给结果,n(=2),CS:IP,原BP, n DW 100 Result DW ?,原AX,n=1的结果,IP:POPAX,AX,BP2,n=0的结果,IP:POPAX,AX,BP1,n=(0),n=(1),C语言传入、传出参数约定,返回值:通过寄存器返回 AL char AX short EAX int (EDX,EAX) _int64 EAX指针 传入参数:通过堆栈 由右向左,实验II,1. BL中的只有一位为1。编写程序测试,并输出提示信息“The X Bit is 1”,要求:地址表和转移表。(*)2.实验指导书之实验五:采用冒泡排序方式对数组进行由大到小排序;然后将结果在屏幕上打印出来。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报