IBM-PC汇编语言(⑥子程序结构)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,
并转到子程序入口地址去执行子程序。
❖ 返回指令
汇编语言——子程序
6.2.2.2 RET指令 指令 【指令格式】RET 【功能】这是子程序返回指令,必须写在子程序的指令 序列之中。根据所在的子程序的类型不同,RET指令的功能 也分为两种情况: (1)如果RET所在子程序是NEAR类型,则从堆栈中出 栈一个字(当然,SP会加2),送给IP。 (2)如果RET所在子程序是FAR类型,则先从堆栈中出 栈一个字送到IP,再出栈一个字送到CS,栈顶指SP的值加4。
cr
PROC NEAR MOV AH,2 MOV DL,13 INT 21H MOV DL,10 INT 21H RET
cr ENDP main:MOV AX,dseg MOV DS,AX LEA DX,buf MOV AH,10 INT 21H CALL cr MOV AH,1 INT 21H MOV BL,AL ;输入一个字符 ;用BL保存读入的字符 ;输入一个符号串
【解】程序段(a)中,先把AX赋值为102H,再把BX赋 值为304H,然后用ADD指令把两数相加,和为406H,结果 放在ADD指令的目的操作数AX中。 程序段(b)的前两行与(a)完全相同,AX取值102H,BX 取值304H,但在相加之前调用了子程序cr。从例6.3中cr的 具体实现方法可以知道,调用过程中寄存器AH的值被改为 2,因为INT 21H输出功能,使AL的值也被修改,变成0AH, 并且这个值一直保持到调用结束,于是“CALL cr”指令调 用子程序后,AX的值不再是调用前的102H,而变成了 20AH,当ADD指令进行两个寄存器相加时,结果是50EH, 并放到目的操作数AX中。
6.3 应用子程序进行编程
6.3.1 子程序实例
【例6.3】分析下列程序,描述它的功能。 dseg SEGMENT buf DB 80,81 DUP(0) dseg ENDS sseg SEGMENT STACK DW 64 DUP(0) sseg ENDS cseg SEGMENT ASSUME CS:cseg,DS:dseg,SS:sseg
IBM-PC汇编语言程序设计 ppt课件
PSW标志 存放器
指令译码器
控制电路
器 0000 0010 02 0010 0000 20
第3章 80x86的指令系统和寻址方式
7
(3) 助记符和汇编言语
助记符是有助记忆、并能描画指令功能的符号。 通常是指令功能的英文单词的缩写。 例 数的传送指令用助记符MOV 加法用ADD,转移用JMP等
用助记符等表示的指令称为汇编格式指令 例 MOV AL, 0 汇编言语是汇编格式指令、伪指令及其运用的一组规那 么。 用汇编言语编写的程序称汇编言语程序。
30
4. 存放器间接寻址方式* ——EA在基址存放器(BX/BP)
或变址存放器(SI/DI)中
BX, SI, DI (DS)
(BX)
物理地址 = 16d (DS) + (SI)
(DI)
BP (SS) 物理地址 = 16d (SS) + (BP)
MOV AX, [BX]
PA = 16d (DS) + (BX)
1. 立刻寻址方式* —— 操作数在指令中给出
MOV AL, 5
MOV AX, 3064H
* 只能用于SRC字段
* SRC 和 DST的字长一致
3064H 适用于给存放器赋初值
MOV AH,
第3章 80x86的指令系统和寻址方式
21
2. 存放器寻址方式* —— 操作数在指定的存放器中 MOV AX, BX MOV AL, BH
第3章 80x86的指令系统和寻址方式
24
默许段选择规那么
访问类型 指令
所用段及段寄存 器
代码段 CS
缺省选择规则 用于取指
堆 栈 堆栈段 SS 局部数据 数据段 DS 目 的 串 附加段 ES
IBMPC微机组成原理与基本结构.pptx
7 6 5432 10
在大多数计算机中,存储器的组织都是以字节为基本 单位。每一个基本单位称为一个存储单元。
一个存储器是由许多的存储 单元构成的,如某存储器的 容量为32KB, 1MB, 128MB等 等。为了区分这些不同的存 储单元,一般使用单元地址 来指示各个存储单元。如一 个10位二进制数表示的地址, 可以用来区分210=1024=1K 个单元。
2、主存储器
主存储器是用于存放程序和数据的部件。它由若干 个存储单元构成。存储单元的多少表示存储器的容量。 每个存储单元使用一个唯一的编号来标识,称为存储单 元的地址。对每个存储单元内容的存和取是按照地址进 行访问的。
3
计算机存储信息的基本单位是一个二进制位,一位可存 储一个二进制数0或1。每8位组成一个字节(BYTE)。
3. 变址寄存器 有两个16位的变址寄存器SI和DI,一般被用来作地址指针。
SI——源变址寄存器 DI——目的变址寄存器
同BP寄存器一样,SI和DI也可以用作通用数据寄存 器存放操作数和运算结果。
16
二、段寄存器
8086/8088CPU在使用存储器时,将它划分成若干个 段。每个段用来存放不同目的内容,如程序代码、数据等 等。每个存储段用一个段寄存器来指明该段的起始位置 (也叫段基址)。
B、存取数据——在EU执行指令的过程中,如果需要与存 储器或I/O端口传送数据时,根据EU提供的数据和地址, 并结合相应的段寄存器(DS、ES或SS)的内容,进入外 部总线周期,与存储器或I/0进行数据的存取。
EU和BIU是既分工又合作的两个独立部分。它们的操 作在一定程序上是并行工作的,分别完成不同的任务,因 而大大加快了指令执行速度。
段基址
CS 段基址 DS 段基址 SS ES 段基址
在大多数计算机中,存储器的组织都是以字节为基本 单位。每一个基本单位称为一个存储单元。
一个存储器是由许多的存储 单元构成的,如某存储器的 容量为32KB, 1MB, 128MB等 等。为了区分这些不同的存 储单元,一般使用单元地址 来指示各个存储单元。如一 个10位二进制数表示的地址, 可以用来区分210=1024=1K 个单元。
2、主存储器
主存储器是用于存放程序和数据的部件。它由若干 个存储单元构成。存储单元的多少表示存储器的容量。 每个存储单元使用一个唯一的编号来标识,称为存储单 元的地址。对每个存储单元内容的存和取是按照地址进 行访问的。
3
计算机存储信息的基本单位是一个二进制位,一位可存 储一个二进制数0或1。每8位组成一个字节(BYTE)。
3. 变址寄存器 有两个16位的变址寄存器SI和DI,一般被用来作地址指针。
SI——源变址寄存器 DI——目的变址寄存器
同BP寄存器一样,SI和DI也可以用作通用数据寄存 器存放操作数和运算结果。
16
二、段寄存器
8086/8088CPU在使用存储器时,将它划分成若干个 段。每个段用来存放不同目的内容,如程序代码、数据等 等。每个存储段用一个段寄存器来指明该段的起始位置 (也叫段基址)。
B、存取数据——在EU执行指令的过程中,如果需要与存 储器或I/O端口传送数据时,根据EU提供的数据和地址, 并结合相应的段寄存器(DS、ES或SS)的内容,进入外 部总线周期,与存储器或I/0进行数据的存取。
EU和BIU是既分工又合作的两个独立部分。它们的操 作在一定程序上是并行工作的,分别完成不同的任务,因 而大大加快了指令执行速度。
段基址
CS 段基址 DS 段基址 SS ES 段基址
汇编语言-子程序
随着指令的丰富、子程序的引入,汇编语言的表达也越来越灵 活。为了方便地组织数据,引入了结构伪操作STRUC。 STRUC可以把不同类型的数据放在同一个结构里,方便处理。 a). 结构类型说明格式为: structure_name STRUC … ;DB、DW、DD等伪操作 structure_name ENDS 注意:ENDS之前为结构名,注意与段结束相区别。 例如:下列语句说明了一个名STUDENT的结构类型: STUDENT STRUC ID DW ? SCORE DB 0 NAME DB „ABCDEFGH‟ STUDENT ENDS 但是,定义一个结构类型的时候不进行任何存储器分配,只有 在定义结构变量时才进行存储分配。
b). 结构变量的定义 格式是: [变量名] 结构名 < [字段值表]> 例:Lisi STUDENT <103 , 88 , „LI‟> ;三个字段重新赋值 Wangwu STUDENT <104 ,, „WANG‟> ;字段SCORE仍用缺省 值 Zhangsan STUDENT <> ;三个字段均用缺省初值 Team STUDENT 50 DUP (<>) ;定义50个结构变量,初值不变 在定义结构变量时,如果某个字段有多值,就不能给该字段重 新赋初值(定义时存在“DUP”, “ , , , ”等)。 c). 访问方式 访问方式:结构变量名.结构字段名 该变量的地址实质少年宫是结构变量地址的偏移பைடு நூலகம்相应字段偏 移值之和。 例:Zhangsan.ID ;访问张三的学号,实际上是直接寻址 还可以把结构变量地址的偏移先存入某个基址或变址寄存器, 然后利用“[寄存器名]”来代替结构变量名。 例如:MOV BX , OFFSET Zhangsan MOV AL , [BX].SCORE
第6章 子程序结构
16
data
segment ary count sum data ends code segment main proc assume mov mov call mov int main endp
dw dw dw
1,2,3,4,5,6,7,8,9,10 10 ?
far cs:code,ds:data ax, data ds, ax proadd ax,4c00h 21h
endp
count 10d sum 550d table 0000
0014 0016
0014 0016 (di) 0018 ↓ (bx)
proadd
next:
proc push push push push mov mov mov mov xor add add loop mov
near ax cx si di si, [bx] di, [bx+2] cx, [di] di, [bx+4] ax, ax ax, [si] si, 2 next [di],ax
第六章
子程序结构
过程定义伪操作 子程序的调用与返回 保存与恢复寄存器 子程序的参数传送 子程序的嵌套与递归
难重点 子程序的调用和返回。保护与恢复寄存器。子程 序的参数传送。嵌套与递归子程序。
1
1. 过程定义伪操作
过程名 PROC . . . 过程名 ENDP (1)NEAR属性:调用程序和子程序在同一代码 NEAR ( FAR )
subt
3. 保存与恢复寄存器
subt
proc push push push push …… …… pop pop pop pop ret endp
far ax bx cx dx
data
segment ary count sum data ends code segment main proc assume mov mov call mov int main endp
dw dw dw
1,2,3,4,5,6,7,8,9,10 10 ?
far cs:code,ds:data ax, data ds, ax proadd ax,4c00h 21h
endp
count 10d sum 550d table 0000
0014 0016
0014 0016 (di) 0018 ↓ (bx)
proadd
next:
proc push push push push mov mov mov mov xor add add loop mov
near ax cx si di si, [bx] di, [bx+2] cx, [di] di, [bx+4] ax, ax ax, [si] si, 2 next [di],ax
第六章
子程序结构
过程定义伪操作 子程序的调用与返回 保存与恢复寄存器 子程序的参数传送 子程序的嵌套与递归
难重点 子程序的调用和返回。保护与恢复寄存器。子程 序的参数传送。嵌套与递归子程序。
1
1. 过程定义伪操作
过程名 PROC . . . 过程名 ENDP (1)NEAR属性:调用程序和子程序在同一代码 NEAR ( FAR )
subt
3. 保存与恢复寄存器
subt
proc push push push push …… …… pop pop pop pop ret endp
far ax bx cx dx
第六章子程序结构
6.4.3、堆栈传递参数 子程序可以利用堆栈传递参数。例如C语言中,函数的参数传递就是利用堆栈。 首先要了解堆栈的构造和工作原理: 堆栈段使用段寄存器SS。在CALL指令、RET指令、PUSH指令、POP指令中, 按照“后进先出”的原则工作,并使用SP寄存器内容为堆栈顶偏移量指令。 使用BP为指针存取数据,默认的段寄存器也是SS,因此,BP也常常用来作存 取堆栈中数据的偏移量指针。 堆栈顶是变化的,随着压栈操作,堆栈顶向低地址方向生长。 压栈操作,堆栈顶向低地址方向生长 压栈操作 对堆栈的压栈操作和弹出堆栈操作必须平衡。
例:在数据串STR1中有20个字数据,数据串STR2中有5个字数据,编程。在 STR1中查找子串STR2,找到则把BL置为1,否则把BL置为0。 先编一个比较字数据串的子程序CMPSTR。 子程序名:CMPSTR 功能:把STR2与SI指到的字数据串比较(只比较前5个元素),相同则返回ZF= 1,否则返回ZF=0。 入口参数:SI指到一个数据串。 出口参数:两个串相同则返回ZF=1,否则返回ZF=0 程序: CMPSTR: LEA DI,STR2 MOV CX ,5 CLD REPZ CMPSW RET
SP
×× ×× ## ## %% SP %% ◎◎ ◎◎
ARY 地址 COUNT 地址 SUM 地址
×× ×× ## ## %% %% ◎◎ ◎◎
低地址
问题:取堆栈中的数据能否使用BX、SI、DI作指针? 答:可以,但是必须用段超越。如: PROADD PROC NEAR
MOV SI,SP MOV MOV SUB LP: ADD INC INC LOOP MOV MOV RET PROADD ENDP BX,SS:[SI +6] ;取ARY首地址 C X,SS:[SI+4] ;取数据个数 AX ,AX AX,[BX ] BX BX LP BX,SS:[SI+2] ;取SUM地址 [BX] ,AX 6 ;存和数 ;返回,并且使SP=SP+6
IBM-PC汇编语言程序设计第6章 子程序结构
•第6章 子程序结构
第六章 子程序设计结构
6.1 子程序的概念 6.2 子程序的定义 6.3 子程序设计方法 6.4 子程序应用举例 6.5 子程序的嵌套与递归调用 6.6 模块化程序设计
返回本章首页
•第6章 子程序结构
6.1 子程序的概念
在程序设计中, 在程序设计中 , 我们会发现一些多次无 规律重复的程序段或语句序列。 规律重复的程序段或语句序列 。 解决此类问 题一个行之有效的方法就是将它们设计成可 供反复调用的独立的子程序结构, 供反复调用的独立的子程序结构 , 以便在需 要时调用。 在汇编语言中, 子程序又称过程。 要时调用 。 在汇编语言中 , 子程序又称过程 。 调用子程序的程序称为主调程序或主程序。 调用子程序的程序称为主调程序或主程序。
返回本节
•第6章 子程序结构
6.3 子程序设计方法
1.信息的保护与恢复 . 2. 2.主程序与子程序参数传递方式
•第6章 子程序结构
1.信息的保护与恢复 .
例如: 若子程序PROG中改变了寄存器 , BX, CX, 例如 : 若子程序 中改变了寄存器AX, , , 中改变了寄存器 DX的值 , 则可采用如下方法保护和恢复 的值, 的值 现场。 现场。 PROG PROC PUSH AX PUSH BX PUSH CX PUSH DX ┆ ;保护现场
•第6章 子程序结构
入口参数: 存放待转换的二进制数 入口参数:DX存放待转换的二进制数 CX存放待转换数的位数(8位或 位) 存放待转换数的位数( 位或 位或16位 存放待转换数的位数 DI存放 存放ASCII码首地址 存放 码首地址 出口参数:转换后的字符串存放在以 作指针的字节存贮区中 出口参数:转换后的字符串存放在以DI作指针的字节存贮区中 程序如下: 程序如下: DATA SEGMENT NUM8 DB NUM16 DW ASCBUF DATA ENDS 93H 0ABCDH DB 20 DUP(0) ( )
第六章 子程序设计结构
6.1 子程序的概念 6.2 子程序的定义 6.3 子程序设计方法 6.4 子程序应用举例 6.5 子程序的嵌套与递归调用 6.6 模块化程序设计
返回本章首页
•第6章 子程序结构
6.1 子程序的概念
在程序设计中, 在程序设计中 , 我们会发现一些多次无 规律重复的程序段或语句序列。 规律重复的程序段或语句序列 。 解决此类问 题一个行之有效的方法就是将它们设计成可 供反复调用的独立的子程序结构, 供反复调用的独立的子程序结构 , 以便在需 要时调用。 在汇编语言中, 子程序又称过程。 要时调用 。 在汇编语言中 , 子程序又称过程 。 调用子程序的程序称为主调程序或主程序。 调用子程序的程序称为主调程序或主程序。
返回本节
•第6章 子程序结构
6.3 子程序设计方法
1.信息的保护与恢复 . 2. 2.主程序与子程序参数传递方式
•第6章 子程序结构
1.信息的保护与恢复 .
例如: 若子程序PROG中改变了寄存器 , BX, CX, 例如 : 若子程序 中改变了寄存器AX, , , 中改变了寄存器 DX的值 , 则可采用如下方法保护和恢复 的值, 的值 现场。 现场。 PROG PROC PUSH AX PUSH BX PUSH CX PUSH DX ┆ ;保护现场
•第6章 子程序结构
入口参数: 存放待转换的二进制数 入口参数:DX存放待转换的二进制数 CX存放待转换数的位数(8位或 位) 存放待转换数的位数( 位或 位或16位 存放待转换数的位数 DI存放 存放ASCII码首地址 存放 码首地址 出口参数:转换后的字符串存放在以 作指针的字节存贮区中 出口参数:转换后的字符串存放在以DI作指针的字节存贮区中 程序如下: 程序如下: DATA SEGMENT NUM8 DB NUM16 DW ASCBUF DATA ENDS 93H 0ABCDH DB 20 DUP(0) ( )
汇编语言程序设计 第2章 IBMPC系统结构.ppt
(2)16位指令指针寄存器IP
用来存放下一条要执行指令在代码段中的偏移地址。
(3)20位的地址加法器
用来形成20位的物理地址。
2019/11/22
第2章 IMB PC系统结构
17
计算机科学与技术系
《汇编语言程序设计》
2.3 8086/8088CPU的内部结构 2.3.1 8086/8088CPU功能结构
第2章 IMB PC系统结构
7
计算机科学与技术系
2.2 微型计算机系统
《汇编语言程序设计》
2.2.1 硬件
典型的微型计算机硬件主要由微处理器、存储器、系统总 线、I/O接口电路和I/O设备组成。
1.微处理器
微处理器也称中央处理器(CPU),是微型计算 机的核心部件,芯片内集成了运算器、控制器和寄存器 组,用来执行程序指令,完成所有的算术和逻辑运算及 全机的控制工作。
EIP EFLAGS
16 15
87
0
AH AX AL
BH BX BL
CH CX CL
DH DX DL
SP
BP
SI
DI
IP FLAGS
数据总线是用来传送数据信息的。该总线是双向总线。数据总线的位数(也 称宽度)决定了一次能够传送数据的位数。
地址总线是传送地址信息的。该总线是单向总线,用来输出CPU要访问的的内 存单元或I/O端口的地址。地址总线位数决定了CPU可以直接寻址的内存空间的 大小,对于n条地址总线,可直接寻址的内存范围为2n。例如,8086的地址总线 为20位,可寻址的最大内存空间为220B,即1MB。
2019/11/22
第2章 IMB PC系统结构
10
计算机科学与技术系
汇编语言程序设计 第2章 IBMPC系统结构PPT课件
36
36
寻址 空间 1M 1M 16M 4G 4G 4G
64G
64G
cache
无 无 无 有(很少) 8KB 16KB 16KB 256K(二级) 32KB 512K(二级
10.08.2020第2章 IMB PCFra bibliotek统结构7
《汇编语言程序设计》
第2章 IBM-PC系统结构
2.1 微型计算机发展概述 2.2 微型计算机系统 2.3 8086/8088CPU的内部结构 2.4 8086/8088的存储器结构
16 4.77
16 6~20
32 12.5~33
32 25~100
32 60~166
P6(PRO) 32 150~200
PⅡ
32 233~333
数据总 线宽度
16 16 16 32 32 64
64
64
外部数据 总线 16 8 16 32 32 64
64
64
地址总 线宽度
20 20 24 32 32 32
10.08.2020
第2章 IMB PC系统结构
8
《汇编语言程序设计》
2.2 微型计算机系统
2.2.1 硬件
▪ 硬件:三个主要组成部分,用系统总线连接。典型的微 型计算机硬件主要由微处理器、存储器、系统总线(控制 总线、数据总线、地址总线)、I/O接口电路和I/O设备组 成。
内存储器
中央处理机 CPU
• 教学难点:存储器分段、存储器单元物理地址的形成、各寄存器的用 途。
• 教学方法及手段:课堂讲授、小结讲评 • 课外作业:⑴P33 1,3, 6,7 • 学时分配:4 • 教学内容:80x86微处理器系列概况、基于8086的微计算机系统、
36
寻址 空间 1M 1M 16M 4G 4G 4G
64G
64G
cache
无 无 无 有(很少) 8KB 16KB 16KB 256K(二级) 32KB 512K(二级
10.08.2020第2章 IMB PCFra bibliotek统结构7
《汇编语言程序设计》
第2章 IBM-PC系统结构
2.1 微型计算机发展概述 2.2 微型计算机系统 2.3 8086/8088CPU的内部结构 2.4 8086/8088的存储器结构
16 4.77
16 6~20
32 12.5~33
32 25~100
32 60~166
P6(PRO) 32 150~200
PⅡ
32 233~333
数据总 线宽度
16 16 16 32 32 64
64
64
外部数据 总线 16 8 16 32 32 64
64
64
地址总 线宽度
20 20 24 32 32 32
10.08.2020
第2章 IMB PC系统结构
8
《汇编语言程序设计》
2.2 微型计算机系统
2.2.1 硬件
▪ 硬件:三个主要组成部分,用系统总线连接。典型的微 型计算机硬件主要由微处理器、存储器、系统总线(控制 总线、数据总线、地址总线)、I/O接口电路和I/O设备组 成。
内存储器
中央处理机 CPU
• 教学难点:存储器分段、存储器单元物理地址的形成、各寄存器的用 途。
• 教学方法及手段:课堂讲授、小结讲评 • 课外作业:⑴P33 1,3, 6,7 • 学时分配:4 • 教学内容:80x86微处理器系列概况、基于8086的微计算机系统、
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
jmp newchar Exit : ret
2020/12/10
Decibchi6n endp
8
安徽理工大学 计算机科学与技术系 李敬兆
《汇编语言》 第6章
Binihex proc near
mov ch, 4
Crlf proc near
Rotate: mov cl, 4 rol bx, cl mov dl, bl and dl, 0fh add dl, 30h cmp dl, 3ah jl print add dl, 7h
MOV CX ,COUNT
安徽理工大学 计算机科学与技术系 李敬兆
《汇编语言》 第6章
第6章 子程序结构
在程序设计中,我们会发现一些多次无规 律重复的程序段或语句序列。解决此类问题 一个行之有效的方法就是将它们设计成可供 反复调用的独立的子程序结构,以便在需要 时调用。在汇编语言中,子程序又称过程。
调用子程序的程序称为主调程序或主程序。
2020/12/10
MAIN
PROC FAR … CALL SUBR1 RET
SUBR1 PROC NEAR …
RET SUBR1 ENDP MAIN ENDP
ch6
4
安徽理工大学 计算机科学与技术系 李敬兆
《汇编语言》 第6章
如果调用程序和过程不在同一代码段中,则使用FAR属性;
SEGX SEGMENT
6.1 子程序的设计方法
6.1.1 子程序的定义
子程序的定义是由过程定义伪指令PROC和ENDP 来完成的。其格式如下:
过程名 PROC [NEAR/FAR] ┆
过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定
义结束。过程名是过程入口地址的符号表示。
一般过程名同标号一样,具有三种属性,即段 属性、偏移地址属性以及类型属性(NEAR 和 FAR)。
mov ah, 2 mov dl, odh int 21h mov dl, oah int 21h ret Crlf endp
Print: mov ah, 2
int 21h
Decihex ends
dec ch jnz rotate
end repeat
2020/12/10 ret
ch6
9
Binihex endp
xor ax, ax
cmp al, 9
push ax
jg exit
call decibin call crlf call binihex
cbw xchg ax, bx mov cx, 10 mul cx
call crlf
xchg ax, bx ;每次乘的
ret
add bx, ax
;结果在BX中
Main endp
调用CRLF
结束
ch6
用十六进制形式 显示BX中的数
7
安徽理工大学 计算机科学与技术系 李敬兆
《汇编语言》 第6章
Decibin proc near
Decihex segment
mov bx, 0
assume cs:Decihex Main proc far Repeat: push ds
Newchar: mov ah, 1 int 21h sub al, 30h jl exit
2020/12/10
ch6
1
安徽理工大学 计算机科学与技术系 李敬兆
子程序的结构
《汇编语言》 第6章
子程序的基本结构包括以下几个部分:
(1)子程序定义 (2)保护现场和恢复现场 (3)子程序体 (4)子程序返回
2020/12/10
ch6
2
安徽理工大学 计算机科学与技术系 李敬兆
《汇编语言》 第6章
《汇编语言》 第6章
这是最常用的一种方式,使用方便,但参数很多时不能 使用这种方法。
例:十进制到十六进制转换的程序。程序要求从键盘取得
一个十进制数,然后把该数以十六进制的形式在屏幕上显示
出来。
开始
调用DECIBIN
从键盘取得十进制 数,保存到BX中
调用CRLF 调用BINIHEX
显示回车和换行
2020/12/10
PROG
PROC
PUSH AX
PUSH BX PUSH CX
;保护现场Pຫໍສະໝຸດ SH DX•┆POP DX
POP CX POP BX
;恢复现场
POP AX RET
;返回断点处
PROC
ENDP
2020/12/10
ch6
6
安徽理工大学 计算机科学与技术系 李敬兆
6.1.4 主程序与子程序参数传递方式
1 通过寄存器传送参数
安徽理工大学 计算机科学与技术系 李敬兆
《汇编语言》 第6章
2 如果过程和调用过程在同一源文件(同一模块)中, 则过程可直接访问模块中的变量。
3
4 例 6.4 主程序MAIN和过程PROADD在同一源文 件中,要求用过程PROADD累加数组的所有元素, 并把和(不考虑溢出的可能性)送到指定的存储单 元中去
… SUBT PROC FAR
… RET SUBT ENDP … CALL SUBT …
SEGX ENDS
;
SEGY SEGMENT
…
CALL SUBT
…
2020/12/10
SEGY ENDS ch6
5
安徽理工大学 计算机科学与技术系 李敬兆
6.1.3 保护现场和恢复现场
《汇编语言》 第6章
例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则 可采用如下方法保护和恢复现场。
START: PUSH DS SUB AX ,AX PUSH AX MOV AX , DATA … CALL NEAR PTR PROADD … RET
MAIN ENDP
2020/12/10
PROADD PROC NEAR
PUSH AX
PUSH CX
PUSH SI
PUSH DI
LEA SI ,ARY
2020/12/10
ch6
10
安徽理工大学 计算机科学与技术系 李敬兆
《汇编语言》 第6章
DATA SEGMENT ARY DW 100 DUP (?) COUNT DW 100 SUM DW ?
DATA ENDS
CODE SEGMENT
MAIN PROC FAR ASSUME CS:CODE , DS:DATA
2020/12/10
ch6
3
安徽理工大学 计算机科学与技术系 李敬兆
6.1.2 子程序的调用和返回
《汇编语言》 第6章
如果调用程序和过程在同一代码段中,则使用NEAR属性;
MAIN PROC FAR … CALL SUBR1 RET
MAIN ENDP ; SUBR1 PROC NEAR
… RET SUBR1 ENDP