第六章 子程序设计

合集下载

《IBM PC 80X86汇编语言程序设计》PPT电子课件教案-第六章 子程序设计

《IBM PC 80X86汇编语言程序设计》PPT电子课件教案-第六章 子程序设计

《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
1、子程序的概念和特点
子程序:把在程序中多次出现,具有独立功能 的程序段写成程序模块,该模块可被多次调用, 称之为子程序。
特点:①可重复使用(调用) ②具有通用性(可通过入口参数实现) ③可浮动性(存放位置灵活) ④可递归性和可重入性
第6章
第六章 子程序设计
一、子程序的定义 二、子程序的结构形式
三、子程序的设计和调用 四、子程序的参数传递方法 五、子程序的嵌套和递归调用 六、子程序的设计举例 七、多模块程序设计 八、汇编语言和高级语言的混合编程
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
一、子程序的定义
1、子程序的概念和特点 2、子程序的定义 3、子程序的调用和返回
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
2、子程序的定义
子程序的定义是由过程定义伪指令PROC和ENDP 来完成的。其格式如下:
过程名 PROC [NEAR/FAR]

过程名 ENDP
其中PROC表示过程定义开始,ENDP表示过程定 义结束。过程名是过程入口地址的符号表示。
一般过程名同标号一样,具有三种属性,即段 属性、偏移地址属性以及类型属性。
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
3、子程序的调用和返回
❖ 调用
①段内直接调用
格式:CALL 子程序名
功能:将子程序返回地址(断点)入栈
SP←SP-2
(SP)←IP,
并转到子程序入口地址去执行子程序。
❖ 返回指令

PLC编程与应用第2版习题答案第6章 程序设计

PLC编程与应用第2版习题答案第6章 程序设计

第六章 程序设计
1、简述划分步的原则
2、简述PLC 编程应遵循的基本原则
3、请画出以下梯形图的顺序功能图。

4、请写出以下顺序功能图对应的梯形图。

I0.3
M0.0
M0.1
M0.2
M0.3
Q0.0 Q0.1
Q0.1 Q0.2 SM0.1
I0.0
I0.1
I0.2
5、在顺序功能图中,转换实现的条件是什么?
6、画出以下波形图对应的顺序功能图。

7、以下是电动机的延时启停程序:按下瞬时启动按钮I0.0,延时5秒后电动机Q4.0启动,按下瞬时停止按钮,延时10秒后电动机Q4.0停止。

请画出梯形图对应的顺序功能图。

8、S7-1200中数据块有哪些类型,其主要区别是什么?
9、S7-1200有哪些编程方法,其主要区别是什么?
10、为什么要在程序中使用临时变量?
11、请简述结构化编程的优点。

12、请简述FB和FC的区别。

13、CPU开始运行的时候,首先执行的是什么程序?我们应该在哪个程序块中为变量做初始化。

第6章程序设计初步教参

第6章程序设计初步教参

第六章程序设计初步【本章概述】中小学程序设计教学的目的,是要求学生掌握程序设计的一般方法,发展他们的思维能力、分析问题和解决问题的能力。

VB是一种面向对象的程序设计语言,Visual意为“可视化的”,Basic指的是BASIC语言。

在学习VB时,除了学习界面设计,更要学习灵活运用VB实现各种算法。

教学过程中,教师应注重算法的教学,通过阅读程序、编写和调试程序、使用程序,逐步培养学生的程序设计的能力。

【教学要求】1.本章总的教学要求⑴熟悉Visual Basic窗口的组成,学会建立Visual Basic程序。

⑵理解对象的概念,知道对象的三要素,了解事件驱动的程序设计思想和面向对象的程序设计方法。

⑶理解窗体和控件的概念,掌握四个常用控件——命令按钮、标签、文本框和定时器,学会用可视化的设计工具设计程序界面。

⑷掌握Visual Basic的常量、变量、标准函数和表达式。

⑸掌握Let、End语句及输入输出技术,会用注释符(')为程序添加注释。

⑹掌握程序控制语句。

⑺理解数组、数组元素、下标的概念,掌握数组的简单应用。

⑻掌握算法的概念和一些简单的典型算法,能用流程图描述算法,并能用Visual Basic 语言实现算法。

⑼学会编辑、调试和运行程序。

⑽学会使用Visual Basic的帮助功能,培养通过帮助获取信息的能力。

⑾培养对程序设计的兴趣和用程序设计方法解决实际问题的能力。

⒉教学内容及课时安排本章教学约需23课时(含上机实践),具体安排如下:第一节:程序设计的基本方法1课时第二节:Visual Basic的基本知识2课时第三节:程序的建立和运行3课时(1)第四节:Visual Basic语言基础4课时(1)第五节:分支结构3课时(1)第六节:循环结构6课时(1)第七节:数组4课时(1)【教材分析与教法建议】第一节程序设计的基本方法一、教学要求⑴理解算法的概念,了解描述算法的两种方法——自然语言、流程图,知道各自的优缺点。

第6章 2子程序设计方法

第6章 2子程序设计方法

;取被开方数
PUSH CX ;保存信息 CALL SQR_PROC;调用子程序
MOV [DI],CL
POP CX
ADD
SI, 2
INC DI
LOOP
LOP
MOV AH, 4CH
INT
21H
SQR_PROC
PROC
MOV CL,0
MOV DX,1 SQR: SUB AX,DX JB INC EXIT CL
3.信息的保护与恢复
1)在调用程序中保存
若子程序PROGA中改变了寄存器AX,BX,CX的值, 则可采用如下方法保护和恢复现场。
PUSH AX
PUSH BX PUSH CX ;保护现场
CALL PROGA
POP AX POP BX POP CX
2)在子程序中保存
若子程序PROG中改变了寄存器AX,BX,CX, DX的值,则可采用如下方法保护和恢复现场。
ADD AL,
30H
MOV [DI],AL INC DI
LOOP L1 RET BINASC CODE ENDP ENDS
END START
返回本节
例4.通过堆栈传递参量
【例4.12】将一个给定的二进制数转换成二进制数的ASCII码。ຫໍສະໝຸດ DATASEGMENT
BIN1
BIN2
DB
93H
DW 0ABCDH
通过寄存器传递参量例616设在数据段中有一组字数据试编制一程序用减奇数法对这组数据逐一开平方并把结果存入pfg的字节数组中
5.6.5 子程序设计
1 、子程序的概念
2、子程序的定义 3、子程序调用指令 4、子程序设计方法
5 、子程序应用举例
1 子程序的概念

第6章 子程序设计

第6章 子程序设计
1.子程序的调用指令
指令格式:
CALL DST
其中:目的操作数DST 是子程序名或子程序首地址 2.子程序的返回指令
指令格式:
RET / RETF / RET n
指令功能: RET:返回地址出栈送IP寄存器(段内)。 RETF:返回地址出栈送IP寄存器(段内或段间)和CS寄 存器(段间)。 RET n:返回地址出栈送IP寄存器和CS寄存器,再将n个 (必须偶数)字节数据弹出,保持栈平衡 。
指令格式 CALL DST CALL NEAR DST CALL FAR DST
指令功能
寻址方式
段内直接调用 SP=SP-2;SS:[SP]← CALL指令的下一 条指令的IP值IP=IP+D16 (当DST为16位) SP=SP-2;SS:[SP]←返回地址的段地址 SP=SP-2;SS:[SP]←返回地址的偏移值 IP=DST的偏移地址,CS=DST的段地址 SP=SP-2; SS:[SP] ← CALL指令的下 一条指令的IP值IP=DST中的有效地址EA (当DST为16位)(IP ← BX的值) SP=SP-2; SS:[SP] ← 返回地址的 段地址SP=SP-2; SS:[SP] ← 返回 地址的偏移值IP=EA的低16位,CS=EA的 高16位(IP ←DS:[BX]的值 ,CS ←DS:[BX+2]的值) 段间直接调用
POP AX
POP DI RET GETSTRING ENDP ;恢复现场
CODE
ENDS
END MAIN
(4)编程说明: 1)对内存变量编程取操作数,常采用两种方式: 先将内存变量的首地址送寄存器(BX,SI或DI选其 一),然后使用变址寄存器 SI 或 DI ,赋初值为零, 采用[BX+SI]或[BX+DI]提取操作数,不断改变SI, DI值,可取到不同的内存变量操作数,该寻址方式为 基址加变址寻址方式。 采用变量带标号的方法。如本例INPUT[DI],利用 变量INPUT本身具有首地址属性,DI赋初值为零, 不断变化DI值,可取到不同内存变量的操作数。该 寻址方式为寄存器相对寻址方式。 2)共用变量时,不同程序调用子程序时需要注意对该变 量的数据类型保持一致性。如该程序变量INPUT为字 节定义,别的程序调用时需注意与8位寄存器匹配。

语言程序掌握子程序的设计

语言程序掌握子程序的设计

语言程序掌握子程序的设计
1.定义子程序
子程序是一种由一系列指令组成的程序单元,它不能独立执行,而是在主程序中被调用,完成特定功能。

它常常由多个步骤组成,每个步骤完成特定的工作,并接受传入的参数值,以便实现代码复用。

2.子程序的优点
子程序有以下优点:
(1)节省内存:存储程序的代码时,每个子程序只需要一次存储,只要在主程序中调用,就可以运行。

因此,节省了大量的存储空间,能够有效的提升程序的执行效率。

(2)提高程序的可读性:当程序中有很多功能,用子程序的方式将功能拆分开来,方便阅读和编写程序,提高了程序的可读性。

(3)提高程序的重用性:由于子程序可以通过一次存储,可以无限次调用,因此可以大大提升程序的重用性,减少编程的重复工作量。

(4)代码可维护性:由于子程序只执行特定功能,代码量比较小,因此可以有效的提高代码维护的效率,对代码进行修改和改进。

3.子程序的编写
(1)定义子程序的参数:在编写子程序前,需要先定义子程序的参数,包括参数的类型、个数、变量名等。

(2)编写子程序的步骤:根据参数、功能定义,编写具体的步骤,完成子程序的编写。

汇编语言程序 掌握子程序的设计

汇编语言程序 掌握子程序的设计

汇编语言程序掌握子程序的设计汇编语言程序掌握子程序的设计什么是子程序子程序是汇编语言中一种独立的可重复使用的程序代码片段,它可以被主程序调用和执行。

子程序的设计可以让程序更加模块化,提高代码的复用性和可维护性。

子程序的设计原则1. 单一职责原则:每个子程序只负责一个特定的任务,功能要清晰明确,只有一个明确的入口和出口。

2. 低耦合原则:子程序之间应该尽量少的依赖和耦合,可以独立进行调试和修改,互相之间不会产生影响。

3. 高内聚原则:子程序内部的代码要高度集中和相关联,功能相关的代码应该放在一起。

4. 应该尽量避免代码的冗余和重复,可以将常用的代码片段封装成子程序,提高代码的可维护性和可读性。

子程序的设计步骤1. 确定子程序的功能和功能的输入输出:明确子程序的任务和需要的输入参数,确定子程序的输出结果。

2. 设计子程序的接口和入口参数:确定子程序的调用方式和输入参数的传递方式,以及子程序返回结果的方式。

3. 编写子程序代码:根据子程序的功能和接口的要求,编写相应的汇编语言代码。

4. 调试和测试子程序:进行子程序的单独测试和调试,确保子程序的功能正确和稳定。

5. 在主程序中调用子程序:将子程序集成到主程序中,并按照子程序的接口要求传递参数并获取结果。

子程序的设计案例:计算阶乘假设我们需要在汇编语言中设计一个子程序,用于计算给定整数的阶乘。

assemblysection .datanum db 5result dw 0section .textglobal _start_start:mov al, te [num]call factorialmov word [result], ax ; 其他指令factorial:push bpmov bp, sppush axpush cxxor ax, axmov cl, alcmp al, 1je end_factorialdec alcall factorialmul clend_factorial:pop cxpop axpop bpret在上面的例子中,我们使用了一个子程序`factorial`,用于计算给定整数的阶乘。

第6章程序设计语言习题与答案

第6章程序设计语言习题与答案

第六章习题(1)复习题1、简述自然语言与形式语言的概念以及区别、汇编语言与机器语言的概念及区别。

自然语言是某一社会发展中形成的一种民族语言,而形式语言是进行形式化工作的元语言,它是以数学和数理逻辑为基础的科学语言。

用机器指令形式编写的程序称为机器语言,用带符号或助记符的指令和地址代替二进制代码成为语言进化的目标。

这些使用助记符语言的语言后来就被称之为汇编语言。

(P135P136)2、什么是高级程序设计语言?它有什么特点?高级语言是汇编语言的一种抽象。

高级语言的设计目标就是使程序员摆脱汇编语言细节的繁琐。

高级语言同汇编语言都有一个共性,那就是:它们必须被转化为机器语言,这个转化的过程称为解释或编译。

(1)高级语言接近算法语言,易学、易掌握;(2)高级语言设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言与具体的计算机硬件关系不大,其程序可移植性好,重用率高;(4)高级语言自动化程度高,开发周期短,利于提高程序的质量。

(P138)3、列举程序设计语言的几种范型。

程序语言大致分为命令式程序设计语言、面向对象的程序设计语言、函数式程序设计语言和逻辑型程序设计语言等范型。

(P138-140)4、简述语言虚拟机。

提示:语言虚拟机是某种语言的解释器。

语言虚拟机是建立在硬件和操作系统之上,针对不同的硬件和操作系统有不同的虚拟机,通过语言虚拟机屏蔽掉硬件的差异。

这样使得硬件系统能够支持这种语言编写的程序的有效执行。

目前最流行的语言虚拟机是Java虚拟机。

(P147)5、计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?提示:主要有编译、解释等方式,也有两种方式的混合使用的形式。

编译是使用编译器将高级语言编写的源程序转换成计算机可以执行的机器语言可执行程序,也可以理解为用编译器产生可执行程序的动作。

编译方式是一次编译,然后执行程序可以反复多次执行。

解释是另一种将高级语言转换为可执行程序的方式。

微机原理与应用第六章

微机原理与应用第六章

数组字<AX? N 内容交换 修改数组指针 N 到100字?
YRT: MOV MOV MOV MOV MOV NEXT1: CMP
AX,2000H DS,AX BX,0042H AX,0 CX,100 AX,[BX]
循环次数已知 (计数控制)
JA
MOV NEXT: INC
NEXT
MAX PROC NEAR PUSHF PUSH AX PUSH CX PUSH SI
STAR:MOV BX,2000H MOV AL,5 MOV AH,0 [BX+AL] XLAT HLT ADD BX,AX
MOV AL,[BX] 执行后:AL=19H
复习换码指令
…… 64H 51H 40H 31H 24H 19H 10H 09H 04H 01H 00H
⑴ 段内直接调用与返回
格式:CALL 过程名 功能:调用当前段内的子程序 操作:SP←SP-2,[SP]←IP,IP←IP+disp 格式:RET 操作:IP ←[SP],SP← SP+2 16位通用寄存器或 ⑵ 段内间接调用与返回 字存储器 格式:CALL OPRD 操作:SP←SP-2,[SP]←IP,IP←(OPRD) 格式: RET 操作:IP ←[SP],SP← SP+2
子 程 序 段
子 程 序 段
subr1 proc near ...... ret subr1 endp main endp code ends
主 程 序 段
code ends
例:
MY SEGMENT ASSUME CS:MY MAIN PROC FAR START: PUSH DS SUB AX,AX PUSH AX MOV CL,04 CALL DP5 MOV BL,CL CALL DP5 ADD AL,BL RET MAIN ENDP DP5 PROC MOV SAL SAL ADD MOV NEAR AL,CL AL,1 AL,1 AL,CL CL,AL

第六章-子程序设计

第六章-子程序设计
MAIN
CODE1 SEGMENT PROC FAR CALL FAR PTR SUB2 RET ENDP ENDS SEGMENT PROC FAR CALL FAR PTR SUB2 RET ENDP PROC FAR RET ENDP ENDS END MAIN
MAIN CODE1 CODE2 SUB1
DEC_DIV
DEC_DIV CODE
PROC ;CX中为十进制的位权 MOV AX,BX MOV DX,0 DIV CX ;商为转换后的一位十进制数 MOV BX,DX MOV DL,AL ADD DL,30H ;转换成ASCII码 MOV AH,2 ;显示 INT 21H RET ENDP ENDS 10 END MAIN
21
NEXT:
ARY_SUM CODE2
ADD AX,[SI] ADD SI,2 LOOP NEXT MOV [DI],AX POP DI POP SI POP CX POP AX RET ENDP ENDS END MAIN
;累加和 ;修改地址指针 ;存和 ;恢复寄存器
22
4.通过堆栈传递参数或参数地址
6.2
子程序参数传递
通过给子程序传递参数使其更通用。常用 的参数传递方法如下: 通过寄存器传递; 通过内存传递:若主子程序在同模块中, 子程序可以直接访问模块中的变量; 通过地址表传递参数地址; 通过堆栈传递参数或参数地址。
6
1.通过寄存器传递 这种传递方式使用方便,适用于参数较 少的情况。 例1.把BX中的16位二进制数转换成十 进制并显示在屏幕上。 分析:二进制到十进制数的转换方法有 多种,本例采用从高到低逐个除以十进 制位权的方法。
第六章
子程序设计
为了程序共享或模块化设计的需要,可以把一 段公共语句序列设计成子程序或宏指令的形式。 本章介绍子程序的设计方法。 在汇编语言中,允许子程序嵌套和递归。子程 序作为调用程序去调用另一子程序,把这种关 系称为子程序嵌套。嵌套的层数没什么限制, 其层数称为嵌套深度。 在子程序嵌套情况下,如果一个子程序调用的 子程序就是它自身,这样的子程序称为递归子 程序。显然递归调用是子程序嵌套的一种特殊 情况。用递归算法可设计出效率较高的程序。 子程序设计时,要注意堆栈足够大。 1

第六章 循环结构程序设计

第六章 循环结构程序设计

6-1.比较while语句、do–while语句和for语句的异同。

答:(1)while语句、do-while语句用于条件循环,for语句用于计数循环。

(2)while语句、for语句是先判断循环条件,后执行循环体,如果循环条件一开始就不成立,则循环体一次也不被执行;而do-while语句是是先执行循环体,后判断循环条件,所以循环体至少被执行一次。

(3)知道循环的次数可选用for语句实现循环,不知道循环的次数可选用while语句或do-while语句实现循环.(4)一般而言,三种循环语句可等价实现.6-2 仔细阅读下面的程序,指出程序的运行结果.#include<stdio.h>void main(){ int i;for(i=0;++i;i<5){ if(i==3){printf("%d\n",++i);break;}printf("%d\n",++i);}}答:24思考:语句“for(“i=0;++i;i<5”)在编译时为何会给出语法警告错误?当将其改为“for(i=0;i<5;++i)”时,运行结果又将如何?6-3 仔细阅读下面的语的程序,指出程序的运行结果。

#include"stdio.h"void main(){ int i, a=0;for(i=1;i<=5;i++){do{i++;a++;} while(i<3);}i++;printf("a=%d,i=%d",a,i);}答:a=3,i=7思考:在for循环中嵌套着do-while循环,那么do-while循环中对i的修改会对for循环产生影响吗?6-4编写程序,用1000个单词”computer”填充屏幕,每行60个 .解:#include<stdio.h>void main(){ int i;for(i=1;i<=1000;i++){ printf("computer.");if(i%60==0)printf("\n");}}思考:在for循环中,”if(i%60==0)printf(“\n”);”语句的作用是什么?没有此语句将会是什么状况?6-5输入一行字符(以$结束),统计其中的数字字符、空格字符出现的次数。

汇编语言程序 掌握子程序的设计(2023版)

汇编语言程序 掌握子程序的设计(2023版)

汇编语言程序掌握子程序的设计汇编语言程序设计——子程序的设计一、引言汇编语言是一种低级别程序设计语言,与计算机硬件之间的联系非常紧密。

掌握子程序的设计是汇编语言程序设计的重要环节之一,本文档将详细介绍汇编语言程序中子程序的设计方法。

二、子程序的概念⒈子程序的定义子程序是一段独立的代码段,用于完成特定的功能,可以被主程序或其他子程序调用。

⒉子程序的优点⑴提高程序的模块化和可读性⑵重复利用代码,减少代码冗余⑶便于程序的维护和调试三、子程序的设计⒈子程序的设计要素⑴子程序的输入参数⑵子程序的返回值⑶子程序的功能描述⒉子程序的设计步骤⑴确定子程序的功能和输入参数⑵设计子程序的算法⑶编写子程序的代码⑷调试子程序并验证其正确性四、子程序的调用与返回⒈子程序的调用⑴传递参数⑵调用子程序⑶获取返回值⒉子程序的返回⑴返回值的存储⑵返回地质的存储五、子程序的参数传递⒈参数传递的方式⑴寄存器传递参数⑵栈传递参数⑶内存传递参数⒉参数传递的注意事项⑴参数传递的顺序⑵参数传递的大小和类型⑶参数传递的规范六、子程序的返回值⒈返回值的存储方式⑴寄存器存储返回值⑵内存存储返回值⒉返回值的类型⑴整型返回值⑵实型返回值⑶字符串返回值七、附件本文档没有附件。

八、法律名词及注释⒈子程序:在计算机程序中,独立完成特定功能的代码段。

⒉模块化:将程序分成多个独立的模块,每个模块负责完成特定功能。

⒊可读性:指程序的易读程度,便于程序员理解和维护。

⒋代码冗余:程序中重复出现的代码。

⒌算法:解决问题的一系列步骤。

IBMPC汇编语言程序设计第二版答案

IBMPC汇编语言程序设计第二版答案

IBMPC汇编语言程序设计第二版答案在IBMPC汇编语言程序设计第二版中,你将学习到关于汇编语言的基本概念和技巧,以及如何在IBMPC上进行程序设计。

本文将为你提供该教材的答案,以帮助你更好地理解和掌握相关知识。

第一章:引言本章主要介绍了汇编语言的概念和历史背景,以及为什么学习汇编语言在计算机科学领域中至关重要。

课后习题包括:1. 解释汇编语言的概念和作用。

2. 证明学习汇编语言的重要性。

第二章:基本概念本章讨论了汇编语言的基本概念,包括寄存器、内存、指令、操作数等。

课后习题包括:1. 列出IBMPC的主要寄存器及其作用。

2. 解释内存和指令的概念。

3. 指出指令中的操作数是什么以及如何使用它们。

第三章:汇编语言程序的结构本章介绍了汇编语言程序的结构,包括程序开始和结束的标记、数据段和代码段的定义等。

课后习题包括:1. 解释并举例说明程序开始和结束标记的作用。

2. 编写一个简单的汇编语言程序,包含数据段和代码段的定义。

第四章:数据传送和运算指令本章详细讨论了数据传送和运算指令,并提供了具体的例子和实践习题。

课后习题包括:1. 解释MOV指令的功能和用法。

2. 使用ADD指令完成两个数相加的程序。

第五章:程序控制指令本章讲解了程序控制指令,如条件和无条件转移指令、循环指令等。

课后习题包括:1. 说明条件转移指令如何工作。

2. 使用循环指令编写一个计算阶乘的程序。

第六章:子程序本章介绍了子程序的概念和使用方法,以及如何传递参数和返回值。

课后习题包括:1. 解释子程序的作用和优势。

2. 编写一个带有参数和返回值的子程序。

第七章:栈与堆栈本章详细讨论了栈的概念和操作,以及堆栈的使用方法。

课后习题包括:1. 说明栈和堆栈的区别。

2. 编写一个使用堆栈实现函数调用的程序。

第八章:位操作与逻辑运算本章介绍了位操作和逻辑运算的指令,以及如何使用它们进行位级别的操作。

课后习题包括:1. 解释位操作指令的功能和应用。

第6章 子程序设计

第6章 子程序设计

;保存程序前缀PSP地址
;AX清0 ;RES字单元清0 ;置地址指针 ;过程调用计算RES+2X ;过程调用计算RES+5Y
;过程调用计算RES+8Z ;程序返回
汇编语言程序设计
子程序编写
MULL PROC MUL ADD MOV INC RET MULL ENDP NEAR ;乘法子程序 BYTE PTR [BX] ;做乘法结果在AX WORD PTR RES,AX ;做加法 AX,0 ;AX清0 BX ;地址加1 ;返回主程序
(IP) ← (EA)
DST给出寄存器或存储单元的内 容(转向地址) 比如: CALL word ptr [bx]
汇编语言程序设计
DST给出子程序的入口地址 (子程序为far属性) 比如:CALL far ptr subp
段间直接远调用:CALL FAR PTR DST
执行操作: PUSH CS PUSH IP (IP) ← DST偏移地址 (CS) ← DST段地址
指令功能: 把CALL指令的下一条指令地址(称为返回点或断点) 推 入堆栈保存,然后转到目标地址(DST)。 CALL指令可以在段内、段间调用,寻址方式分为直接和 间接两种。
汇编语言程序设计
段内直接近调用:CALL DST 执行操作: (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP)
(SP) 段间间接远调用:CALL FAR PTR DST →
(IP) (CS)
执行操作: PUSH CS PUSH IP (IP) ← (EA) (CS) ← (EA+2)
汇编语言程序设计
(2)RET 返回主程序指令: 属于无 条件转移指令。可以在段内或段间返 回。 段内近返回:RET

第六章子程序设计

第六章子程序设计
ASSUME CS:CODE2 DISP PROC FAR
MOV DL, ’P’ MOV AH, 2 INT 21H RET DISP ENDP CODE2 ENDS
END START
2023/12/31
汇编语言程序设计教程
12
例:段间间接调用
DATA SEGMENT NUM DW 1 CAADDR DW OFFSET SUBRT0
2023/12/31
汇编语言程序设计教程
23
6.3 子程序的嵌套与递归
6.3.1 子程序的嵌套调用 6.3.2 子程序的递归调用
2023/12/31
汇编语言程序设计教程
24
子程序的嵌套调用
• 子程序内包含有子程序的调用就是子程序的嵌套。嵌套深 度(即嵌套的层次数)逻辑上没有限制,但由于子程序的 调用需要在堆栈中保存返回地址以及寄存器等数据,因此 实际上受限于开设的堆栈空间。
• 子程序处理完数据后,将执行结果作为出口参数 存入寄存器中。
• 返回主程序后,主程序对存放在寄存器中的出口 参数进行相应的处理。
• 用寄存器传递参数方便、直观,是经常使用的方 法。但能传递的参数有限,适于参数较少的情况。
2023/12/31
汇编语言程序设计教程
21
通过堆栈传递参数
• 通过堆栈传递参数的思想是:主程序把入 口参数入栈保存,然后调用子程序,子程 序从堆栈中弹出入口参数进行处理。
• 递归子程序必须采用寄存器或堆栈传递参数,递归深度受 堆栈空间的限制。
• 递归子程序对应于数学上对函数的递归定义,它往往能设 计出效率较高的程序,可以完成相当复杂的计算。
2023/12/31
汇编语言程序设计教程
返回

第六章 子程序设计技术

第六章 子程序设计技术

6 .2恢复
PROC PUSH AX PUSH BX PUSH CX PUSH DX ┇ POP DX POP CX POP BX POP AX RET SUB1 ENDP 应该注意的是,堆栈的操作原则是后进先出。 应该注意的是,堆栈的操作原则是后进先出。
6 .2 .4
子程序的参数传递方法
在编写子程序时,为了便于其他用户调用该子程序和程序的阅读, 在编写子程序时,为了便于其他用户调用该子程序和程序的阅读,通常要写 出该子程序的说明信息。说明信息一般由如下几个部分组成: 出该子程序的说明信息。说明信息一般由如下几个部分组成: (1)子程序名 (2)功能描述 (3)入口参数 (4)出口参数 (5)使用的寄存器 (6)使用的算法和重要的性能指标 (7)其他说明 主程序与子程序之间传递参数的方法有寄存器法、约定单元法、地址表法和 主程序与子程序之间传递参数的方法有寄存器法、约定单元法、地址表法和 寄存器法 堆栈法等。 堆栈法等。
例 6.1
编写程序,将键盘输入的以非数字结束的十进制数转换成二进制数依次送BUF 编写程序,将键盘输入的以非数字结束的十进制数转换成二进制数依次送BUF 字缓冲区,最后以输入回车结束数据的输入。 字缓冲区,最后以输入回车结束数据的输入。 程序清单如下: 程序清单如下: STACK SEGMENT STACK DUP( DB 128 DUP(0) STACK ENDS DATA SEGMENT DUP( BUF DW 30 DUP(0) DATA ENDS CODE SEGMENT CS:CODE,DS:DATA,SS: ASSUME CS:CODE,DS:DATA,SS:STACK START: AX, START: MOV AX,DATA DS, MOV DS,AX AX, MOV AX,STACK SS, MOV SS,AX

子程序设计1

子程序设计1

子程序设计1在计算机编程的广袤世界中,子程序设计就如同建筑中的基石,虽看似细微,却对整个程序的结构和性能起着至关重要的作用。

子程序,简单来说,就是一段可以被独立调用和执行的代码块。

它就像是一个功能明确的小工具,在需要的时候被拿出来使用,完成特定的任务。

想象一下,你正在编写一个复杂的程序,比如一个大型的游戏或者一个企业级的管理系统,如果所有的代码都混在一起,那将会是一团乱麻,难以理解和维护。

而子程序的出现,就将这团乱麻梳理得井井有条。

子程序设计的第一步,是明确它的功能。

这就好比你要制造一个工具,首先得清楚这个工具是用来做什么的。

是用于数据处理、计算、还是控制流程?只有明确了功能,才能为后续的设计打下坚实的基础。

比如,我们要设计一个子程序来计算两个数的和,那么它的功能就是接收两个数作为输入,并返回它们的和作为输出。

在确定了功能之后,接下来要考虑的就是参数的设计。

参数就像是子程序的“接口”,通过这些接口,外部的代码可以与子程序进行交互。

参数的设计要合理,既要满足功能的需求,又不能过于复杂。

如果参数过多或者不合理,使用子程序的人就会感到困惑,甚至可能会用错。

还是以计算两个数的和为例,我们只需要两个参数,分别代表要相加的两个数。

然后就是子程序内部的实现。

这就像是在打造工具的内部结构,需要选择合适的算法和数据结构来实现预定的功能。

在这个过程中,要考虑代码的效率和可读性。

效率意味着程序能够快速地完成任务,而可读性则保证了其他人能够轻松地理解你的代码。

比如,在计算两个数的和时,我们可以直接使用加法运算符来实现,代码简洁明了。

设计好子程序之后,还需要进行测试。

测试就像是对工具的检验,确保它能够正常工作,并且在各种情况下都能给出正确的结果。

我们可以输入不同的参数值,检查子程序返回的结果是否符合预期。

如果发现问题,就需要及时进行调试和修改。

除了基本的功能实现,良好的子程序设计还需要考虑一些其他的因素。

比如错误处理,当输入的参数不符合要求或者在计算过程中出现异常情况时,子程序应该能够给出恰当的错误提示,而不是直接崩溃。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言程序设计
通过寄存器传递参数
通过寄存器进行主程序和子程序之间的参数传 递是最常用的参数传递方式。由于CPU中的 寄存器是有限的,因此通过寄存器传递参数 适用于入口参数较少的情况。它一般通过寄 存器传递数据或数据地址。常用:AL,AX, DX 寄存器传数据,用SI,DI,BX 传地址。
汇编语言程序设计
子程序名 PROC [NEAR /FAR ] 子程序体
RET 子程序名 ENDP 其中:
PROC表示子程序开始,ENDP表示子程序结束。 过程名是子程序的入口地址,在程序中是唯一的。它应
满足标识符的命名规则。 FAR或NEAR是子程序的属性操作符,缺省时为NEAR
属性。 汇编语言程序设计
NEAR的用法
AH,4CH
21H
MAIN1
SQROOT1 SQRT1:
SQRT2: SQROOT1
PROC XOR AND JZ MOV SHL INC SUB JC INC JMP MOV RET ENDP
NEAR AX,AX DX,DX SQRT2 BX,AX BX,1 BX DX,BX SQRT2 AX SQRT1 DX,AX
10A3H:2700H POP CX RET
执行后(AX)=10A3H (SP)=2F00H (DX)=2012H (CX)= 2010H ZF = 1
汇编语言程序设计
保存与恢复寄存器 子程序中需要使用的寄存器,有可能在主程序中正被
用来保存某种中间结果,这些寄存器的值在从子程 序返回主程序后还要继续使用, 这些寄存器的值或 所需的标志位的值等信息称之为现场。显然,子程 序执行前需要保护现场,返回时要恢复现场。
2:SQROOT PROC NEAR
3:
XOR AX,AX ; i←0
4:
AND DX,DX ;测试被开方数
5:
JZ
SQRT2 ;被开方数为0
6:SQRT1:
MOV BX,AX ;形成奇数
7:
SHL BX,1
8:
INC BX
9:
SUB DX,BX ;被开方数减去奇数
10:
JC SQRT2 ;不够减
11:
指令总结
指令格式 CALL DST CALL NEAR PTR DST CALL FAR PTR DST
CALL 寄存器操作数 如:CALL BX CALL WORD PTR M CALL DWORD PTR DST 如:CALL DWORD PTR[BX]
RET RET RET N
指令功能
SP=SP-2;SS:[SP]← CALL指令的下一条指令的 IP值IP=IP+D16 (当DST为16位)
汇编语言程序设计
例子
17: ① MOV
18:
MOV
19:
ADD
20: ② CALL
21: ③ PUSH
汇编语言程序设计
子程序的调用指令
3)段间直接调用 SP = SP-2; SS:[SP] 返回地址的段地址 SP = SP-2; SS:[SP] 返回地址的偏移地址 IP =DST的偏移地址 CS=DST的段地址
汇编语言程序设计
子程序的调用指令 4)段间间接调用 SP = SP-2; SS:[SP] 返回地址的段地址 SP = SP-2; SS:[SP] 返回地址的偏移地址 IP=EA的低16位 CS=EA的高16位
END
SP,SIZE STKTOP
DX,PX ;取X
DX,DX ;计算2X
SQROOT1 ;
DX
;暂存结果√2X
DX,PY ;取Y
AX,DX ;计算3Y
DX,DX
DX,AX
SQROOT1 ;
AX
;取出√2X
AX,DX ;计算√2X+√3Y
AX
;
DX,150
SQROOT1
AX
;
AX,DX ;
RLT,AX ;
INC AX ;够减, i增1
12:
JMP SQRT1 ;继续
13:SQRT2: MOV DX,AX ;DX←平方根
14:
RET
;返回
15:SQROOT ENDP
汇编语言程序设计
例子
2:SSEG
SEGMENT STACK
3:STKTOP DB 20 DUP(0)
4:SSEG
ENDS
5:DSEG
SEGMENT
POP AX
RET
SUBT ENDP
汇编语言程序设计
保护现场和恢复现场的方法
在子程序设计时,应仔细考虑哪些寄存器是必须保存 的,哪些寄存器是不必要保存的。一般来说,子程 序中用到的寄存器是应该保存的。
(2) 利用内存单元。用传送指令将寄存器的内容保存 到指定的内存单元,恢复时再用传送指令取出。
汇编语言程序设计
寻址方式 段内直接调用
SP=SP-2;SS:[SP]←返回地址的段地址SP=SP-2; 段间直接调用 SS:[SP]←返回地址的偏移值 IP=DST的偏移地址, CS=DST的段地址
SP=SP-2; SS:[SP] ← CALL指令的下一条指令 的IP值IP=DST中的有效地址EA(当DST为16位) (IP ← BX的值)
汇编语言程序设计
FAR的用法
汇编语言程序设计
需要注意的问题
1、在子程序体内,必须保证有一条RET指令被执行。如: PROC1 PROC MOV AX,0 PROC1 ENDP PROC2 PROC MOV BX,-1 RET PROC2 ENDP
当用指令CALL PROC1 调用子程序PROC1时,程序执行完 PROC1后,直接顺序执行子程序PROC2,当执行到RET时 才返回。汇编程序不会在PROC1的ENDP伪指令处返回主 程序。
汇编语言程序设计
CALL指令的格式
段内直接近调用 1、CALL 子程序名 2、CALL NEAR PTR 子程序名 段内间接近调用 3、CALL 寄存器操作数 4、CALL WORD PTR 存储器操作数 段间直接远调用 5、CALL FAR PTR 子程序名 段间间接远调用 6、CALL D WORD PTR 存储器操作数
6:PX
DW 200
7:PY
DW 300
8:RLT
DW 0
9:DSEG
ENDS
10:CSEG SEGMENT
11:
ASSUME CS:CSEG,DS:DSEG12:Leabharlann ASSUME SS:SSEG
13:MAIN: MOV AX,DSEG
14:
MOV DS,AX
15:
MOV AX,SSEG
16:
MOV SS,AX
汇编语言程序设计
保存与恢复寄存器
保存现场与恢复现场的工作既可在调用程序中完成, 也可在子程序中完成,程序设计时根据情况安排。 如果子程序已经设计好了,而其中未保护主程序现 场,那么调用程序在使用子程序之前应保护现场, 从子程序返回后再恢复现场。 通常在主程序中保护现场,则一定在主程序中恢 复;在子程序中保护现场,则一定在子程序中恢复。 这样可以增强主程序和子程序之间的相对独立性, 减少相互依赖,使程序结构清楚,减少错误。
(4)出口参数:说明子程序有几个输出参数(运行结果),这 些参数表示的意义、存放的位置。
(5)受影响的寄存器:说明子程序运行后,哪些寄存器的内容 被破坏了,以便使用者在调用该子程序之前注意保护现场。
汇编语言程序设计
子程序的参数传递 参数传递通常有三种方法:
1、通过寄存器传递参数 2、通过地址表传递参数地址 3、通过堆栈传递参数或参数地址
段内间接调用
SP=SP-2; SS:[SP] ← 返回地址的段地址 SP=SP-2; SS:[SP] ← 返回地址的偏移值 IP=EA的低16位,CS=EA的高16位(IP ←DS:[BX] 的值 ,CS ←DS:[BX+2]的值)
IP ←SS:[SP],SP = SP+2
段间间接调用 段内返回
IP ←[SP],SP =SP+2CS←[SP],SP= SP+2
汇编语言程序设计
例子
17: MOV
18:
MOV
19:
ADD
20:
CALL
21:
PUSH
22:
MOV
23:
MOV
24:
ADD
25:
ADD
26:
CALL
27:
POP
28:
ADD
29:
PUSH
30:
MOV
31:
CALL
32:
POP
33:
ADD
34:
MOV
35:
MOV
36:
INT
37:CSEG ENDS
38:
汇编语言程序设计
子程序的返回指令
指令格式:RET 指令功能: 段内返回:取栈顶的两字节内容送IP寄存器。 段间返回:将堆栈中保存的IP和CS值分别送IP和CS
寄存器。 带立即数的返回指令: RET N N一般为偶数;该指令除了执行RET指令的功能外还
要修改SP的值即: SP=SP+N
汇编语言程序设计
汇编语言程序设计
保护现场和恢复现场的方法
(1) 利用压栈和出栈指令,将寄存器内容或状态标志位内容
保存在堆栈中,恢复时再从堆栈中取出。如:
SUBT PROC NEAR
PUSH AX
;保存现场
PUSH BX
PUSH CX
PUSH DX
...
;子程序正常工作
POP DX
;恢复现场
POP CX
POP BX
第六章 子程序设计
相关文档
最新文档