為什麼「 高階語言比組合語言程式更容易從一種計算機上移植到另一種計算機上」?

時間 2021-05-30 00:13:13

1樓:Lunatic

前面已經有答主指出了彙編就是「機器碼助記符」。組合語言不是一種C語言概念上的「語言」,它是和對應體系結構的硬體息息相關的。不同體系結構下的組合語言(比如x86彙編和arm彙編)好比漢英字典和新華字典,兩者都是根據目錄檢索資訊,但是本質(內容)是完全不相同的。

彙編的執行就是逐行的,根據助記符查詢對應的機器碼,然後根據機器碼對相關的硬體(比如暫存器)進行操作。但是硬體顯然在組織結構上會存在差異,那麼他們對應的彙編自然有差異,也自然是無法簡單的複製貼上/重新編譯來進行移植的。

2樓:szdytom

我忘記交叉編譯了,抱歉。

以下為原回答:

其他答主說的很好了,但我舉乙個反例:C的編譯器是用C寫的,C++的編譯器是用C++寫的,Rust的編譯器是用Rust寫的...

這意味著,當有一種全新的CPU指令集時,我們不得不付出巨大的代價來進行移植

3樓:

我覺得彙編更好移植吧,彙編才多少指令啊,也沒啥複雜指令。不考慮效能的話,簡單把A計算機的彙編翻譯到B計算機的彙編就好了。

移植高階語言,也就是要給乙個高階語言寫乙個編譯器編譯到B計算機的彙編上,就算前端可以復用,後端編譯過去的工作量也明顯比直接翻譯彙編更大吧。

4樓:sjx233

彙編指令和機器碼可看作一一對應,而不同種計算機的機器碼是不同的,要移植匯程式設計序幾乎相當於重寫。但高階語言程式可以通過不同的編譯器翻譯成所需的機器碼,或通過不同的直譯器直接解釋執行。

以 hello world 為例:

#include

intmain

()用 x86_64 gcc 10.2 編譯得到的彙編:

.LC0:

.string

"hello world"

main:

subq$8,

%rsp

movl

$.LC0

,%edi

call

puts

xorl

%eax

,%eax

addq$8,

%rsp

ret用 ARM64 gcc 8.2 編譯得到的彙編:

main:

stpx29

,x30,[

sp,-16

]!adrpx0,

.LC0

addx0,x0

,:lo12

:.LC0

movx29,sp

blputs

movw0,0

ldpx29

,x30,[

sp],

16ret

.LC0:

.string

"hello world"

省略了彙編中無關內容。

高階語言如何轉組合語言的問題?

卡卡超人 其實你問的這些問題你自己寫一遍然後看彙編就可以了1.直接把資料段對映到記憶體,編譯器已經把初始值寫到了資料段。不過類的還要在main前執行下建構函式,這個編譯器不能幫你。2.區域性變數宣告是通過sub esp在棧上預留空間,如果有初始化當然是mov,不初始化就什麼也不幹,變數值是隨機的。3...

既然高階語言可以通過編譯器翻譯程組合語言為什麼要學組合語言?

財富思維 組合語言是高階語言的底層,高階語言是汽車維修技術,那麼組合語言就是汽車製造技術。懂得了汽車的製造方法,那麼維修時檢查故障就更容易。 zhangxiaoyang 樓主可能是在校大學生。從計算機學科的基礎素養來看,是需要的,包括計算機組成原理 編譯原理 作業系統 高等數學等等。從找工作的角度來...

為什麼還有很多人說高階語言比彙編快?

七星聚月 因為時代在發展,編譯器在進步。本質上殺人就是把人弄死,過去用刀,現在用槍,過去講究刀法姿勢,現在只用扣扳機。會武術是不是高手?是。高手是不是刀槍不入?扯淡。刀子割肉為什麼比子彈快?那要看你子彈和槍什麼形狀了。 趙者也 任何語言都要編譯成機器碼執行。這是常識吧 所以你提出的這種比快慢,等價於...