汇编语言-子程序

合集下载

汇编语言子程序设计实验心得总结 汇编语言程序设计实验心得体会汇总

汇编语言子程序设计实验心得总结 汇编语言程序设计实验心得体会汇总

汇编语言子程序设计实验心得总结汇编语言程序设计实验心得体会汇总心得体会是指一种读书、理论后所写的感受性文字。

那么我们写心得体会要注意的内容有什么呢?接下来我就给大家介绍一下如何才能写好一篇心得体会吧,我们一起来看一看吧。

汇编语言子程序设计实验心得总结汇编语言程序设计实验心得体会篇一做了两周的课程设计,有很多的心得体会,更多的是同学之间的合作精神,这道课程设计花了我们一到两周的时间,几人合作,老师的帮助才完成。

我第一次完成这么完美的杰作,心理有一份别样的滋味,在设计过程中,我付出了很多,也懂得了只有付出才有回报。

在这次设计中,我遇到了很多困难,但我没有向困难低头,通过查询资料,虚心向同学、老师请教,才一一得到理解决。

我发现平时学的太少了,在今后我要把老师在课堂讲的弄懂,弄透,在此根底上利用课余时间多看课外书籍,拓宽知识面。

在设计过程中,合作精神必不可少。

单凭一个人的力量是不能完成的,毕竟一个人学的很有限。

每个人掌握的不同。

我相信:态度决定一切,只有努力才有收获。

第二天我就着手画计数器图形,虽然有些人图形已画好,可我没有着急,毕竟别人花的时间比我多,为了使图形美观我不断运行、调试,直到自己满意为止。

接下来是星期五,说实话那天蛮难熬的,一天都泡在机房。

眼睛有点吃不消,可没有方法,将来我们就靠计算机吃饭,再苦再累也要坚持。

在已编好的程序上又加了一点精华,怎样使字符闪烁,这也是我们几个人互相讨论的结果。

第二周,通过周末到网上查的资料,和参考资料又参加计数器的灵魂算法。

接下来几天再将程序不断完善、加工,计数器程序初露头角。

小结:程序设计过程有如解决一实际问题,从解决实际问题的角度,我们可以这样来看:要理解这个问题的根本要求,即输入、输出、完成从输入到输出的要求是什么;从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的变量、数组、函数,确定处理过程--算法。

“汇编语言与微机原理”课程教学中汇编子程序实验设计

“汇编语言与微机原理”课程教学中汇编子程序实验设计

5 8 ・
Co mp u t e r Er a No. 2 2 01 3
“ 汇 编语言与 微机原理’ ’ 课 程教学中 汇编子 程序实 验设计
赵 永标 。张 其林 ,詹 彬 ,康长 青
( 湖北文理学院数学与计算机科学学院,湖北 襄阳 4 4 1 0 5 3 )
摘 要 :“ 汇编语 言与微 机原理” 是 计算机科 学与技术 专业 的必修基 础课 程。在教 学中汇编语 言子程序 实验设计普遍存
关键词 :汇编语言 ;子程序 ;宏 ;中断 ;实验设计 中图分类号 : G6 4 2 文献标志码 : B 文章 编号 : 1 0 0 6 — 8 2 2 8 ( 2 0 1 3 ) 0 2 — 5 8 — 0 2
Ex p e r i me n t a l d e s i g n o f a s s e mb l y s u b — r o u t i n e s i n “ a s s e mb l y l a n g u a g e a n d mi c r o c o mp u t e r p r i n c i p l e ’ ’
Z h a o Y o n g b i a o ,Z h a n g Qi l i n ,Z h a n Bi n ,Ka n g C h a n g q i n g
( S c h o o l o f M a t h e m a t i c s a n d C o m p u t e r S c i e n c e , H u b e i U n i v e r s i t y f o A r t a n d S c i e n c e , X i a n g y a n g , H u b e i 4 4 1 0 5 3 ,C h i n a )

汇编语言——子程序

汇编语言——子程序

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

汇编语言之子程序

汇编语言之子程序

汇编语言之子程序汇编语言是一种底层编程语言,是计算机指令的集合表示形式。

在汇编语言中,子程序是一段独立的、可重复使用的代码片段,可以在程序中被多次调用。

子程序可以帮助我们实现代码的模块化,提高代码的可读性和可维护性。

本文将介绍如何在汇编语言中使用子程序以及其工作原理。

一、子程序的定义和使用在汇编语言中,子程序由一系列指令组成,这些指令可以完成特定的功能。

子程序可以通过call指令被调用,执行完子程序后会返回到调用子程序的指令处,继续执行程序的下一条指令。

在使用子程序前,我们需要先定义子程序。

定义子程序的语法如下:```subroutine_name:; 子程序代码ret```其中,subroutine_name是子程序的名称,可以根据实际需求自定义。

ret指令用于返回到调用子程序的指令处,继续执行程序的下一条指令。

调用子程序的语法如下:```call subroutine_name```其中,subroutine_name是要调用的子程序的名称。

二、传递参数和返回值子程序可以接收参数,并且可以有返回值。

在调用子程序时,可以通过寄存器或栈来传递参数。

在子程序内部,可以通过相应的寄存器或栈地址来获取参数的值。

例如,我们定义一个计算两个数之和的子程序add:```add:mov ax, [bp+4] ; 获取第一个参数的值add ax, [bp+6] ; 获取第二个参数的值ret```在主程序中调用add子程序:```mov ax, 5 ; 第一个参数mov bx, 10 ; 第二个参数call add ; 调用add子程序; 此时ax寄存器中的值为15,即5+10的结果```在子程序add中,我们通过寻址方式获取传递的参数,并将计算结果存入ax寄存器中,供主程序使用。

三、保存和恢复寄存器在汇编语言中,调用子程序时需要保存和恢复寄存器的值,以保证程序的正确执行。

在调用子程序前,我们可以使用push指令将需要保存的寄存器值压栈,然后在子程序的开头使用相应的pop指令将值弹出并恢复。

汇编语言程序设计实例

汇编语言程序设计实例

汇编语言程序设计实例汇编语言是一种非常底层的编程语言,它允许程序员直接与计算机硬件进行交互。

汇编语言程序设计通常用于需要高性能或者对硬件有特定需求的场合。

以下是一些汇编语言程序设计的实例,以帮助理解其基本结构和应用。

实例一:数据传输在汇编语言中,数据传输是最基本的操作之一。

以下是一个简单的数据传输程序实例,它将一个立即数(即直接给出的数值)移动到寄存器中:```assemblymov ax, 1234h ; 将十六进制数1234h移动到ax寄存器```实例二:算术运算汇编语言支持基本的算术运算,如加法、减法、乘法和除法。

以下是一个进行加法运算的例子:```assemblymov ax, 5 ; 将数值5移动到ax寄存器add ax, 3 ; 将数值3加到ax寄存器中```实例三:条件跳转条件跳转是控制程序流程的重要手段。

以下是一个基于条件跳转的简单程序,它检查ax寄存器的值是否为0,并根据结果跳转到不同的代码段:```assemblymov ax, 0 ; 将数值0移动到ax寄存器jz zero ; 如果ax为0,则跳转到标签zero; 继续执行其他代码...zero:; 如果ax为0,执行这里的代码```实例四:循环结构循环结构在汇编语言中实现起来较为复杂,但可以通过重复使用跳转指令来模拟。

以下是一个简单的循环结构实例,它将ax寄存器的值减1,直到值为0:```assemblystart_loop:dec ax ; 将ax寄存器的值减1jnz start_loop ; 如果ax不为0,跳回start_loop```实例五:字符串处理汇编语言程序设计中,字符串处理是一个常见的任务。

以下是一个将字符串从源地址复制到目标地址的程序:```assemblymov si, source ; 将源字符串的地址移动到si寄存器mov di, dest ; 将目标地址移动到di寄存器mov cx, length ; 将字符串的长度移动到cx寄存器copy_loop:movsb ; 从si复制一个字节到diloop copy_loop ; 减少cx的值并重复循环直到cx为0```实例六:子程序调用在汇编语言中,子程序是一种将代码封装成模块化单元的方法。

1200子程序调用指令

1200子程序调用指令

1200子程序调用指令以1200子程序调用指令为标题,写一篇文章在计算机编程中,子程序是一段独立的代码,可以被主程序调用。

通过使用子程序,我们可以将复杂的任务分解成一系列较小的任务,使程序更加可读、易于维护。

而1200子程序调用指令是一种特定的指令,用于在汇编语言中调用子程序。

本文将介绍1200子程序调用指令的使用方法和注意事项。

我们需要了解如何定义和使用子程序。

在汇编语言中,子程序通常以一段标签标识,并且可以接受参数和返回结果。

在定义子程序时,我们需要使用一些特定的指令来保存寄存器的值,并在子程序结束后恢复这些值。

这样可以确保在子程序调用完成后,程序的状态与调用前保持一致。

在使用1200子程序调用指令之前,我们需要将子程序的地址存储在一个特定的寄存器中。

在调用子程序时,我们可以使用1200子程序调用指令来跳转到存储在寄存器中的地址,并将控制权交给子程序。

子程序执行完成后,会返回到调用指令的下一条指令继续执行。

在进行子程序调用时,我们需要注意一些事项。

首先,在调用子程序之前,我们需要将参数传递给子程序。

这可以通过将参数存储在寄存器或内存中来实现。

在子程序内部,我们可以使用这些参数进行计算或其他操作。

在子程序返回时,我们可以将结果存储在寄存器或内存中,供主程序使用。

我们需要注意子程序调用的返回地址。

在1200子程序调用指令中,返回地址是自动保存在栈中的。

这意味着在子程序内部,我们可以自由地使用栈来保存其他临时数据,而不会破坏返回地址。

在子程序返回时,通过使用返回指令,将栈中保存的返回地址弹出,程序会跳转到返回地址所指向的位置。

我们还需要注意子程序的参数传递和返回结果的存储。

在使用1200子程序调用指令时,通常使用寄存器来传递参数和存储返回结果。

这是因为寄存器的访问速度比内存更快,可以提高程序的执行效率。

但是需要注意的是,在调用子程序之前,我们需要保存寄存器中的值,并在子程序返回后恢复这些值,以防止数据丢失或错误。

浅谈汇编语言中子程序的设计

浅谈汇编语言中子程序的设计
教材新探
r 。+ ”+ +
“+ + ” + + ‘+ + “+ “+ 。
。+ ’+ + ’
‘ ’ +
“+ ’+ ’
“+

浅谈汇编 中子 语言
■+ . . . .+ ” + . + 一 + . . + 一 + . . + - + 一 + + 一 + ” + 一 + ・ ・ 一 + + 一 + ・ ・

是 否按 “ 进 先 出” 后 的原 则 组 织 的 。 () 2堆栈保 护。子程 序是利用调用 C I AL 指令 和返 回 R T 指令来 实现正确 的调用 和返 回 的。因 E
为C Au 命令执 行 时压 入堆栈 的断 点地 址就 是供 子程序返 回主程序 时的地址 , 编程 时一定 要注 意子
程 序 的类 型 属 性 , 是 段 内 调 用 还 是 段 间 调 用 。段 即 内调 用 和 返 回为 N A 属 性 , 问 调 用 和 返 回 为 E R 段 F R 属性 。8 8 / 0 8的 汇编 程 序用 子 程序 定 义 A 0 68 8 P ( 的 类 型 属 性 来 确 定 C L和 R T 指令 的 属 R) C AL E 性 。如 果 所 定 义 的 子 程 序 是 F AR 属 性 , 么 对 它 那 的调用和返 回一定都是 F R A 属性 ; 如果所定义的子 程 序 是 NE R A 属性 , 么 对 它 的 调 用 和 返 回 也 一 定 那 是 NE R A 属 性 。这 样 用 户 只 是 在 定 义 子 程 序 时 考 虑它的属性 , C I 而 AL 和 R T指 令 的 属 性 就 可 以 E 由 汇 编 程 序 来 确 定 了 。另 外 , 入 子 程 序 后 再 使 用 进 堆 栈 时 也 必 须 保 证 压 人 和 弹 出 字 节 数 一 致 , 果 在 如 这 里 堆 栈 存 取 出错 , 然 会 导 致 返 回地 址 的 错 误 。 必 2 参 数传 递 . 主程序在调用子程序 时 , 经常要 向子程 序传递 些参数或控 制信息 , 子程序执行后 , 也常需要把运 行的结果返 回调用程序 。这种信息传递称 为参数传 递, 其常用 的方 法有 寄存 器传 递 、 内存 固定单 元传 递 、 栈传递 。 堆 ( ) 存 器 传 递 。 由 主 程 序 将 要 传 递 的参 数 装 1寄 入事先 约定 的寄存 器 中, 转入子 程序后 再取 出进行 处 理 , 种 方 法 受 C U 内 部 寄 存 器 数 量 限 制 , 此 这 P 因 只适 于传 递 少 量 参 数 的 场 合 , 一 些 常 见 的 软 件 延 如 时子程序 , 均是利用某寄存器传递循环计数 器初值 。 ( ) 过 内存 固 定 单 元 的 传 递 。此 方 法 适 于 大 2通 量传递参数时使用 , 它是在 内存 中开辟特 定 的一片 区域用于传递参数 。主程序和子程序都按事先约定 在指定 的存储单元 中进行数据 交换 , 这种 方法要 占

汇编子程序设计阶乘

汇编子程序设计阶乘

汇编子程序设计阶乘汇编语言是一种底层的程序语言,用于编写机器指令的程序。

子程序设计是汇编语言的一个重要概念,用于将程序模块化以便重复使用。

阶乘是一个经典的数学问题,定义为对于正整数n,阶乘的值表示为n!,等于从1到n的所有正整数相乘的结果。

例如,5!=5×4×3×2×1=120。

在汇编语言中,实现阶乘可以通过递归或迭代的方式完成。

下面我们将详细讨论这两种方法。

一、递归方式实现阶乘:递归方式是一种将问题分解为更小规模的子问题的编程技术。

在实现阶乘时,可以通过递归方式计算出n-1的阶乘,然后将结果与n相乘得到n。

以下是使用递归方式实现阶乘的汇编代码示例:```assemblysection .dataresult db 1section .textglobal _start_start:mov eax, 5call factorialmov [result], eax;此处可添加输出结果的代码mov eax, 1int 0x80factorial:push ebpmov ebp, espmov eax, [ebp+8] ; 读取传入的参数n cmp eax, 1jle end_factorialdec eaxpush eaxcall factorialpop eaximul eax, [ebp+8] ; 计算阶乘结果end_factorial:mov esp, ebppop ebpret```以上代码中,_start是程序的入口点。

我们传入参数5给阶乘的子程序,然后将结果存储在result变量中。

请注意,在第一个call指令后,我们将使用eax寄存器存储结果。

factorial是计算阶乘的子程序。

我们通过比较n是否小于等于1来确定是否终止递归。

如果n大于1,则我们将n减1,并将其压入栈中作为下一次递归的参数。

然后,我们通过调用相同的子程序计算n-1的阶乘结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

随着指令的丰富、子程序的引入,汇编语言的表达也越来越灵 活。为了方便地组织数据,引入了结构伪操作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
POP DS POP BP RET STRLEN ENDP
主程序调用这个子程序的代码片段如下: MOV AX , SEG STR PUSH AX MOV AX , OFFSET STR PUSH AX CALL STRLEN MOV LEN , AX
当然,除了上面提及的3种方式外, 如果过程和调用程序在同一文件(同 一程序块中,则过程可直接访问模块 中的变量。
本章学习要点: (1)子程序的编写格式 (2)子程序调用时的参数传递方法 (3)嵌套及递归子程序 一、过程定义语句(process) 利用过程定义伪指令语句,可把程序片段说明为具有 近类型或远类型的过程,并且能给过程取一个名字。 过程定于语句的格式如下: 过程名 PROC [NEAR | FAR] … 过程名 ENDP 过程的类型在过程定义开始语句PROC中指定; 过程可以被指定位近(NEAR)类型,也可以被指定为 远类型。如果不指定,则通常默认为近类型; 定义一个过程的开始语句PROC和结束语句ENDP前 使用的过程名称必须一致,从而保持配对。
MADD PROC PUSH AX ;为什么会把AX,CX,SI压入栈? PUSH CX PUSH SI MOV CX , 2 XOR SI , SI ;CF也会被清0 MADD1:MOV AX , WORD PTR DATA1[SI] ADC AX , WORD PTR DATA2[SI] MOV WORD PTR DATA3[SI] , AX INC SI INC SI POP SI LOOP MADD1 POP CX MOV AL , 0 POP AX ADC AL , 0 RET MOV BYTE PTR [DATA3 + 4] , AL MADD ENDP
例:写一个大写字母转换为小写字母的子程序 ;子程序名:UPTOLW ;功能:大写字母转换为小写字母 ;入口参数:AL=字符的ASCII码 ;出口参数:AL=字符的ASCII码 ;说明:如字符为大写字母,则转换为小写,其它字符不变。 UPTOLW PROC PUSHF ;保护各标志 CMP AL , „A‟ JB UPTOLW1 CMP AL , „Z‟ JA UPTOLW1 ADD AL , 20H UPTOLW1:POPF ;恢复各标志 RET UPTOLW ENDP
例:通过结构类型,在主程序和子程序中传输信息。
三、嵌套与递归子程序 一个子程序可以作为调用程序去调用另外一个子程序,这种情 况称为子程序的嵌套。 嵌套的层数称为嵌套深度。
深度为2的嵌套
如果一个子程序直接调用它自身,这种调用称为(直接)递归 调用。 具有递归调用的子程序就称为递归子程序。 递归是嵌套的特殊情况。
CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE , DS:DSEG, SS:STACK START: PUSH DS SUB AX , AX PUSH AX MOV AX , DSEG MOV DS , AX MOV CX , 10 CALL COUNT ;调用COUNT子程序进行统计 ;可在此处添加显示输出 RET MAIN ENDP 注意:红色部分在这里构成一种固定搭配,把主程序看成DOS 调用的远过程,RET与前2个PUSH配对,相当于: MOV AH , 4CH INT 21H
四、综合示例 有10个学生的成绩分别为76、69……80。编制一个子程序分 别统计60~69分,70~79分,80~89分,90~99分及100分的人 数,分别存放到S6,S7,S8,S9,S10单元中。 DSEG SEGMENT REC DW 76, 69,63,83,92,73,65,100,99,80 S6 DW 0 S7 DW 0 S8 DW 0 S9 DW 0 S10 DW 0 DSEG ENDS STACK SEGMENT DW 64 DUP (?) STACK ENDS
例:用程序调用的方法,完成一个把16位二进制数转换为4位 十六进制ASCII码的转换程序。 子程序说明:入口参数:DX=欲转换的二进制数; DS:BX=存放转换所得ASCII码串的缓冲区首地址,转换后的 ASCII码串按照高位到低位的次序存放在指定的缓冲区中。 HTASCS PROC RET MOV CX , 4 HTASCS ENDP HTASCS1: ROL DX , 1 HTOASC PROC NEAR ROL DX , 1 AND AL , 0FH ROL DX , 1 ADD AL , 30H ROL DX , 1 CMP AL , 39H MOV AL , DL JBE HTOASC1 CALL HTOASC ADD AL , 7 MOV [BX] , AL HTOASC1: RET INC BX HTOASC ENDP LOOP HTASCS1
像普通标号一样,过程名具有段值、偏移和类型这三个属性。 过程名的段值和偏移是对应过程入口(过程定义开始伪指令语 句后的指令语句)的段值和偏移。 例:下面程序片段运行后,AL=?,BL=?。 XOR AL , AL CALL SUBS MOV BL , AL CALL SUBS RCR AL , 1 HLT ;停机,halt SUBS PROC NEAR NOT AL JS NEXT STC ;CF=1, SeT Cf = 1 NEXT : RET SUBS ENDP
递归子程序的设计要点: (1)递推性:逐级调用; (2)回归性:逐层回归; (3)有穷性:终止条件; 这3点为所有语言递归程序设计具有的共性。 汇编语言设计递归程序时的个性在于: (1)参数和中间结果一般存于堆栈中,但有时也可以存于寄 存器中; (2)递归的深度受堆栈空间的限制。
例:子程序FACT采用递归算法实现阶乘。 ;子程序名:FACT ;功能:计算n! ;入口参数: (AX)= n ;出口参数: (AX)= n! ;说明: (1)采用递归算法实现阶乘; ; (2)n 不能超过8 FACT(n) = n * FACT(n - 1) = n * [ (n - 1) * FACT(n- 2)]… 当n=0时,FACT(0) = 1. 要点: (1)递推:只要n不为0,即推进到FACT(n-1); (2)有穷:n=0时有确切解,即FACT(0)=1 (3)回归:逐层返回——FACT(n-1)的解和n(保存的中间参数)
FACT PROC PUSH DX ;保存中间参数(最外层为原有参数) MOV DX , AX CMP AX , 0 ;判断n是否为0? JZ DONE ;如是,则终止推进。(有穷) DEC AX ;否则,继续推进 CALL FACT ;推进 MUL DX ;中间结果后逐层返回: n * FACT(n-1) POP DX ;得到中间参数(最外层为原有参数) RET DONE: MOV AX , 1 ;给出确定结果 0! = 1 POP DX ;得到中间参数 RET FACT ENDP
二、主程序与子程序间的参数传递 主程序在调用子程序时,往往要向子程序传递一些参数;同样 地,子程序运行后夜经常要把一些结果传会给主程序。主程序 和子程序之间的这种信息传递称为参数传递。 有多种参数传递的方法: (1)寄存器传递法 (2)约定内存单元传递法 (3)堆栈传递法 (4)其它方法 1.利用寄存器传递参数 利用寄存器传递参数就是把参数放在约定的寄存器中。这种方 法适用于传递参数较少的情况。
STRLEN PROC PUSH BP MOV BP , SP PUSH DS PUSH SI MOV DS , [BP + 6] MOV SI , [BP + 4] MOV AL , 0 STRLEN1 : CMP AL , [SI] JZ STRLEN2 INC SI JMP STRLEN1 STRLEN2: MOV AX , SI SUB AX , [BP + 4] POP SI
2.利用约定存储单元传递参数 在传递参数较多的情况下,可利用约定的内存变量来传递参数。 例:写一个实现32位数相加的子程序 ;子程序名:MADD ;功能:32位数相加 ;入口参数:DATA1和DATA2缓冲区中分别存放要相加的数 ;出口参数:DATA3缓冲区存放结果 ;说明: ;(1)32位数据的存放次序采用“高高低低”原则 ;(2)可能产生的进位放在DATA3开始的第5字节中
相关文档
最新文档