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

時間 2021-05-06 22:06:29

1樓:卡卡超人

其實你問的這些問題你自己寫一遍然後看彙編就可以了1.直接把資料段對映到記憶體,編譯器已經把初始值寫到了資料段。不過類的還要在main前執行下建構函式,這個編譯器不能幫你。

2.區域性變數宣告是通過sub esp在棧上預留空間,如果有初始化當然是mov,不初始化就什麼也不幹,變數值是隨機的。

3.陣列沒什麼不一樣,只是區域性陣列變數初始化好像是乙個乙個mov過去的,因為沒儲存在資料段裡。

4.先分配空間初始化再執行建構函式。

5.同1

還有,編譯完之後就與編譯器沒有關係了。

2樓:

你開的這個話題太大了,而且目測你對這部分內容連最基礎的了解都沒有。所以,你如果真的有興趣的話,還是建議你系統的學一下編譯原理相關的內容。

這麼東一榔頭西一棒子,往往是你看的時候覺得懂了,但真要上手做點什麼的時候,就會發現毫無頭緒了。

學而不思則罔,思而不學則殆

3樓:Xi Yang

你要明確:

編譯時和執行時。

語言特性的spec與實現。

編譯器優化。

很多詳細的事情你應當看書,比如C專家程式設計、C pitfalls。

對於1,「編譯器自動給變數分配好記憶體空間」和「讓CPU一條指令一條指令的執行,把資料存入到記憶體中」並不矛盾。

具體來講,全域性空間是在程式啟動時分配的,但這個空間的初始化(如果有)有可能是需要被執行的。

2:int t;不賦值的話,會有mov指令嗎?

如果你真的沒用這個變數,那它很可能會被優化掉,在編譯結果裡根本不會存在。

編譯器怎麼給這個變數t分配空間呢?

通常來講函式內的區域性變數在棧上。整個棧空間是在程式/執行緒建立的時候預先分配好的,進入乙個函式的時候,在這個分配好的棧空間裡使用某一塊。所有對這個變數的訪問,會變成「當前棧+固定偏移量」的形式。

可是,這個mov的操作物件又是什麼呢?

可以是CPU暫存器。

我知道int t=1;mov的運算元是1,把1存入到記憶體中去,可是,不賦值是怎麼樣的呢?

這裡有幾個要點:

程式語言的語句與其編譯結果並不一一對應,特別是對於編譯到native code的語言,和開了高階別優化選項的時候。很可能乙個語句什麼都不幹,或者乙個語句幹了很多事情。具體到這件事情:

int t可能存在在棧上,也可能被優化掉,變成一系列對暫存器的訪問,也可能完全沒有。

由於1是乙個非常小的運算元,它很可能變成CPU指令裡的「立即數」。

不賦值那就是什麼都不幹。但它依然會造成影響:

如果這個變數沒有被優化掉,那它的存在會影響這個函式的棧尺寸的計算。

允許你後續操作訪問這個變數。具體怎麼訪問,取決於它會在棧上,還是被優化掉了。

3:陣列的實現沒有任何特別的地方,也是占用一定尺寸的空間而已。

4:對於C++這種非託管的語言,new的時候會幹兩件事情:

在堆上分配物件尺寸那麼大的一塊記憶體(我們先不考慮自定義分配器);

使用這塊分配好的記憶體執行建構函式。

不可能把這個類的內容,全部使用mov指令,複製到新的記憶體裡面去吧?那這樣要浪費多少時間啊?

建構函式裡面幹了什麼,完全取決於建構函式寫了什麼。

另外,建構函式沒有任何神奇的地方。本質上和這樣的C函式沒有區別:

typedef struct Billy

;void Billy_constructor(Billy* this)

5:如果是函式區域性變數,不優化有可能是「將內容1放在記憶體棧頂+a的四位元組處」,優化有可能是什麼都不做。

基本型別的全域性變數在程式映像載入時就完成了初始化,基本上就是把可執行檔案直接拷貝到記憶體裡,可執行檔案在鏈結時已經搞好了全域性區各個位置的值,所以載入完了就已經好了。

組合語言入門四 打通C和組合語言

minzhuosong 南韓車四五年就不行了,南韓基礎科學不行,只能搞點惠人原汁機,福庫電飯鍋,coway空氣淨化器淨水器,三星U盤,LG液晶屏液晶電視顯示器這些微電子不錯,國內的雪佛蘭,科魯茲科帕奇樂馳,還有別克凱越就是南韓大宇汽車換標,車身應該比南韓的硬一點,焊接應該好一點,發動機變速箱底盤大多...

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

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

組合語言有多少種?

鯊魚辣椒 組合語言和CPU息息相關,但是不能把組合語言完全等同於CPU的機器指令。不同架構的CPU指令並不相同,如x86,powerpc,arm各有各的指令系統 甚至同一種架構的CPU有幾套指令集,典型的如arm除了有32位的指令集外,還有一套16位的thumb指令集。但是作為開發語言的彙編,本質上...