子程序的递归调用和重入

递归调用子程序

如果一个子程序直接调用他自己,这种调用称为字节递归调用,如果一个子程序间接调用自己,这种调用称为间接递归调用

递归调用子程序必须采用寄存器或堆栈传递参数,递归的深度受到堆栈空间的限制

下面的子程序递归调用实现求阶乘


;子程序说明 FACT
;功能,计算N!
;入口参数:(AX) = n
;出口参数:(AX) = n!
;说明采用递归算法实现求阶乘,n不能超过8

FACT PROC
PUSH DX
MOV DX,AX
    CMP AX,0
    JZ DONE
    DEC AX 求n-1
    CALL FACT
    MUL DX
    POP DX
    RET
    DONE:MOV AX,1因为0的阶乘等于1
    POP DX
    RET
    FACT ENDP

可重入子程序

子程序的可重入是指子程序在中断后被重新调用,子程序的重入不同于子程序的递归,冲入是被动行为,而递归是主动行为,重入前的调用和重入调用往往是不相干的,而递归调用这是密切相关

我们把可以重新进入的子程序称为可重入子程序,再设计可重入子程序的时候,必须注意以下几点

【1】不能利用约定的存储单元传递参数

【2】不能使用约定的存储单元保存中间值

可重入函数在以后的设计中会提到,这里只做一般的了解

版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3715520.html

时间: 2024-08-19 14:18:17

子程序的递归调用和重入的相关文章

Signal处理中的函数可重入问题

1. Signal信号简介 信号是软件层次上模拟的中断,它是一种异步通信的处理机制.信号的异步性意味着,应用程序不用等待事件的发生,当信号发生时应用程序自动陷入到对应的信号处理函数中.产生信号的事件对进程而言是随机出现的.信号的响应方式有忽略.捕捉.执行默认动作三种. 2. 线程安全 线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的.使用全局变量的函数是非线程安全的.使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全. 线

线程安全和可重入函数

一.线程安全 1.线程安全函数:C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的. (1)对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量.局部静态变量.分配于堆的变量都是共享的,即是非线程安全的. (2) 在对这些共享变量进行访 问时,如果要保证线程安全,则必须通过加锁的方式. 2.线程安全的:                   如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的.                  

可重入和不可重入

重入一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机.处理器等的中断的时候会发生重入的现象. 一般浮点运算都是由专门的硬件来完成,举个例子假设有个硬件寄存器名字叫做FLOAT,用来计算和存放浮点数的中间运算结果 假设有这么个函数 void fun() { //...这个函数对FLOAT寄存器进行操作 } 假如第一次执行,有个对浮点数操作运算的结果临时存在FLOAT寄存器中,而就在这时被中断了,而中断函数或者另一个进程也调用fun函数,这时第二次调用的fun函数在执行

线程安全与可重入函数的区别与联系

一. 线程安全 前面提到过线程的同步与互斥,也就是当两个线程同时访问到同一个临界资源的时候,如果对临界资源的操作不是原子的就会产生冲突,使得结果并不如最终预期的那样,比如如下的程序: #include <stdio.h> #include <pthread.h> int g_val = 0; void* fun(void *arg) {     int i = 0;     while(i++ < 500)     {            int tmp = g_val;

线程安全和可重入函数的区别与联系

线程安全: 一般来说,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果.就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和 运行的结果是一样的,而且其他的变量的值也和预期的是一样  的, 就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说

线程安全与可重入函数之间的区别与联系

线程安全: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和 运行的结果是一样的,而且其他的变量的值也和预期的是一样  的, 就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题. 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行

可重入锁 公平锁 读写锁

1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这种情况出现在多任务系统当中,在任务执行期间捕捉到信号并对其进行处理时,进程正在执行的指令序列就被信号处理程序临时中断.如果从信号处理程序返回,则继续执行进程断点处的正常指令序列,从重新恢复到断点重新执行的过程中,函数所依赖的环境没有发生改变,就说这个函数是可重入的,反之就是不可重入的.众所周知,在进

linux: 可重入函数与不可重入函数

参考: 1. 摘自 多线程和多进程的区别(小结) http://blog.csdn.net/hairetz/article/details/4281931 要确保函数线程安全,主要需要考虑的是线程之间的共享变量. 属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器. 因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量.局部静态变量.分配于堆的变量都是共享的.在对这些共享变量进行访问时,如果要保证线程安全,则必须通过加锁的方式. 要

函数的可重入性、线程安全函数、异步信号安全函数

重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰.,常见的情况是,程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行的函数foo(),这样便发生了所谓的重入.此时如果foo()能够正确的运行,而且处理完