?? 軟件復(fù)位.txt
字號(hào):
C51編程:c語言有什么方法能實(shí)現(xiàn)匯編的ljmp 0000h? [平] [37次] 01-8-23 下午 02:41:55
用goto main;肯定不行。
void main(void) {
start;
;
;
;
goto start;
}
上面這樣行嗎?
拉前點(diǎn),請(qǐng)幫助 [平] [4次] 01-8-23 下午 03:05:48
這樣 [qjh] [71次] 01-8-23 下午 03:13:57
void(*SoftReset)();
……
SoftReset=0;
……
SoftReset)();
再詳細(xì)點(diǎn),我確實(shí)是想軟件復(fù)位 [平] [8次] 01-8-23 下午 03:26:56
嵌入?yún)R編 [邦故] [47次] 01-8-23 下午 03:38:58
#pragma asm
ljmp 0FFF0h;
#pragma endasm
如此如此。 [qjh] [78次] 01-8-23 下午 04:03:00
//這樣聲明
void(*SoftReset)();
//這樣調(diào)用
SoftReset=0;
SoftReset();
有一個(gè)內(nèi)部函數(shù)可以實(shí)現(xiàn)“LJMP”功能。 [Netrue℡] [30次] 01-8-23 下午 04:28:27
我發(fā)現(xiàn)嵌入?yún)R編后編譯很麻煩 [c51guest] [7次] 01-8-23 下午 04:34:51
ok了,謝謝qjh [平] [3次] 01-8-23 下午 04:36:38
一點(diǎn)經(jīng)驗(yàn),請(qǐng)進(jìn): [☆無招☆] [71次] 01-8-23 下午 05:02:11
在C51編程過程中,如果調(diào)用一個(gè)不存在的外部函數(shù),就引起復(fù)位。如下程序,
編譯正常,但執(zhí)行到 test()處即復(fù)位了。我觀察了其匯編代碼,發(fā)現(xiàn)該處的
代碼為 LCALL C:0000.
所以,一方面可利用這種情況實(shí)現(xiàn)軟件復(fù)位;
另一方面要注意如果出現(xiàn)莫名其妙的復(fù)位,可能有一個(gè)原因是調(diào)用了不存在
的外部函數(shù),或者包括外部函數(shù)體的文件包括到主文件中一起編譯。
extern void test(void); //實(shí)際并不存在。
void main()
{
unsigned char i;
test(); //復(fù)位
i++; //無法執(zhí)行到的指令
這算不算是KEIL的一個(gè)BUG,不知其它的C51編譯有無這現(xiàn)象? [☆無招☆] [2次] 01-8-23 下午 05:06:58
也許不算BUG,是KEILC對(duì)指針的保護(hù)機(jī)制? [平] [2次] 01-8-23 下午 05:16:09
有什么麻煩?說來聽聽。嵌入?yún)R編效率好高,特別是循環(huán)。 [exdata] [29次] 01-8-23 下午 05:16:57
有什么麻煩?說來聽聽。嵌入?yún)R編效率好高,特別是循環(huán)。
以下對(duì)比一下:
#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
你說的是混合匯編,嵌入?yún)R編的確有點(diǎn)麻煩,因?yàn)樗荒芫幾g進(jìn)目標(biāo)文件,只能通過 SRC生成臨時(shí)文件。 [☆無招☆] [13次] 01-8-23 下午 05:25:44
不好意思,也許我說的不對(duì),望指教
其實(shí)如果用匯編的思路,用C51也可以做到跟匯編差不多的效果。 [☆無招☆] [6次] 01-8-23 下午 05:33:46
"SRC" !Trounlesome! [exdata] [6次] 01-8-23 下午 05:36:37
嵌入?yún)R編后編譯不麻煩 [邦故] [56次] 01-8-23 下午 05:43:14
設(shè)置該文件生成SRC.Generate Assembler SRC file
再設(shè)置匯編該文件SRC.Assemble SRC file
不必將該文件的SRC文件名TEXT.SRC也加入項(xiàng)目,設(shè)置允許匯編。
如此而已!
但如果不嵌入?yún)R編的話,一個(gè)“編譯按鈕”搞定。 [☆無招☆] [23次] 01-8-23 下午 06:07:16
其實(shí)嵌入?yún)R編主要是以后程序的維護(hù)比較麻煩。算了,我也不知該怎么說。
如何設(shè)置???? [c51guest] [7次] 01-8-23 下午 08:35:23
點(diǎn)擊這里回復(fù)這篇貼子>>
_____________________________________________________________________________
Copyright?,C51BBS論壇 2000-2001
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -