当前位置:首页 » 编程语言 » c语言怎么写保护现场
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言怎么写保护现场

发布时间: 2022-08-16 10:52:34

⑴ 中断处理中的保护软件现场和恢复软件现场类似于c语言中的哪一部分

中断、异常和系统调用 所谓中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。 中断可分为三类,第一类是由CPU外部引起的,称作中断,如I/O中断、时钟中断、控制台中断等。

⑵ 单片机c语言编程时,中断程序中需设置堆栈指针的值吗 需编程进行保护现场、恢复现场吗

不需要,你也操作不了

⑶ C语言怎么给文件夹写保护

用system("attrib命令");

system("attrib +R abc");
给文件夹设“只允许读”

system("attrib +H abc");
隐藏文件夹

详细见 DOS 帮助, 打命令:
attrib /?

⑷ 怎么用C语言编写“保护现场”的句子

c没必要明确保护现场,编译器会自动处理的
非要这样的话可以在c内嵌入汇编代码,不过这样还存在个问题:你不知道编译器生成的最终代码中使用了那些寄存器,除非你把所有寄存器全压入栈中

⑸ C语言提问

这个问题非常的精妙。我给出一个能够解释的通的答案(不一定正确)。首先需要知道printf是一个函数,而函数的参数入栈的顺序。就是执行的时候,是如何被调用的。
需要学习的知识点:函数调用约定。如果你不知道程序是如何调用printf这个函数的,这个问题你就无法理解。简单的说,在调用函数之前,我们要保留“现场”,因为我们知道,程序执行的时候,是要“进入”函数中去的,等函数执行完了,回到原来的执行的地方,继续向下。
这个过程,C语言是从右向左压参数的。
还有一个问题,就是i++,++i的区别。在函数调用时,i++先入栈,后自增计算。++i是先自增计算,后入栈。

现在有了这些知识点,我们来理解这个程序:

计算机申请了一块内存,名字是i, 是int型的,里面的值是 8.

现在,调用了一个函数,这个函数有很多参数,其中有六个参数是我们要打印的,每个参数就是一块内存。它们没有名字,不像i。我们暂时就叫他们一二三四五六

从右向左, 我们开始把i内存中的值 转移 到 一二三四五六 中。转移的过程中,只有自增自减是影响i这块内存中的值,而其他计算是只影响这个计算目标内存的值。i++的目标内存就是i。

在处理之前,先运算一二的自增自减,所以i的值不变,是8.

分析六: -i--,这个计算的目标内存是六,所以六中的值是-8,然后i中进行自减,此时i这块内存的值变为7.
分析五: -i++, 五这块内存中的就是-7,而i这快内存中又变成了8.
分析四: 四中 是8, i又变成了 7
分析三: 三自然是7 ,然后i++,i这块内存中又变成了8.
一和二 自然都是8了,因为 自增自减 早就运算完了。
---------------------------------------------------------------
这个就是一个解释,我瞎猜测的,不一定这样,要真知道,你要去看看汇编以后的代码。

最麻烦的就是一直用i这块内存,所以写代码的时候还是要注意啊

-----------------------------------------------------------------
函数调用约定(Calling Convention)
函数调用约定不仅决定了发生函数调用时函数参数的入栈顺序,还决定了是由调用者函数还是被调用函数负责清除栈中的参数,还原堆栈。函数调用约定有很多方 式,除了常见的__cdecl,__fastcall和__stdcall之外,C++的编译器还支持thiscall方式,不少C/C++编译器还支持 naked call方式。这么多函数调用约定常常令许多程序员很迷惑,到底它们是怎么回事,都是在什么情况下使用呢?下面就分别介绍这几种函数调用约定。

1.__cdecl

编译器的命令行参数是/Gd。__cdecl方式是C/C++编译器默认的函数调用约定,所有非C++成员函数和那些没有用__stdcall或__fastcall声明的函数都默认是__cdecl方式,它使用C函数调用方式,函数参数按照从右向左的顺序入栈,函数调用者负责清除栈中的参数, 由于每次函数调用都要由编译器产生清除(还原)堆栈的代码,所以使用__cdecl方式编译的程序比使用__stdcall方式编译的程序要大很多,但是 __cdecl调用方式是由函数调用者负责清除栈中的函数参数,所以这种方式支持可变参数,比如printf和windows的API wsprintf就是__cdecl调用方式。对于C函数,__cdecl方式的名字修饰约定是在函数名称前添加一个下划线;

⑹ 单片机C语言中断后保存现场吗

C语言不用管现场。。自动保存的。进出中断,就跟调用一个函数一样。只不过一个是被动,一个是主动。

⑺ 51单片机现场保护参与哪些运算指令(c语言)的数据

对于C语言编程通常是不需要考虑现场保护的,因为系统在编译代码时会为你自动处理好的,你可以编译一段含有中断的程序,再打开反汇编窗口看看,Keil C的代码效率还是很高的,可以说不会比你用汇编写的程序更浪费空间。

⑻ 请教单片机高人:怎么用C编写中断,汇编中可以有ORG 000BH来确定是T0中断,那C怎么办还有现场保护怎办

C51中断函数格式
Keil C51编译器中断函数语法定义如下:
(C语言不用处理现场保护了) interrupt n <----这个是重点
void 函数名() interrupt n
{

}
//定时器T0中断
void 函数名() interrupt 1
{

}

C51编译器允许0~31个中断,下列中断及其相关地址为8051控制器所提供的中断:
0:EXTERNAL 0 地址:0003H
1:TIMER/COUNTER 0 地址:000BH
2:EXTERNAL 1 地址:0013H
3:TIMER/COUNTER 1 地址:001BH
4:SERIAL PORT 地址:0023H
编写中断函数时应遵循下列规则:
·不能进行参数传递。如果中断过程包括任何参数声明,则编译器将产生一个错误信息。
·无返回值。如果想定义一个返回值将产生错误,但是,如果返回整型值,编译器将不产生
错误信息,因为整型值是默认值,编译器不能清楚识别。
·在任何情况下,不能直接调用中断函数,否则编译器会产生错误。由于退出中断过程是由
指令RETI完成的,该指令影响MCS-51单片机的硬件中断系统,直接调用中断函数时,硬件
上没有中断请求存在,因而这个指令的结果是不定的,并且通常是致命的。
·编译器从绝对地址8n+3处产生一个中断向量,其中n为中断号,该向量包括一个中断过
程的跳转,向量的产生可由编译器控制指令NOINTVECTOR压缩,因而程序员可以从独立的汇
编模块中提供中断向量。
·可以在中断函数定义中使用using指定当前使用的寄存器组。格式如下:
void 函数名([形式参数])interrupt n [using m]
MCS-51单片机有四组寄存器R0~R7,程序具体使用哪一组寄存器由程序状态字PSW中
的两位RS1和RS0来确定。在中断函数定义时,可以用using指定该函数具体使用哪一组寄
存器,m在0,1,2,3这4个数中取值,对应四组寄存器组。例如:
void delay() interrupt 3 using 2
·在中断函数中调用的函数所使用的寄存器组必须与中断函数相同。当没有使用using指令
时,编译器会选择一个寄存器组作为绝对寄存器访问。程序员必须保证按要求使用相应寄存
器组,C编译器不会对此检查。
·如果在中断函数中执行浮点运算,必须保存浮点寄存器状态,当没有其他程序执行浮点运
算时,可以不保存。

⑼ 在C语言中的函数调用过程中保留现场怎么回事

保留现场
就是字面的意思,保留现场
比如,你要到某地去,走在路上时,看到路边有个屋子,你想去看一下,但是又怕迷路了,那么只好记住你现在所在的位置(也就是保留现场)。然后到屋子参观一番后,离开屋子时,只要返回到之前所记的位置就行了。
函数调用时,具体要保留那些数据呢,一般来说不同编译器不同的调用方法要保留的数据都会不同。那些寄存器的值一般都会保留的,保留的数据一般是放在程序的堆栈中。
其实函数的返回也就是恢复现场