1. arm處理器在進入main函數之前都幹些什麼事情我的arm在執行主函數前盡然延時16秒。請教如何減少這個時間
1.一般都進行一些配置工作,但肯定不會這么久,確定是不是跑進中斷中了,有可能的話試試單步調試跟蹤一下。
2,硬體問題,硬體不穩定造成程序飛掉。
建議你從單步調試做起。
2. main函數執行以前還會執行什麼代碼
C++中,全局對象的構造函數會在main 函數之前執行。
在大多數的實現方式里,核心會運行專門的啟動代碼,啟動代碼會在啟動main()之前完成所有的初始化工作,這其中當然包括了全局對象的初始化。
這個所謂的啟動代碼就是Runtime函數庫的Startup代碼。
(2)main方法執行之前發生了什麼擴展閱讀:
簡介
程序執行總是從main函數開始,如果有有其他函數,則完成對其他函數的調用後再返回到主函數,最後由main函數結束整個程序。
在執行程序時,由系統調用main函數,main 函數是在程序啟動中完成對具有靜態存儲期的非局部對象的初始化之後被調用的,main函數是程序在有宿主 (hosted)環境(亦即有操作系統)中所指定的入口點。
3. C語言中在main函數之前會執行什麼
C語言執行本程序主函數始,本程序主函數結束 其餘函數都調用程,至於文件類預編譯命令既叫預編譯編譯前完預編譯指令指示程序式編譯前由編譯器進行操作放程序任何位置。
4. c語言中在main函數之前會執行什麼
main函數之前--真正的函數執行入口或開始
一種解釋
實際上,在可執行文件被載入之後,控制權立即交給由編譯器插入的Start函數,它將對後面這些全局變數進行准備:
_osver 操作系統的構件編號
_winmajor操作系統的主版本號
_winminor操作系統的次版本號
_winver操作系統完全版本號
__argc命令行參數個數
__argv指向參數字元串的指針數組
_environ指向環境變數字元串的指針數組
Start函數初始化堆並調用main函數.mian函數返回之後,Start函數調用Exit函數結束該進程.
啟動函數Start的源代碼在:
crt0.c Microsoft Visual C++
c0w.asm Borladn C++
5. C++程序進入main函數之前,退出main函數之後會做些什麼
我們看下面的例子:
/* file name test00.c */
int main(int argc, char* argv)
{
return 0;
}
編譯鏈接它:
cc test00.c -o test.exe
會生成 test.exe
但是我們加上這個選項: -nostdlib (不鏈接標准庫)
cc test00.c -nostdlib -o test.exe
鏈接器會報錯:
undefined symbol: __start
也就是說:
1. 編譯器預設是找 __start 符號,而不是 main
2. __start 這個符號是程序的起始點
3. main 是被標准庫調用的一個符號
通常,我們會在編譯器的環境中找到一個名字類似於 crt0.o 的文件,這個文件中包含了我們剛才所說的 __start 符號。
那麼真正的 crt0.s 是什麼樣子呢?下面我們給出部分偽代碼:
///////////////////////////////////////////////////////
section .text:
__start:
:
init stack;
init heap;
open stdin;
open stdout;
open stderr;
:
push argv;
push argc;
call _main; (調用 main)
:
destory heap;
close stdin;
close stdout;
close stderr;
:
call __exit;
////////////////////////////////////////////////////
總結:
main函數執行之前,主要就是初始化系統相關資源:
1.設置棧指針
2.初始化static靜態和global全局變數,即data段的內容
3.將未初始化部分的賦初值:數值型short,int,long等為0,bool為FALSE,指針為NULL,等等,即.bss段的內容
4.運行全局構造器,估計是C++中構造函數之類的吧
5.將main函數的參數,argc,argv等傳遞給main函數,然後才真正運行main函數
main 函數之後會執行相反的工作。
6. 帶main函數的類的初始化及main執行的順序。
main方法是一個特殊的方法,在程序開始運行時,系統會找到main方法所在的那個class文件,然後把main方法的代碼裝入內存,從main的第一條語句開始執行,直到main的最後一條語句結束。至於main所在的類不用管它,它在main裝入內存時不起作用的,只有創建這個類的對象時才起作用,也就是使用new的時候。在new一個類的對象時這個類的構造方法被調用,對成員變數初始化,分配內存,而此時類的成員方法,它不需要初始化,只有調用它時才分配內存,當方法執行完畢後內存立即釋放。
如果還不明白可以加QQ聊聊,
7. 在典型的系統,比如win32,在調用C的main之前發生了什麼事情,另外有時候main函數是
main函數代表進程的主線程。程序開始執行時,系統為程序創建了一個進程,main函數其實並不是首先被調用的函數,而是操作系統調用了C/C++運行期啟動函數,該函數負責對C/C++運行庫進行初始化,保證已經聲明了的任何全局對象和靜態對象在代碼執行之前正確的創建。。。。完成這些之後,就調用進入點函數(控制台應用程序為main函數),並在main函數里進行一系列操作。。。。
8. JAVA中main方法是什麼意思
main方法是一個特殊的方法,是程序執行的入口,一個Java程序從main方法開始執行。
Java虛擬機在執行Java程序之前會事先分配一個主線程,然後在主線程裡面執行我們這個main方法,明白了吧?所以我們經常說main方法叫主線程!
線程就是一個程序裡面不同的執行路徑!算了,這些不理解也無所謂,總之,你就記住,Java程序從main方法開始執行,
比如:
public
static
void
main(String[]
args)
{
System.out.println("nihao");
}
在你這里當程序運行的時候,從main方法進來,然後做的第一件事就是System.out.println("nihao");
然後沒有其他語句了,main方法執行結束,程序也就執行結束了!
9. .net里怎樣在Main方法之前執行代碼
研究過.net的高人也許已經知道了方法。 為什麼在.net中Main方法是程序入口呢?那麼Main方法和其他非Main的方法有什麼差異呢?看下面代碼:publicclass Program{ staticvoid Main() { Console.WriteLine("Main"); } staticvoid OtherMain() { Console.WriteLine("OtherMain"); }} Main()和OtherMain()方法就是輸出的東西不一樣,那我們再看一看兩都的IL代碼吧::.method private hidebysig staticvoid Main() cil managed{ .entrypoint // 代碼大小 13 (0xd) .maxstack 8 IL_0000: nop IL_0001: ldstr "Main" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: ret} // end of method Program::Main.method private hidebysig staticvoid OtherMain() cil managed{ // 代碼大小 13 (0xd) .maxstack 8 IL_0000: nop IL_0001: ldstr "OtherMain" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: ret} // end of method Program::OtherMain 從兩者的比較我們可以看出Main方法生成的IL代碼多了一條「.entrypoint」的指令,.entrypoint」什麼意思?隨便一看就知道是「進入點」,就是程序入口的意思了,而且一個程序(exe,非dll,dll是沒有的)只能找到一個.entrypoint」,不信你可以找找。要在Main方法之前執行代碼我們只要如下代碼的樣子,把入口改為OtherMain即可:publicclass Program{ staticvoid Main() { Console.WriteLine("Main"); } staticvoid OtherMain() { Console.WriteLine("OtherMain"); Main(); }} 編譯,再用強大的反匯編程序——IL 反匯編程序打開編譯好的exe文件,點擊菜單文件》轉儲。保存後再用文件編輯工具打開(如notepad),將「.entrypoint」移動到OtherMain()的下面,保存,結果如下。 .method private hidebysig staticvoid OtherMain() cil managed { .entrypoint // 代碼大小 19 (0x13) .maxstack 8 IL_0000: nop IL_0001: ldstr "OtherMain" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: call void Test.Program::Main() IL_0011: nop IL_0012: ret } // end of method Program::OtherMain 用ilasm編譯修改好的文件,生成exe,再運行。看看結束是什麼,是不是在輸出「Main」之前輸出了「OtherMain"。如果是,那恭喜你,程序入口修改成功!大家可以動手試試。 如果你覺得這種方法太麻煩了,那有個簡單的方法。知道類型構造器(又稱靜態構造方法)嗎?不知道?那先知道什麼是類型構造器再看下面的。 類型構造器會在類第一次被使用的初始化類,在類的其他代碼被執行前執行。想要在Main方法之前執行代碼只要在包含Main方法的類里加一個類型構造器不就可以了:publicclass Program{ static Program() { Console.WriteLine("我執行了,Main方法還沒執行哦!"); } staticvoid Main() { Console.WriteLine("Main"); }} 因為Main方法也是一個類的靜態方法,也會符合CLR規范的。如果在類型構造器拋出一個異常,你知道會發生什麼嗎?