機器碼深究

2014-03-30 1:39 pm
網上文章成日都話用機器碼直接寫程式執行速度最快
但以C++為例
EG 簡單一個program
int main(){

return 0;
}
我認知係寫完之後會經由C++ compiler編譯生成機器碼
而執行既就係編譯後生成出黎既機器碼
既然係咁又何來執行速度上既差別?

另外 小弟諗唔通點解高階語言會有移值性上既優勢
我知機器碼會因應CPU唔同而唔一樣
但承上述 既然生成出黎既都一樣係機器碼
C++又點可以生成番對應CPU既機器碼呢?
應該唔會係C++有齊哂所有CPU既instruction set掛=.=

仲有想問既就係有咩program可以做到所謂既直接用機器碼寫program既software
小弟有用過hex editor neo 但唔知算唔算
EG如下:
10110100 00001001 10111010 00001111 00000001 11001101 00100001 10110100 00000001 11001101 00100001 10110100 01001100 11001101 00100001 01001000 01100101 01101100 01101100 01101111 00100001 00100100
簡單地print句HELLO
更新1:

明白 但照2位大大所講 理論上直接用assembly同直接用機器碼寫程式執行速度應該一樣 因為一句assembly對應一句機器碼 但高階語言就對應多句 right? 但係網上睇過有人話直接用機器碼寫執行速度會快過用asm寫 係咪我有邊d地方理解錯左? 感激解答

更新2:

因為想學逆向 而且我覺得識ASSEMBLY可以了解電腦運作

回答 (2)

2014-03-31 3:01 am
✔ 最佳答案
首先assembly(低階語言)係參數數量小既時侯
不需要使用stack,可以直接使用register將參數轉送
而C/C++等高階語言係唔可以的
呢個就係低階語言比高階語言快既主要原因
--------------------------------------------------
而高階語言移值性上既優勢

低階語言 單 對 CPU 單
1.低階語言 -> machine code
不同CPU要用不同既命令

高階語言 單 對 CPU 複
1.C/C++ -> binary file
2.binary file -> machine code
如果可以由binary decode做machine code
就等如CPU支援到個binary file
--------------------------------------------------
我係由C開始學寫program的
未試過全部用assembly黎寫
所以答唔到你點setup 直接用assembly
不過你可以 用Microsoft Visual C++ 既 Inline assembler 黎寫assembly

希望能解答到你既疑問^^

2014-04-02 23:06:11 補充:
我所知是沒有分別..
你可以參考下 http://zh.wikipedia.org/wiki/組合語言

好奇的是你想開發什麼...為何執着那些小速度呢?
因為由 assembly -> machine code 是乏味耗時的...

2014-04-06 20:18:13 補充:
講逆向工程既資料比較小
建議你買書學


韓文(原著)
http://www.amazon.com/dp/8998139014
日文(翻譯)
http://www.amazon.co.jp/dp/4844334794


英文:未睇過內容,不過Reviews唔差,wikipedia既延伸導讀都有提到
http://www.amazon.com/dp/0764574817

2014-04-06 20:20:26 補充:
用Tag冇左個書名
1.Reverse engineering the Bible 韓文(原著) / 日文(翻譯)
2.Reversing: Secrets of Reverse Engineering (英文)
2014-03-31 8:07 am
因為你沒有真正去寫一個機械語言程式,所以你不明白為何所有其他高階語言編寫程式一定效率效低。
『c++經編譯生成(也是)機器碼,何來執行速度上既差別?』
cpu執行機器碼速度當然幾時都一樣,但高階編繹的機器碼會做多左好多無謂野。
以你的一個sub-routine或者叫function或者叫PROCEDURE為例,雖然什麼都冇做,但因為要general purpose,進入前,高階編出來的碼必定把所有register都推到stack保存,完成後取回,即PUSH ALL和POP ALL,若你以機械語寫,你只會用那一個才SAVE那一個。
又以一個for loop為例,i可能會存到一個memory,(因為中間唔知你會點),而以機械語編寫,你定必直接用一個register。速度分別可以很大。
『唔通點解高階語言會有移值性上既優勢』
這是編譯器的工作。因cpu結構不同,如register多少,定址法等,機械碼寫的方法不同,但若你以c來寫,只要用不同的編譯器,可以生成對應那一粒cpu的機械碼,源碼相同。這就是可攜性的好處。若以機械碼來寫,編程者基本要由頭學,因為加減乘除都可能不同。這個要你學了多過一粒cpu的instruction set就會明得多。

『應該唔會係C++有齊哂所有CPU既instruction set掛=.=』
編繹器就是把你寫的句子轉成cpu的instruction,不同cpu須要用不同的編譯器(compiler),例如你用的vc++,其實只有對應x86,如要搬到arm或者其他cpu,vc++無能為力。
雖則compiler幫了一大把。不過其實因為好多野會連到os有關,例如你code左個drive 係c:,拿到mac或者linux係唔得。所以只係大部份可重用,但係乜都唔改係始終唔得。
若以mcu的程式來說,會由於io腳不同,timer不同等令到c源碼不能共通。

講左咁耐,其實冇人用機械語(machine code)來寫,即係你的10001010,(就算寫都會寫16進),都冇人識睇,寫係會用編匯語言(assembly code),其實基本上係一一對應。例如要打印hello world。對dos而言,(或者叫windows 的console mode),會寫成咁
org 100h
jmp start
message db 'Hello World!$'
start:
mov dx, offset message
mov ah, 09 // 呢個係打印指令
int 21h
mov ax, 4c00h // 呢個係結束指令
int 21h
你睇到指令係直接用cpu 的register,不同cpu已經不同,另一件事係int21係dos專用,搬去第二度已不同,所以完全不可搬。

若在windows想寫assembly,根本系統已有,叫debug,你可以執行度輸入,入左去用a 100<enter>跟住 就可 以寫。
不過冇label,全部用地址。要寫可以用masm,已變freeware。冇乜人全個assembly咁寫,大部份會將部份critical的寫個function,叫inline assembly,borland turbo pascal有,學寫assembly係一個極好工具。



收錄日期: 2021-04-26 23:57:54
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20140330000051KK00023

檢視 Wayback Machine 備份