在同一硬體上,同一條彙編指令在不同操作系統中彙編後的二進位代碼是否一樣?

還是同一台電腦,當跑著不同操作系統的時候,不關注最後生成的可執行文件的二進位格式,而是只看其中一條彙編指令彙編後的二進位代碼(X86),那它在windows、linux下的二進位碼是否一樣?


同一種彙編語言,翻譯成的二進位代碼是完全相同的,彙編語言的定義就是用助記符代替機器指令,注意是代替,純粹的替換操作,所以,如果是同一種語言,在同一個硬體平台上,那麼同樣的彙編指令對應的二進位編碼是完全相同的。

NOP是0x90,那麼不管是Linux還是Windows里,NOP都是0x90


彙編就是二進位


相同的硬體,不同的操作系統,相同的彙編指令,相同的彙編器, 得到相同的 機器指令,也就是題主說的二進位代碼(這裡不考慮用於程序載入的輔助信息)是合理的,理由是:

機器指令是直接給CPU執行的,而CPU是相同的,它所識別的機器指令集也是相同的,BIOS也是相同的,總之硬體部分都是相同的,和操作系統無關,所以編譯成相同的機器指令是一種可以接受的結果。

--------

本人不懂彙編、不懂操作系統,以上回答,純屬扯淡,不要當真。


不同編譯器,不同選項,對「同一指令」處理結果可能會不同吧(這個我不是很確定,給出一個異議的思路,做參考,歡迎批評指正)。

1. 跳轉:比如 寫 jmp lab 可能會根據優化情況優化成相對跳轉或是決對跳轉?(彙編器也是編譯器,按照編譯器介紹的內容這種情況是有可能的(如果不是反彙編出來的彙編指令))

2. 如果彙編器有優化功能,優化級別高的話,那麼寫 mov a -&> b mov b -&> c 會不會給你優化成 mov a -&> c?(此條暫時未找到支持證據。)

-----------------

補充:

3. 剛搜了一下,NASM 彙編器,調整優化參數 還會對立即數的處理有影響。1中提到的jmp 會有優化處理。

(這裡我指的機器碼是機器碼的「形式」,A。有時不同彙編里對 jmp 長跳轉,短跳轉,相對決定跳轉的指令在寫彙編程序時不強制區分,或有多種形式表現。B。同一長跳轉jmp lab 可能是到0xffff,或長跳轉 到 0xaaaa 暫認為他們相同(較真的話它們是不是也不算是相同的機器碼?)。)


指令集不一樣的話 怎麼相愛


只跟彙編語言和彙編器有關係。不同語言編譯出來的基本不可能一樣。同種語言,同一個彙編器編譯出來的才一樣。


CPU不同結果不同,CPU的指令集的鍋


大部分是一樣的。不過在某些指令系統里,不同的機器碼可能會對應同一條彙編。這種情況下,不同的編譯器可能會把某條相同的彙編翻譯成不同的機器碼。


看你用什麼編譯器,gcc和arm-gcc就是分別編譯各自的彙編。當然,各自的彙編指令集也不同。


推薦閱讀:

Linux小白學習法寶-命令大全第一部分
用R語言修改一個工具包,做並行計算上的優化應該怎麼入手?
普通用戶沒有root許可權,如何在自己的home目錄安裝Perl模塊?
Ubuntu 系統下有哪些整理硬碟的工具?

TAG:操作系統 | Linux | C編程語言 | 編譯原理 | 反彙編 |