在閱讀一本關於機器指令和程序的書時,我遇到了一個特殊的問題,那就是彙編程序掃描整個源程序兩次。它在第一遍/掃描期間構建一個符號表,並在第二次掃描期間將整個程序與它關聯起來。彙編程序需要以類似的方式爲函數提供地址。
現在,由於彙編程序通過了兩次程序,爲什麼需要在可以使用之前聲明一個函數呢?彙編程序不會從第1遍提供函數的地址,然後在第2遍期間將其與程序關聯? 我正在考慮在這種情況下的C編程。程序的彙編和執行 - 兩遍彙編程序
0
A
回答
1
簡單的答案是,C程序要求函數在可以使用之前被聲明,因爲C語言被設計爲一次編譯器處理。它與彙編器和函數的地址沒有任何關係。在使用它之前,編譯器需要知道符號的類型,無論是函數,變量還是別的東西。
考慮一個簡單的例子:
int foo() { return bar(); }
int (*bar)();
爲了生成正確的代碼編譯器需要知道bar
不是一個函數,而是指向函數的指針。該代碼僅適用於在foo
的定義之前放置extern int (*bar)();
,以便編譯器知道bar
是什麼類型。
雖然語言理論上可以設計爲要求編譯器使用兩遍,但這需要語言設計上的一些重大改變。要求兩次通過也會增加編譯器所需的複雜性,減少可以託管C編譯器的平臺數量。在C開始開發時,這是非常重要的考慮因素,當64K(65,536)字節的RAM是大量內存時。即使在今天,對大型程序的編譯時間也會有明顯的影響。
請注意,通過支持隱式函數聲明,C語言確實允許你想要什麼。 (在我上面的示例中,foo
中的bar
之前沒有聲明過)。但是,此功能已過時,受到限制並被認爲是危險的。
相關問題
- 1. 「彙編」與「彙編程序」
- 2. 彙編程序
- 3. Windows如何執行彙編程序?
- 4. 內聯彙編程序執行時間
- 5. 不能執行彙編程序
- 6. 彙編程序的第一遍和第二遍教程
- 7. 運行彙編程序
- 8. 彙編8086程序
- 9. NASM彙編程序
- 10. 忽略彙編程序函數的彙編程序關鍵字
- 11. 彙編:編譯COM程序
- 12. 兩通匯編程序如何處理由彙編程序擴展的指令?
- 13. 微軟彙編程序轉換爲GNU彙編程序
- 14. 彙編程序中的兩個堆棧?
- 15. 尋找一個好的x86彙編程序和反彙編程序庫
- 16. C++中的彙編程序
- 17. 彙編程序 - 添加兩個變量
- 18. SIC彙編程序I/O
- 19. 不明白彙編程序
- 20. 問題彙編C++程序
- 21. LC3彙編語言程序
- 22. Actionscript 3彙編程序
- 23. Jena tdbloader彙編程序
- 24. c#彙編程序dll
- 25. 彙編程序安裝
- 26. 彙編語言子程序
- 27. 彙編程序問題
- 28. BubbleSort與彙編程序
- 29. 彙編程序64b部門
- 30. 彙編程序:遞歸?
在什麼彙編程序之前,你需要聲明一個函數纔可以使用? –
C編譯器不是彙編器。 C語言的規則與裝配工的工作無關。 –
我的意思是說,要被「組裝」的編譯程序需要對程序包含的每個函數,變量等進行適當的定義。如果彙編程序必須通過程序兩次,那麼不需要宣佈功能是不必要的? –