2011-06-25 32 views
2

基本上,我想知道是否可以使用機器語言或彙編語言編寫可以在任何使用x86處理器的計算機上工作的程序,儘管操作系統不同。例如,你運行一個程序,不管它在運行什麼電腦,它都會顯示「Hello,World!」 我知道這有點瘋狂想要知道這些語言,但我認爲這是一個令人難以置信的東西學習,所以爲什麼不呢?如果我使用匯編語言或機器語言編寫程序,程序是否可以在兼容處理器的計算機上運行?

回答

2

一般情況下,第

不同的操作系統將有API函數不同的支持,並在不同的地址支持不同的硬件。

如果你想覆蓋最多的平臺,那麼java可能是最好的選擇。

+0

我的主要編程語言是java。我只是爲了它的樂趣而學習大會。 – user663425

0

總之,沒有。

操作系統通常不會開始執行二進制程序的第一個字節。他們所做的是爲應用程序設置地址空間,其中包括諸如調用堆棧需要多大,想要預分配給常量的值以及二進制文件的哪些部分應該作爲可執行文件加載代碼,而不是可寫數據。

二進制程序指示操作系統如何配置其地址空間的方式因操作系統而異。

0

是的,不是你的答案。您可以編寫x86彙編,並且它可以在Linux,Mac OS X和MS Windows上執行相同的操作。但是,通過執行相同的操作,我的意思是它會從相同的位置獲取數據,執行相同的操作操作並將其存儲回內存中的某處。因此,通過這種方式,您可以在所有平臺上以相同的方式進行快速的3D數學運算或其他操作,但是將數據導入程序集例程中的方式以及您使用它的方式在所有平臺上都會有所不同平臺。所以你不能在任何操作系統上「顯示」hello world,但是你肯定可以把字符「hello world」(或者一組轉換後的vertecies)放到內存中,這樣你的操作系統特定的代碼就可以把它拉出來並使用它。

0

「這取決於」

如果你想要一個實際的獨立可執行二進制文件,那麼答案是否定的。然而,如果你只是想寫一個程序集片段,然後將它嵌入到一個更大的可執行文件中,答案是「是」;但是不允許您在該彙編代碼塊中調用任何操作系統特定的功能。因此,您可能無法實現創建單個程序集的夢想,該程序在多個操作系統上打印出「Hello world」。

1

不,程序高度依賴於操作系統。要寫輸出,例如「Hello,world!」,程序通常會向操作系統發出請求。通常,程序將把請求的參數放在由操作系統指定的地方(例如,$ eax寄存器),然後執行一條從操作系統請求服務的指令。

操作系統請求通常按編號或某些類似的方案進行編碼。因此,要將字符寫入輸出流,您需要在$ eax中輸入一個數字。要打開一個文件,可以使用另一個數字等等。顯然,代碼在操作系統和操作系統之間有所不同。 (這些請求通常包含在庫調用中,當您調用像「寫入」這樣的庫時,它包含了與上述內容類似的操作說明。)

即使您想「自己動手」並通過操作硬件寫入屏幕,仍然存在一些問題。一,操作系統必須讓你有權訪問硬件。目前大多數系統都阻止用戶模式程序直接訪問硬件。二,你的程序必須爲特定的硬件而設計。也許有一種舊式的BIOS可以發送字符,或者在系統中有一些現代的固件。您需要不同的方法來處理不同的固件或CPU外部的任何其他組件。

也就是說,編寫在多個不同操作系統上運行的彙編語言程序可能不是不可能的。有一些程序同時用多種高級語言編寫,例如FORTRAN和C.例如,程序可能在列中以「C」開頭,表示它是FORTRAN中的註釋,但第一行是有效的C碼。那C代碼可以開始評論。隨後安排行,以便它們是FORTRAN代碼和C註釋或FORTRAN註釋和C代碼。有可能對可執行文件做類似的操作,以便兩個不同的操作系統將其作爲可執行文件接受,並打印出「Hello,world!」。 (或者,更好的是,每個都做不同的事情)。

DOS .COM格式可能對此很有用,因爲它是一個原始的二進制文件。如果另一個系統的可執行文件的前幾個字節可以是表示跳轉指令的字節,那麼.COM文件可能會導致跳轉到文件的其他位置,您可以在其中安排任何您喜歡的字節,而該文件是其他系統的可執行文件。

這當然不是設計可執行文件的預期方式,也不是一件容易的事。

0

波洛尼。 x86計算機的MACHINE LANGUAGE不會因機器而異。他們所做的就是添加說明等等,如果你希望程序做的事情比'hello world'多,那麼根據h/w如何處理分頁等方式來完成這一點會有一些不同。小型程序沒有在內存中跳躍,對每個程序來說都幾乎相同。