文档库 最新最全的文档下载
当前位置:文档库 › 子程序的调用和返回指令

子程序的调用和返回指令

子程序的调用和返回指令
子程序的调用和返回指令

1、子程序的调用和返回指令

子程序的调用和返回是一对互逆操作,也是一种特殊的转移操作。

一方面,之所以说是转移,是因为当调用一个子程序时,程序的执行顺序被改变,CPU将转而执行子程序中的指令序列,在这方面,调用子程序的操作含有转移指令的功能,子程序的返回指令的转移特性与此类似;

另一方面,转移指令是一种“一去不复返”的操作,而当子程序完后,还要求CPU能转而执行调用指令之下的指令,它是一种“有去有回”的操作。

为了满足子程序调用和返回操作的特殊性,在指令系统中设置了相应的特定指令。

1、1调用指令(CALL)

调用子程序指令的格式如下:

CALL 子程序名/Reg/Mem

子程序的调用指令分为近(near)调用和远(far)调用。如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示的)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移

如果被调用子程序的属性是远的,那么,CALL指令将产生一个远调用。这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用操作

00405600 call 00406895

00405604 ......

子程序调用指令本身的执行不影响任何标志位,但子程序体中指令的执行会改变标志位,所以,如果希望子程序的执行不能改变调用指令前后的标志位,那么,就要在子程序的开始处保护标志位,在子程序的返回前恢复标志位。

例如:

CALL DISPLAY

;DISPLAY是子程序名

CALL BX

;BX的内容是子程序的偏移量

CALL WORD1

;WORD1是内存字变量,其值是子程序的偏移量

CALL DWORD1

;DWORD1是双字变量,其值是子程序的偏移量和段值

CALL word ptr [BX]

;BX所指内存字单元的值是子程序的偏移量

CALL dword ptr [BX]

;BX所指内存双字单元的值是子程序的偏移量和段值

1、2返回指令(RET)

当子程序执行完时,需要返回到调用它的程序之中。为实现此功能,指令系统提供了一条专用的返回指令。其格式如下:

RET/RETN/RETF [Imm]

子程序的返回在功能上是子程序调用的逆操作。为了与子程序的远、近调用相对应,子程序的返回也分:远返回和近返回。返回指令在堆栈操作方面是调用指令的逆过程

(注:文档可能无法思考全面,请浏览后下载,供参考。可复制、编制,期待你的好评与关注)

单片机循环程序及子程序设计

循环程序及子程序设计 1、软件延时 【实验原理】 延时程序的延时时间主要与两个因素有关,一是所用晶振,二是延时程序的循环次数,一旦晶振确定以后,则主要是如何设计与计算需给定的延时循环次数。 汇编语言常用延时程序所用到的指令 指令占用机器周期数 MOV Rn,#Data 1 DJNZ Rn,rel 2 RET 2 NOP 1 【实验程序】 编写15us、5ms、1s延时程序 (1)15us延时程序 MOV R0,#6 D1: DJNZ R0,D1 RET (2)5ms延时程序 MOV R1,#10 D1: MOV R0,#248 D2: DJNZ R0,D2 DJNZ R1,D1 RET (3)1s延时程序 MOV R2,#8 D1: MOV R1,#249 D2: MOV R0,#250 D3: DJNZ R0,D3 DJNZ R1,D2 DJNZ R2,D1 RET

【实验要求】 (1)能根据延时要求设计与计算需给定的延时循环次数。 (2)运行源程序检查结果。 2、拉幕灯:使8个发光二极管顺序点亮并保持,然后按相反顺序变化,形如 拉幕效果。 【实验程序】 ORG 0000H START: MOV R2,#08H ;设置循环次数 MOV A,#01H ;送显示模式字 NEXT: MOV P0,A ;点亮连接P0.0的发光二极管 ACALL DELAY ;调用延时子程序 SETB C ;Cy置1 RLC A ;左移一位,改变显示模式字 DJNZ R2,NEXT ;循环次数减1,不为零,继续点亮下面一个二极管 MOV R2,#08H ;设置循环次数 MOV A,#7FH ;送显示模式字 NEXT1: MOV P0,A ;灭掉连接P0.0的发光二极管 ACALL DELAY ;调用延时子程序 CLR C ;Cy清零 RRC A ;右移一位,改变显示模式字 DJNZ R2,NEXT1 ;循环次数减1,不为零,继续灭掉下面一个二极管 ACALL DELAY ;调用延时子程序 SJMP START ;无限循环 DELAY: MOV R3,#080H ;延时子程序开始 DEL2: MOV R4,#000H DEL1: NOP 【实验要求】 (1)可修改延时子程序中的R3和R4中从而改变灯亮或暗的时间,并注意观察;(2)运行源程序检查结果; (3)将程序烧录到芯片上,在开发板上观察实际拉幕灯的效果,并可进一步改变程序来观察实验的结果。

子程序设计和系统功能调用例题

例8.2.1试设计一程序,完成两个长补码的加法,其中两个长补码的长度是相同的,并且采用低地址存放低位,高地址存放高位的方式存储。加法功能使用子程序实现,两个长补码的起始地址、长补码的长度(以字为单位)、运算结果的起始地址均由主程序以入口参数的形式传递给子程序;运算是否溢出使用一个字节标志来表示,00H表示运算无溢出,0FFH 表示运算溢出,子程序将此溢出标志以出口参数的形式传递给主程序。本例中参数传递方式采用寄存器传递方式。 1)设计参数传递约定 题目已指明参数传递为寄存器传递方式,这里只需要具体约定寄存器与参数间的对应关系。在本例中,我们约定主程序通过SI、DI寄存器传递两个长补码的起始偏移量(认为两个长补码位于同一数据段,并且段基值保存到DS中),通过CX寄存器传递补码的长度,通过BX寄存器传递运算结果的起始偏移量(认为段基值已保存在DS中);并且,我们约定子程序通过DL寄存器传递溢出标志。 2)源程序设计 参数传递约定设计完成后,我们开始源程序设计,主程序与子程序的相应代码如下所示。DA TA SEGMENT V AR1 DW 5482H, 669EH, 02C7H, 14B2H, 0C254H V AR2 DW 8C2BH, 0C24CH, 0AB12H, 357AH, 41A5H LEN EQU $-V AR2 SUM DW LEN DUP(0) ; 用于保存运算结果 OVR DB ? ; 用于保存溢出标志 DA TA ENDS STACK1 SEGMENT STACK ; 子程序设计必须使用堆栈段DW 40H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS: CODE, DS: DA TA, SS: STACK1

微机原理与接口技术6-调用子程序指令

(五)控制转移指令 4. 调用子程序指令 4.1段内直接(相对)调用:子程序在同一代码段中,子程序相对地址(十六位偏移量)放在指令编码中。用于调用一个 不知确切地址,但知标号的子程序。 格式:CALL SUBR1;SUBR1为子程序入口标号,子程序相对地址放在指令编码中,三字节指令。 操作:①IP入栈:IP H→(SP-1),IP L→(SP-2),SP-2→SP;②IP+D16→IP 4.2段内间接(绝对)调用:子程序在同一代码段中,子程序的入口地址(绝对地址)存放在寄存器或存贮单元中(两字 节或一字),用于调用一个已知确切地址的子程序。 格式:CALL (NEAR PTR) OPRD;OPRD为寄存器或存贮器,存放两字节的子程序入口偏移地址。 操作:①IP入栈:IP H→(SP-1),IP L→(SP-2),SP-2→SP;②〔OPRD〕→IP(传送一个字) 4.3段间直接(绝对)调用:子程序不在同一代码段中,子程序的入口地址(偏移地址及新的段地址)放在指令编码中。 一般用于调用一个不知确切地址,但知标号的子程序。 格式:CALL SUBR2;SUBR2为子程序入口标号,五字节指令。 操作:①CS入栈:CS H→(SP-1),CS L→(SP-2),SP-2→SP;②IP入栈:IP H→(SP-1),IP L→(SP-2),SP-2→SP; ③置新IP:指令第2、3字节→IP;④置新CS:指令第4、5字节→CS。 4.4 段间间接(绝对)调用:子程序不在同一代码段中,子程序的入口地址(偏移地址及新的段地址)在指定的存贮单元 (连续四个字节)中。一般用于调用一个已知确切入口地址的子程序。 格式:CALL DWORD PTR OPRD;OPRD为存贮器,存放四字节的子程序入口地址。 操作:①CS入栈:CS H→(SP-1),CS L→(SP-2),SP-2→SP;②IP入栈:IP H→(SP-1),IP L→(SP-2),SP-2→SP; ③置新IP:(EA)→IP(传送一个字);④置新CS:(EA+2)→CS(传送一个字)。 5. 返回指令放在子程序末尾,以在完成子程序后返回主程序。 5.1段内返回段内调用(不管是段内直接还是段内间接调用)返回 格式:RET 操作:IP出栈即(SP)→IP,SP+2→SP。 5.2段内带立即数返回 格式:RET EXP;EXP是一个常数,也可为一表达式,将此常数或由表达式计算出的常数看成一个16位的位移量D16,用以出栈后修改堆栈指针。 操作:①IP出栈:(SP)→IP,SP+2→SP;②修改堆栈指针:SP+D16→SP。 5.3段间返回段间调用(不管是段间直接还是段间间接调用)返回 格式:RET 操作:IP出栈即(SP)→IP,SP+2→SP;CS出栈即(SP)→CS,SP+2→SP。 5.4段间带立即数返回 格式:RET EXP;EXP为常数或表达式,将此常数或由表达式计算出的常数看成一个16位的位移量D16,用以出栈后修改堆栈指针。 操作:①IP出栈:(SP)→IP,SP+2→SP;② CS出栈:(SP)→CS,SP+2→SP;③修改堆栈指针:SP+D16→SP。!CALL指令与RET指令均不影响标志。 6. 中断指令 6.1中断格式:INT N;N#中断指令,两字节指令(CD N),N为0~255D常数,但N≠3。 操作:①PSW入栈:PSW→(SP),SP-2→SP;②清除TF、IF;③CS入栈:CS→(SP),SP-2→SP; ④IP入栈:IP→(SP),SP-2→SP;⑤进入N#中断:0000H段中(N?4)→IP, (N?4+2)→CS。 6.2溢出中断格式:INTO;功能相当于4号中断,但为一字节指令(CE)。 操作:如OF=1,则①PSW入栈;②清除TF、IF;③CS入栈;④IP入栈;⑤进入4#中断:(10H)→IP, (12H)→CS。 6.3断点中断指令格式:INT 3;一字节指令(CC),用于在DEBUG中调试程序。 操作:①PSW入栈;②清除TF、IF;③CS入栈;④IP入栈;⑤(000CH)→IP, (000EH)→CS,进入断点中断。 6.4从中断返回格式:IRET;任何中断都以IRET指令结束,以从中断返回主程序。 操作:①IP出栈:(SP)→IP,SP+2→SP;② CS出栈:(SP)→CS,SP+2→SP;③ PSW出栈(SP)→PSW,SP+2→SP。

嵌入式(子程序调用实验程序及过程)

ARM子程序设计实验 7.1实验目的 ①了解子程序编写及调用。 ②掌握ARM乘法指令的使用方法 7.2 实验环境 ①硬件:PC机 ②软件:ADS1.2 7.3 实验内容 ①MUL指令编写一个整数乘方的子程序。 ②多寄存器传送指令(STMFD/LDMFD)运用和各种变址寻址模式的掌握。 ③BL指令调用子程序计算X n 7.4 实验过程 (1)新建ARM工程exp7_1 启动ADS开发环境,选择File→New(Project)选项,使用ARM Executable Image工程模板创建一个工程exp7_1. (2) 新建汇编程序文件exp7.s,并将其添加到工程exp7_1中 选择File→New(File)选项,新建汇编源程序文件exp7.s并添加到工程exp7_1中,exp7.s 源程序的参考代码如下: X EQU 3 n EQU 4 AREA Lab1,CODE,READONL Y ENTRY START LDR SP,=0X30003F00 LDR R0,=X LDR R1,=n BL POW halt b halt POW STMFD SP!,{R1-R12,LR} MOVS R2,R1 MOVEQ R0,#1 BEQ POW_END MOV R1,R0 SUB R2,R2,#1 POW_L1 BL DO_MUL SUBS R2,R2,#1 BNE POW_L1 POW_END LDMFD SP!,{R1-R12,PC} DO_MUL MUL R0,R1,R0 MOV PC,LR END

(3) 设置工程exp7的编译和链接选项 设置工程链接地址RO Base:0x3000000,RW Base:0x3003000, 设置调试地址:0x3000000 (4) 编译和链接工程 在工程exp7窗口中,选择Make工具按钮,编译和链接工程exp6_1,如果有错误提示,请检查修改程序中的语法错误,直到编译和链接通过。 (5)在AXD中加载映像文件 打开AXD Debugger,首先确认调试目标机是否设置为Armulator。选择Options→Configure Target(Choose Target)选项,确认ARMUL为选中状态。然后单击Configure按钮,打开ARMulator Configuration对话框,确认ARMulator模拟的处理器类型是ARM920T。 选择File→Load Image选项,载入工程exp7目录exp7\exp7_Data\DebugRel\下编译生成的映像文件exp7.axf (6)调试准备 在AXD中,打开各个观察窗口,做调试准备。 ①选择Processor Views→Registers选项,打开ARM寄存器显示窗口。 ②选择Processor Views→Memory选项,打开ARM存储器显示窗口。 ③选择Processor Views→Low Lever Symbols选项,打开标号及其地址显示窗口; ④选择Processor Views→Disassembly选项,打开反汇编显示窗口。 (7)单步运行程序 在AXD中,选择Execute→Step菜单项或按F10快捷键,或者使用调试工具条,单步运行程序,查看相关寄存器的值的变化情况。请把每一步的执行结果填入到下表中。执行File →Reload Current Image命令可以重新加载和运行当前映像文件。

子程序及其调用实验

实验二 子程序及其调用实验 一、 实验目的 1、通过编辑练习常用指令,理解并掌握MCS-51单片机的指令系统。 2、掌握子程序调用的程序设计。 3、掌握子程序调用过程中保护现场与恢复现场以及调用程序与被调用程序之间的参数传递。 4、学习汇编语言的程序设计方法 二 、实验设备 计算机 操作系统:Windows xp 应用软件:WAVE6000 三 、实验内容 编写程序,计算2^i a Y ∑=。a1,a2,...,a10存放在内部RAM 的20H 开始的存储区内,计算所得结果放入R2和R3中。 四、实验源程序 ORG 0000H MAIN: MOV R0,#20H MOV R7,#10H MOV R3,#0 MOV R2,#0 MOV 20H,#05H MOV 21H,#04H MOV 22H,#03H MOV 23H,#02H MOV 24H,#01H MOV 25H,#09H MOV 26H,#08H MOV 27H,#07H MOV 28H,#06H MOV 29h,#00H LOOP: MOV A ,@R0 ACALL SORT ADD A,R2 MOV R2,A CLR A ADDC A,R3 MOV R3,A

INC R0 DJNZ R7,LOOP SJMP $ SORT: MOV DPTR,#TAB MOVC A,@A+DPTR RET TAB: DB 0,1,4,9,16,25,36,49,64,81 五、实验结果与分析 本次实验是计算0到9的平方和,实验结果为011D,与计算结果相符。子程序调用不必重复编写同样的程序,有利于提高编码效率,缩短源程序与目标程序的长度,节省程序存储的空间,使程序模块化、通用化,便于阅读、交流。 六、实验心得 通过这次实验,我理解并掌握了子程序调用的程序设计,掌握子程序调用过程中保护现场与恢复现场以及调用程序与被调用程序之间的参数传递。子程序调用能很好的提高编码效率,节省程序存储的空间,应该多加练习,熟练掌握。

循环与子程序设计

实验五循环与子程序设计 一、实验目的 1.熟练循环程序的编写。 2.掌握子程序的定义及调用方法。 3.学会子程序的编程方法。 二、预习内容 1、循环程序是强制CPU重复执行某一指令系列(程序段)的一种程序结构形式,凡是要重 复执行的程序段都可以按循环结构设计。 循环顺序一般由四部分组成 1)置循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类,一类是循环工作部分的初值,另一类是控制循环结束条件的初值。 2)工作部分:即需要重复执行的程序段。这是循环程序的核心,称之为循环体。 3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。 4)控制部分:用来保证循环程序按规定的次数或特定条件正常循环。 2、在程序设计中,对于某个连续多次重复出现的出现段,常常编制成循环程序,但在无规 律的重复时很难用循环程序,此时应用子程序来实现。. 子程序的定义:〈过程名〉PROC : 〈过程名〉ENDP 子程序的调用:CALL〈过程名〉 编写子程序时应注意: 1)、入口信息 2)、出口信息 3)、现场保护和恢复 4)、最后一条指令一定是RET指令 三、实验内容

1、编写程序,显示用‘ * '组成三角形的图形。结果类似以下系列图(图中sanj4是程序文件名): 提示及要求: 1)循环调用2号系统功能,显示输出‘*’。注意循环次数的变化。 2)将回车、换行的功能编写成子程序的格式。 3)‘*’不是从顶格开始的,前面打印输出空格。空格的ASCII值为20H,同样调用 2号功能,输出空格。 2、编程实现以教材附录B的格式显示出ASCII码表。对于无法显示出的格式符或功能符,如空白0、响铃7、换行0AH、回车0DH等均用空格代替。

项目六-任务一《调用子程序指令学习》

项目六-任务一《调用子程序指令学习》 教学目标: 知识目标 (1)熟练掌握调用子程序指令的格式和应用 (2)理解掌握调用子程序程序的运行过程 (3)掌握调用子程序的优点和应用场合 能力目标 (1)培养学生的逻辑思维能力和数学计算处理能力 (2)增强学生的程序编写和阅读能力 情感目标 进一步加强他们的数控加工素养,培养团队协作精神 教学手段 数控编程机房、多媒体课件辅助教学。 教学方法 (1) 采用直观学习法; (2) 启发提问互动式的教学方法; (3) 案例教学法; (4)多媒体辅助教学 教学过程 一、新课导入 问题思考:在数控铣床加工中,同一个零件上有几个尺寸和形状完全相同的部分,是否有什么简便的编程方法。我们数控系统提供了调用子程序的编程方法,今天我们就学习调用子程序的编程方法。 通过问题思考部分我们提出调用子程序的作用,从而明确课堂学习主题,同时激发学生的学习兴趣。 二、新课讲授 (一)指令介绍 (1)子程序的概念 (2)在编制加工程序中,有时会遇到一组程序段在-个程序中

多次出现,或者在几个程序中都要使用它。这个典型的加工 程序可以做成固定程序,并单独加以命名,这组程序段就称 为子程序。 (3)介绍调用子程序的指令格式,用课件展示,说明指令的名称为调用子程序,并分别说明调用子程序的格式和M99指令, 其中调用子程序的格式常见的分为以下两种M98 Pxxxx Lxxxx和M98 Pxxxx(调用次数)xxxx(子程序的程序号)(4)介绍调用子程序程序的运行过程,利用课件展示和分析 (5)应用场合: (二)调用子程序的用法 (三)调用子程序的优点 使用子程序可以减少不必要的编程重复,从而达到减化编程的目的。主程序可以调用子程序,一个子程序也可以调用下一级的子程 序。子程序必须在主程序结束指令后建立,其作用相当于一个固定 循环。 三、课堂举例:完成下图零件的编程 还可以加深学生对数学计算能力的提高。增强学生的程序编写和阅读能力。四:课堂练习:用课外实例和图形,重点完成指令的应用: 完成下图零件的加工程序的编写(顺时针方向加工)

子程序调用实验

计算机科学与技术系 实验报告 专业名称计算机科学与技术 课程名称微机原理与接口技术 项目名称子程序调用实验 班级 学号 姓名 同组人员无 实验日期 2016/12/5

一、实验目的与要求: (简述本次实验要求达到的目的,涉及到的相关知识点,实验的具体要求。) 1、熟悉BCD码的调整指令。 2、熟悉ASCII转换成数字的方法。 3、熟悉压缩的BCD码转换成ASCII字符的方法。 4、熟悉子程序的定义和调用。 二、实验内容 (根据本次实验项目的具体任务和要求,完成相关内容,可包括:实验目的、算法原理、实验仪器、设备选型及连线图、算法描述或流程图、源代码、实验运行步骤、关键技术分析、测试数据与实验结果、其他) 内容: 从微机键盘上输入4位被加数、加数,并显示在信息窗口中,实现双字节的BCD 码(四位数)的加法,结果显示在信息窗口中,其中获得BCD码功能,高位0消隐并显示最后结果功能,将压缩的BCD码转换成ASCII字符,使用子程序调用实现。 原理:首先输入被加数,然后调用GetBCDKey函数得到双字节十进制被加数,同样的方法处理加数,然后将两个数带进位相加,得到的数高位0消隐显示出来。这里的得到双字节的十进制数是关键,还需要有将一个字节的压缩BCD码转换成两个字节数字的函数。 流程图:

三、实验分析与小结: (实验过程中的问题分析、产生的原因以及解决方法;实验结果分析;有待优化思路) 1.程序分析: .MODEL TINY .STACK 100 .DATA BUFFER DB 10 DUP(?);BUFFER存放8个不确定数 augend DB 2 DUP(?) ;被加数 addend DB 2 DUP(?) ;加数 msg1 DB 0DH,0AH,'请输入被加数: $' msg2 DB 0DH,0AH,'请输入加数: $' msg3 DB 0DH,0AH,'结果: $';msg3存放结果 ;0DH和0AH分别是回车和换行的ASCII码, ;'$'是DOS功能调用INT 21H中9号功能要求的要显示字符串的结束标志.CODE

子程序的调用和返回指令

1、子程序的调用和返回指令 子程序的调用和返回是一对互逆操作,也是一种特殊的转移操作。 一方面,之所以说是转移,是因为当调用一个子程序时,程序的执行顺序被改变,CPU将转而执行子程序中的指令序列,在这方面,调用子程序的操作含有转移指令的功能,子程序的返回指令的转移特性与此类似; 另一方面,转移指令是一种“一去不复返”的操作,而当子程序完后,还要求CPU能转而执行调用指令之下的指令,它是一种“有去有回”的操作。 为了满足子程序调用和返回操作的特殊性,在指令系统中设置了相应的特定指令。 1、1调用指令(CALL) 调用子程序指令的格式如下: CALL 子程序名/Reg/Mem 子程序的调用指令分为近(near)调用和远(far)调用。如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示的)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移 如果被调用子程序的属性是远的,那么,CALL指令将产生一个远调用。这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用操作 00405600 call 00406895 00405604 ...... 子程序调用指令本身的执行不影响任何标志位,但子程序体中指令的执行会改变标志位,所以,如果希望子程序的执行不能改变调用指令前后的标志位,那么,就要在子程序的开始处保护标志位,在子程序的返回前恢复标志位。 例如: CALL DISPLAY ;DISPLAY是子程序名 CALL BX ;BX的内容是子程序的偏移量 CALL WORD1 ;WORD1是内存字变量,其值是子程序的偏移量 CALL DWORD1 ;DWORD1是双字变量,其值是子程序的偏移量和段值 CALL word ptr [BX] ;BX所指内存字单元的值是子程序的偏移量 CALL dword ptr [BX]

相关文档