⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 软件复位.txt

📁 c51源程序总结
💻 TXT
字号:
C51编程:c语言有什么方法能实现汇编的ljmp 0000h? [平] [37次] 01-8-23 下午 02:41:55
用goto main;肯定不行。
void main(void)  {
start;
;
;
;
goto start;
}
上面这样行吗? 

拉前点,请帮助 [平] [4次] 01-8-23 下午 03:05:48 

这样 [qjh] [71次] 01-8-23 下午 03:13:57 
void(*SoftReset)();
……
SoftReset=0;
……
SoftReset)(); 

再详细点,我确实是想软件复位 [平] [8次] 01-8-23 下午 03:26:56 

嵌入汇编 [邦故] [47次] 01-8-23 下午 03:38:58 
#pragma asm
    ljmp 0FFF0h;
#pragma endasm


如此如此。 [qjh] [78次] 01-8-23 下午 04:03:00 
//这样声明
void(*SoftReset)();
//这样调用
SoftReset=0;
SoftReset();


有一个内部函数可以实现“LJMP”功能。 [Netrue℡] [30次] 01-8-23 下午 04:28:27 

我发现嵌入汇编后编译很麻烦 [c51guest] [7次] 01-8-23 下午 04:34:51 

ok了,谢谢qjh [平] [3次] 01-8-23 下午 04:36:38 

一点经验,请进: [☆无招☆] [71次] 01-8-23 下午 05:02:11 
在C51编程过程中,如果调用一个不存在的外部函数,就引起复位。如下程序,
编译正常,但执行到 test()处即复位了。我观察了其汇编代码,发现该处的
代码为 LCALL  C:0000. 
所以,一方面可利用这种情况实现软件复位;
另一方面要注意如果出现莫名其妙的复位,可能有一个原因是调用了不存在
的外部函数,或者包括外部函数体的文件包括到主文件中一起编译。

extern void test(void);   //实际并不存在。
void main()
{
    unsigned char i;

     test();        //复位
    i++;           //无法执行到的指令
}


这算不算是KEIL的一个BUG,不知其它的C51编译有无这现象? [☆无招☆] [2次] 01-8-23 下午 05:06:58 

也许不算BUG,是KEILC对指针的保护机制? [平] [2次] 01-8-23 下午 05:16:09 

有什么麻烦?说来听听。嵌入汇编效率好高,特别是循环。 [exdata] [29次] 01-8-23 下午 05:16:57 
有什么麻烦?说来听听。嵌入汇编效率好高,特别是循环。
以下对比一下:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>

#define PORT XBYTE[0x1234]
sbit P1_2=P1^2;

void toport(unsigned char *pp); //汇编写的
main()
{
    unsigned char i,j;
    unsigned char buf[20],*p;    
    p=buf;
    i=23;                
    i=34;
    for(i=0;i<20;i++)    //427us @12MHz franklin C3.2    
    {    PORT=buf[i];    //302us @12MHz Keil C6.12    
        P1_2=0;
        _nop_();
        _nop_();
        _nop_();
        P1_2=1;
    }
    
    _nop_();
    
    toport(buf);    //190us @12MHz == for()
    _nop_();
    
}
……
……
RSEG ?PR?TOPORT?SPRASM
_TOPORT:MOV R5,#20
    MOV DPTR,#1234
L:    MOV A,@R1    
    MOVX @DPTR,A
    CLR P1.2
    NOP
    NOP        ;
    INC R1
    SETB P1.2
    DJNZ R5,L
    RET
END


谢谢分享! [exdata] [1次] 01-8-23 下午 05:19:00 

你说的是混合汇编,嵌入汇编的确有点麻烦,因为它不能编译进目标文件,只能通过 SRC生成临时文件。 [☆无招☆] [13次] 01-8-23 下午 05:25:44 
不好意思,也许我说的不对,望指教



其实如果用汇编的思路,用C51也可以做到跟汇编差不多的效果。 [☆无招☆] [6次] 01-8-23 下午 05:33:46 

"SRC" !Trounlesome! [exdata] [6次] 01-8-23 下午 05:36:37 

嵌入汇编后编译不麻烦 [邦故] [56次] 01-8-23 下午 05:43:14 
设置该文件生成SRC.Generate Assembler SRC file 
再设置汇编该文件SRC.Assemble SRC file 
不必将该文件的SRC文件名TEXT.SRC也加入项目,设置允许汇编。
如此而已!



但如果不嵌入汇编的话,一个“编译按钮”搞定。 [☆无招☆] [23次] 01-8-23 下午 06:07:16 
其实嵌入汇编主要是以后程序的维护比较麻烦。算了,我也不知该怎么说。 

如何设置???? [c51guest] [7次] 01-8-23 下午 08:35:23 

 
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -