匯編和機器碼對照表 機械語言到高級語言,經(jīng)過了什么?
機械語言到高級語言,經(jīng)過了什么?經(jīng)歷了不同層次的抽象。組裝用于機器硬件指令集。C代表內(nèi)存和文件系統(tǒng)。Java是面向?qū)ο蟮?。Python面向數(shù)據(jù)結(jié)構(gòu)。不同的抽象級別有不同的關(guān)注點。這與分層開發(fā)是一樣的。
機械語言到高級語言,經(jīng)過了什么?
經(jīng)歷了不同層次的抽象。
組裝用于機器硬件指令集。
C代表內(nèi)存和文件系統(tǒng)。
Java是面向?qū)ο蟮摹?/p>
Python面向數(shù)據(jù)結(jié)構(gòu)。
不同的抽象級別有不同的關(guān)注點。這與分層開發(fā)是一樣的。
在設(shè)計系統(tǒng)時,我們將繼續(xù)抽象到更高的層次。
抽象使我們能夠逐步使用低級工具來構(gòu)建高級工具來解決高級問題。
怎么才能知道匯編指令所對應(yīng)的機器碼呢?
如果您指的是x86匯編,您可以看到以下內(nèi)容:
通用反匯編程序顯示機器代碼。例如,可以將vs調(diào)試模式下的反匯編程序頁設(shè)置為顯示機器代碼。
或使用反匯編調(diào)試器(如OllyDbg)顯示反匯編代碼和機器代碼。
如果您想知道一段匯編代碼生成的最終機器代碼,通常需要編譯它并讓編譯器生成機器代碼。
如果您對匯編語言足夠熟悉,您可以自己查看部分機器代碼。例如,E8是一個調(diào)用指令等等。一般來說,這是比較困難的。熟練的逆向工程師可能更熟悉這一點。X86程序集有自己的編碼規(guī)則。有關(guān)詳細信息,請參閱英特爾開發(fā)人員手冊。x86程序集有詳細的編碼規(guī)則。
您還可以使用反匯編引擎(如beaengine或capstone)從輸入的匯編代碼中獲取反匯編機器代碼。
C語言、匯編語言、機器指令、CPU之間是怎么聯(lián)系起來的?
CPU的全稱是中央處理器,它是計算機操作的核心。根據(jù)所采用的不同技術(shù),CPU分為x86、x64、arm、DSP、單片機等不同的體系結(jié)構(gòu)。每種CPU上都有一組特定的指令集,通常稱為機器指令。直接用機器指令編寫的程序是機器語言程序。
從理論上講,任何程序都可以直接用機器語言編寫(在早期,程序比較簡單),程序可以直接運行。然而,對于程序員來說,使用機器語言編程的要求很高,代碼不易移植,不便于人們直接閱讀。所以人們發(fā)明了一組符號,用符號來表示這些機器指令,這就是匯編語言。用匯編語言編寫的程序不能直接由計算機運行。它需要一個名為匯編程序的程序被轉(zhuǎn)換成機器語言才能在特定的機器上運行。
C語言比匯編語言更高級,用C語言編寫的程序不能直接在計算機上運行。它要求編譯器將C語言代碼轉(zhuǎn)換成機器語言。此過程分為幾個子步驟,如下圖所示。
為了使主要問題更加完善,這里添加了兩個概念,鏈接器和反匯編。
這些目標(biāo)文件也是機器指令,但它們?nèi)鄙僖恍┍匾男畔?,無法直接運行。鏈接器需要將這些文件與一些庫文件和可執(zhí)行文件頭信息鏈接在一起,形成一個可執(zhí)行文件(windows為PE格式,Linux為ELF格式)。
通常,在查看二進制文件(對象文件或可行性文件)時,機器指令不會直接顯示,而是以匯編語言顯示。這是因為在這個過程中有一個反匯編程序,它將機器指令轉(zhuǎn)換成匯編語言,其功能與匯編過程正好相反。
匯編器怎么將匯編語言編譯成機器代碼?
每個CPU都有自己的一組指令,指令本身是一個二進制代碼字符串,只是為了方便內(nèi)存和寫入,使用助記符代替,如add。
使用助記符編寫的代碼可以理解為匯編代碼,因此只要根據(jù)指令集對匯編代碼進行轉(zhuǎn)義,就可以生成機器代碼。
CPU工作原理:https://www.toutiao.com/i6672203661197705736/