溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

發(fā)布時(shí)間:2022-03-06 18:31:30 來(lái)源:億速云 閱讀:326 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

1.機(jī)器語(yǔ)言

何為語(yǔ)言,就是人和人之間交流的工具。而匯編語(yǔ)言就是計(jì)算機(jī)的語(yǔ)言。

機(jī)器語(yǔ)言(二進(jìn)制):

主流的電子計(jì)算機(jī)使用二進(jìn)制,計(jì)算機(jī)只認(rèn)識(shí) 0和1,因?yàn)樵陔娐分兄挥袃煞N狀態(tài),要么通電要么斷電,我們用數(shù)字表示這兩種狀態(tài)就是0和1,我們可以用0和1與計(jì)算機(jī)交流。

機(jī)器語(yǔ)言就是由0和1構(gòu)成的語(yǔ)言,我們很難理解,幾乎看不懂。而我們需要將這些復(fù)雜的機(jī)器語(yǔ)言(一堆0和1的數(shù)字)簡(jiǎn)化,就需要助計(jì)符(INC DEC MUL DIV等),也就是匯編語(yǔ)言。

我們掌握了匯編語(yǔ)言就可以操作計(jì)算機(jī)的底層,深入一點(diǎn)就是可以直接操作計(jì)算機(jī)里面的 位。
匯編語(yǔ)言助記機(jī)器語(yǔ)言,所以說(shuō)我們學(xué)會(huì)了匯編語(yǔ)言就學(xué)會(huì)了機(jī)器語(yǔ)言。

學(xué)習(xí)匯編就是為了理解計(jì)算機(jī)怎么操作,每一行代碼怎么被計(jì)算機(jī)執(zhí)行,這些原理非常重要!

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

2.進(jìn)制思想本質(zhì)

學(xué)習(xí)進(jìn)制的障礙:
很多人搞不懂進(jìn)制的主要原因是因?yàn)槲覀儚男〗邮芰耸M(jìn)制的概念,逢十進(jìn)一的原則深入人心。
人本能的選擇就是 十進(jìn)制。

常見(jiàn)進(jìn)制:
1進(jìn)制:逢一進(jìn)一,1 1
2進(jìn)制:逢二進(jìn)一,計(jì)算機(jī)進(jìn)制
8進(jìn)制:逢八進(jìn)一,8個(gè)符號(hào)組成:0 1 2 3 4 5 6 7
10進(jìn)制:逢十進(jìn)一,10個(gè)符號(hào)組成:0 1 2 3 4 5 6 7 8 9
16進(jìn)制: 逢十六進(jìn)一,16個(gè)符號(hào)組成:0 1 2 3 4 5 6 7 8 9 a b c d e f

進(jìn)制其實(shí)非常簡(jiǎn)單,只需要會(huì) 查數(shù)。

測(cè)試:

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

進(jìn)制可以自定義:
小朱同學(xué)的十進(jìn)制:0 2 4 7 8 a b r d f,可以隨便定義。
由此我可以使用進(jìn)制加密,防止被爆破(暴力破解)。

3.二進(jìn)制

目前的計(jì)算機(jī)(電子計(jì)算機(jī))使用二進(jìn)制 0 1

現(xiàn)在的計(jì)算機(jī)(電子計(jì)算機(jī)):
都是通過(guò)集成電路來(lái)實(shí)現(xiàn)電路的有電和無(wú)電,高電平和低電平,表現(xiàn)出來(lái)兩個(gè)值0 1。

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

由于二進(jìn)制寫(xiě)起來(lái)非常麻煩,我們就需要簡(jiǎn)寫(xiě)二進(jìn)制,所以我們就去寫(xiě)16進(jìn)制。

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

拓展:
未來(lái)的量子計(jì)算機(jī):(傳道)
可以實(shí)現(xiàn)量子計(jì)算的機(jī)器。

量子計(jì)算機(jī)的 單位:昆比特。也就是所謂的(量子比特),量子的兩態(tài)(光子,磁場(chǎng))來(lái)表示。
量子的計(jì)算速度遠(yuǎn)遠(yuǎn)超越了現(xiàn)在的電子計(jì)算速度。
光子:正交偏振方向。
磁場(chǎng):電子的自旋方向。

如今我們已經(jīng)到了21世紀(jì),計(jì)算力已經(jīng)快到盡頭了,沒(méi)辦法突破(落伍)的本質(zhì)問(wèn)題!
我們想要突破這個(gè)本質(zhì)問(wèn)題,就要使用量子計(jì)算機(jī)。核心要素就是提高計(jì)算機(jī)的計(jì)算力!

2019年,Google研究人員展示其最新54比特量子計(jì)算機(jī),該計(jì)算機(jī)只用200秒便可計(jì)算完畢當(dāng)前世界最大的超級(jí)計(jì)算機(jī)需1萬(wàn)年進(jìn)行的運(yùn)算。
2020年.6.18,霍尼韋爾公司推出了量子體積64的量子計(jì)算機(jī)!
霍尼韋爾還表示,將在一年之內(nèi)得到至少10個(gè)有效量子比特,相當(dāng)于1024個(gè)量子體積。
如果可以量產(chǎn),大規(guī)模普及到民用之后,我們這些程序員是第一批使用他們的人。因?yàn)槲覀円?br/>針對(duì)量子計(jì)算機(jī)寫(xiě)程序。

我們?yōu)槭裁磳W(xué)習(xí)理解二進(jìn)制?

如果我們了解寄存器,內(nèi)存,位的概念,計(jì)算機(jī)底層的每一個(gè)位都是有含義的(匯編入門理解的基礎(chǔ))。每一個(gè)0和1都代表一種狀態(tài),計(jì)算機(jī)會(huì)按照這種狀態(tài)去執(zhí)行特定的功能。程序運(yùn)行時(shí)候會(huì)快速發(fā)生變化,每一個(gè)變化就會(huì)產(chǎn)生不同的狀態(tài),就比如:移動(dòng)鼠標(biāo)為什么會(huì)動(dòng),這底層如何實(shí)現(xiàn)非常的復(fù)雜。

4.數(shù)據(jù)寬度

計(jì)算機(jī)的內(nèi)存是有限制的,內(nèi)存不可能是無(wú)窮大的。所以我們就需要給數(shù)據(jù)增加數(shù)據(jù)寬度。

在計(jì)算計(jì)領(lǐng)域,我們要記?。核械膬?nèi)存,所有的操作,都要給數(shù)據(jù)加上寬度,尤其是C,C++,Java這種強(qiáng)類型語(yǔ)言,都需要定義數(shù)據(jù)類型!為什么要需要定義類型?因?yàn)橛?jì)算機(jī)底層需要我們這些數(shù)據(jù)定義寬度。

有了寬度,就有了一些基本的量。常用量包含字節(jié),字,雙字等…

位 (bit):0 1
字節(jié) (byte):(8位) 0-0xFF
字 (word):0-0xFFFF
雙字 (dword):0-0xFFFFFFF

在計(jì)算機(jī)中,每一個(gè)數(shù)據(jù)都需要給它定義類型。定義類型的原因就是給它定義寬度。在內(nèi)存中的寬度。

5.有符號(hào)數(shù)和無(wú)符號(hào)數(shù)

計(jì)算機(jī)它并不知道我們寫(xiě)的數(shù)字是正還是負(fù)。我們可以通過(guò)正負(fù)號(hào)來(lái)判斷,而計(jì)算機(jī)如何去表示正負(fù)呢?我們接下來(lái)了解一下!

數(shù)據(jù)都是有寬度的。 那么每個(gè)數(shù)據(jù)代表什么意思呢?

規(guī)則
就好比我們解析一個(gè)音頻:比如說(shuō)為什么網(wǎng)易云可以放出MP3?那是因?yàn)橛袀€(gè)MP3的編碼格式,我們根據(jù)這個(gè)格式解碼才能放出聲音對(duì)應(yīng)的格式。如果是一個(gè)視頻就要遵守視頻的解碼規(guī)則…

現(xiàn)在我們需要給二進(jìn)制解碼增加一個(gè)規(guī)則。
1.無(wú)符號(hào)數(shù)規(guī)則:
你這個(gè)數(shù)字是什么,那就是什么,無(wú)關(guān)正負(fù)。

1 0 0 1 1 0 1 0  轉(zhuǎn)換十六進(jìn)制為: 0x9A   十進(jìn)制為:154

2.有符號(hào)數(shù)規(guī)則:
最高位是符號(hào)位。 如果最高位是1,就代表一個(gè)負(fù)數(shù)。如果最高位是0,就代表是一個(gè)正數(shù)。

1 0 0 1 1 0 1 0  如何轉(zhuǎn)換十六進(jìn)制?

這里就涉及一套計(jì)算機(jī)規(guī)則:就是原碼反碼補(bǔ)碼。

6.原碼反碼補(bǔ)碼

為什么學(xué)原碼反碼補(bǔ)碼?
因?yàn)槲覀冎笠盟鼇?lái)計(jì)算。

編碼規(guī)則:(無(wú)符號(hào)數(shù)編碼規(guī)則沒(méi)什么可說(shuō)的,寫(xiě)的數(shù)字是什么就是什么)

有符號(hào)數(shù)編碼規(guī)則有三種狀態(tài):**原碼,反碼,補(bǔ)碼。**我們來(lái)依此學(xué)習(xí)一下這三種狀態(tài)。

1.原碼: 最高位是符號(hào)位,對(duì)齊它的位進(jìn)行本身的絕對(duì)值即可。
2.反碼: 分為正數(shù)和負(fù)數(shù)

正數(shù):反碼和原碼相同。負(fù)數(shù):符號(hào)位一定是1,其余位對(duì)原碼取反。

3.補(bǔ)碼:

正數(shù):補(bǔ)碼和原碼相同負(fù)數(shù):符號(hào)一定是1,對(duì)反碼進(jìn)行+1

舉個(gè)例子:

現(xiàn)在我說(shuō)的這些都是 8 位 

如果是正數(shù),都是一樣的。
對(duì)1取值:
原碼:0 0 0 0  0 0 0 1
反碼:0 0 0 0  0 0 0 1
補(bǔ)碼:0 0 0 0  0 0 0 1

如果是負(fù)數(shù)
對(duì)-1取值:
原碼:1 0 0 0  0 0 0 1
反碼:1 1 1 1  1 1 1 0
補(bǔ)碼:1 1 1 1  1 1 1 1

對(duì)-7取值:
原碼:1 0 0 0  0 1 1 1
反碼:1 1 1 1  1 0 0 0
補(bǔ)碼:1 1 1 1  1 0 0 1

對(duì)3+5取值:
3的二進(jìn)制是 11
5的二進(jìn)制是 101
加起來(lái)是 1000

我們現(xiàn)在要理解一句話,如果看到一個(gè)二進(jìn)制的數(shù)字。需要了解它是有符號(hào)數(shù)還是無(wú)符號(hào)數(shù)。

拓展:
接下來(lái)先給大家擴(kuò)展一個(gè)寄存器:里面可以存值。通用的寄存器有8個(gè),可以存儲(chǔ)任意的值。我可以通過(guò)mov指令向某個(gè)寄存器存值,如下圖:

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

現(xiàn)在我要寫(xiě)一個(gè)-1,我們來(lái)看看會(huì)有怎樣的區(qū)別:

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

這里的FFFF FFFF是我們存的-1在寄存器中的值。一個(gè)F就是 1111,首先最高位的值是1,所以代表他是一個(gè)負(fù)數(shù)。我們正常存1的時(shí)候首位明顯是0,而存-1就變成FFFF FFFF。因?yàn)?1在計(jì)算機(jī)中是補(bǔ)碼的方式存儲(chǔ)的,所以負(fù)數(shù)在我們計(jì)算機(jī)中使用補(bǔ)碼方式存儲(chǔ)的。所以學(xué)習(xí)通過(guò)直接操作查看是最有效的。

FFFF FFFF代表三十二個(gè)1,如果是無(wú)符號(hào)的話,代表它是正數(shù)。如果是有符號(hào)的話,代表它是一個(gè)負(fù)數(shù),是有很大的本質(zhì)區(qū)別的。

我們搞懂原碼反碼補(bǔ)碼之后,以后知道了計(jì)算機(jī)底層是怎么存儲(chǔ)數(shù)字的:正數(shù)就正常的存,因?yàn)闊o(wú)論原碼反碼補(bǔ)碼,正數(shù)都是相同的。而負(fù)數(shù)主要存的是補(bǔ)碼!如果了解了這些,就是為了接下來(lái)的位運(yùn)算打交道。

7.位運(yùn)算

我們之前說(shuō)過(guò),計(jì)算機(jī)現(xiàn)在可以存儲(chǔ)所有的數(shù)字(正數(shù),浮點(diǎn)數(shù),字符),不論正數(shù)還是負(fù)數(shù)都可以存儲(chǔ)。如果可以把這些數(shù)字加以運(yùn)算,我們就可以做到世界上的一切。無(wú)論多復(fù)雜的運(yùn)算,底層都是加減乘除。我們只要把位運(yùn)算的位如何操作運(yùn)算記住、突破就可以了。

接下來(lái)我們學(xué)習(xí)位運(yùn)算。

首先有一個(gè)面試高頻題:2*8最高效的計(jì)算方式?
這道題不論怎樣都非常慢,只有通過(guò)位運(yùn)算才是最快的,比如左移、右移。而且要記住一句話:很多底層的調(diào)試器(例如C語(yǔ)言調(diào)試器),當(dāng)我們手寫(xiě)調(diào)試器的時(shí)候就需要通過(guò)位來(lái)判斷CPU的狀態(tài)。

位運(yùn)算就是我們常說(shuō)的與或非 異或運(yùn)算等…我們一個(gè)一個(gè)來(lái)看:

與運(yùn)算:

在JAVA語(yǔ)言中用 & 符號(hào)去表示,但是在匯編中用 and 代表與。下面圖片方便我們的理解:

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

1011 0001
1101 1000
-------------------- 與運(yùn)算的結(jié)果
1001 0000

或運(yùn)算:
在JAVA語(yǔ)言中用(|)表示,在匯編語(yǔ)言中用or表示,同樣根據(jù)或運(yùn)算也有一張電路圖可以幫助理解:

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

1011 0001
1101 1000
--------------- 或運(yùn)算
1111 1001

異或運(yùn)算:
在我們JAVA語(yǔ)言中用(^)表示,在匯編語(yǔ)言中xor表示。說(shuō)白了記住一句話:不一樣就是1。再來(lái)一張電路圖理解:

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

1011 0001
1101 1000
--------------------異或運(yùn)算
0110 1001

非運(yùn)算(單目運(yùn)算符):
我們所謂的取反(非),在JAVA語(yǔ)言中是(?。?在C語(yǔ)言中是(~),在匯編語(yǔ)言中是not。
說(shuō)白了一句話:0就是1,1就是0。

1101 1000
----------------- 非運(yùn)算 
0010 0111

通過(guò)這些可以完成我們的加減乘除。怎么通過(guò)位運(yùn)算實(shí)現(xiàn)加減乘除呢?

位運(yùn)算:
它是一個(gè)移動(dòng)位,分為左移,右移。(左移*2,右移/2)。

左移(shl <<):

0000 0001  所有的二進(jìn)制位全部左移若干位,高位就丟棄,低位補(bǔ)0
0000 0010

右移(shr >>):

0000 0001  所有二進(jìn)制全部右移若干位,低位就丟棄,高位補(bǔ)0或1(根據(jù)符號(hào)位決定,負(fù)數(shù)補(bǔ)1,正數(shù)補(bǔ)0)
0000 0000

如果想要取值(C++)
int a = 10;
printf("%d\n",a>>2);

總結(jié): 匯編的本質(zhì)就是操作二進(jìn)制。

通過(guò)二進(jìn)制、位運(yùn)算實(shí)現(xiàn) 加減乘除。

8.位運(yùn)算的加減乘除

接下來(lái)我們講,如何通過(guò)位運(yùn)算實(shí)現(xiàn)加減乘除。我們的計(jì)算機(jī)只認(rèn)識(shí)0和1,但是基本的數(shù)學(xué)是建立在加減乘除上。(加法搞定,一切都搞定了)

舉個(gè)例子:求4+5?

計(jì)算機(jī)是如何操作的呢?
0000 0100
0000 0101
-------------------------(加法,計(jì)算機(jī)是不會(huì)直接加)
0000 1001

那么計(jì)算機(jī)的實(shí)現(xiàn)原理是什么呢?
怎么將兩個(gè)數(shù)加起來(lái)?核心是:異或。

第一步,異或(不一樣為1):如果不考慮進(jìn)位,異或就可以直接出結(jié)果
0000 0100
0000 0101
-------------------------
0000 0001
第二步,計(jì)算機(jī)在這個(gè)異或的結(jié)果上在做與運(yùn)算操作:
與運(yùn)算(判斷進(jìn)位),如果與運(yùn)算結(jié)果為0,那么就沒(méi)有進(jìn)位。
0000 0100
0000 0101
-------------------------
0000 0100
第三步,將與運(yùn)算的結(jié)果左移一位。
0000 0100 ——> 0000 1000 (進(jìn)位的結(jié)果)
第四步,還是一個(gè)異或運(yùn)算。(第一步異或出來(lái)的結(jié)果和第三步與運(yùn)算的進(jìn)位結(jié)果再一次異或)
0000 0001
0000 1000
------------------------
0000 1001
第五步,再去做一個(gè)與運(yùn)算,判斷它是否有進(jìn)位。(與第二步一樣)
0000 0001
0000 1000
------------------------
0000 0000
最后一步與運(yùn)算結(jié)果為
0000 0000
電路都斷了,燈泡全滅,通過(guò)不了,所以最終結(jié)果就是:
與運(yùn)算為0的結(jié)果的上一個(gè)異或運(yùn)算結(jié)果:
0000 1001 (二進(jìn)制的9)
如果與運(yùn)算不為0,繼續(xù)循環(huán)。

舉個(gè)例子:求4-5?

我們說(shuō)了,計(jì)算機(jī)沒(méi)有所謂的減法,那么計(jì)算機(jī)是如何操作的呢?
4-5 說(shuō)白了就是 4+(-5)
0000 0100
1111 1011 (代表二進(jìn)制的-5)
------------------------(減法,計(jì)算機(jī)是不會(huì)直接減)
1111 1111(8個(gè)1就是ff,所以ff在十進(jìn)制中代表-1)

0000 0100
1111 1011
------------------------ 異或(如果不考慮進(jìn)位,異或就可以直接出結(jié)果)
1111 1111

0000 0100
1111 1011
------------------------ 與運(yùn)算(判斷進(jìn)位),如果與運(yùn)算結(jié)果為0,那么就沒(méi)有進(jìn)位。
0000 0000

最終結(jié)果
1111 1111 (十六進(jìn)制的ff,十進(jìn)制的-1)

舉個(gè)例子:
乘法: x * y,本質(zhì)就是y個(gè)x相加,還是加法。
除法: x / y,本質(zhì)就是減法,就是x能減去多少個(gè)y。

結(jié)論:
計(jì)算機(jī)只會(huì)做加法!

9.匯編語(yǔ)言環(huán)境說(shuō)明

目前為止,我們可以從零設(shè)計(jì)一套自己的進(jìn)制規(guī)則。自己設(shè)計(jì)電路來(lái)實(shí)現(xiàn)加減乘除。但是最終乘除的結(jié)果是一個(gè)二進(jìn)制,例如:我們有32個(gè)燈泡,就可以顯示32個(gè)數(shù)值,最終亮起燈泡的數(shù)就是最終的結(jié)果。手動(dòng)轉(zhuǎn)換這個(gè)結(jié)果和值?。ㄊM(jìn)制和二進(jìn)制的轉(zhuǎn)換)

機(jī)器語(yǔ)言并不會(huì)做很多事情,它很“笨”。機(jī)器語(yǔ)言說(shuō)白了就是位運(yùn)算,(加減乘除)
都是電路來(lái)實(shí)現(xiàn)的。這就是計(jì)算機(jī)最底層的本質(zhì)。

但是,我們發(fā)現(xiàn),學(xué)完了這些東西依舊是不懂,只是對(duì)現(xiàn)在的程序做了一些提高的理解。但是想通過(guò)理解寫(xiě)程序?qū)懖怀鰜?lái),難道我們真的寫(xiě)不出來(lái)嗎?

通過(guò)機(jī)器語(yǔ)言來(lái)實(shí)現(xiàn)加法計(jì)算器,這就是設(shè)計(jì)電路。

我們通過(guò)指令來(lái)代替我們的一些二進(jìn)制編碼!比如說(shuō):剛才的加法運(yùn)算是通過(guò)各種操作能否通過(guò)一個(gè)符號(hào)計(jì)算呢?比如說(shuō)我就想叫它(ADD指令),假設(shè)我給計(jì)算機(jī)發(fā)一個(gè)ADD指令,它通過(guò)識(shí)別我的指令轉(zhuǎn)換成機(jī)器語(yǔ)言(也就是編譯)ADD指令轉(zhuǎn)換為二進(jìn)制操作。

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

匯編語(yǔ)言說(shuō)白了,底層還是二進(jìn)制,但是二進(jìn)制寫(xiě)起來(lái)太麻煩了。這個(gè)時(shí)候我們通過(guò)匯編指令給計(jì)算機(jī)發(fā)一些操作,然后讓計(jì)算機(jī)執(zhí)行。這個(gè)地方就要涉及到編譯器!因?yàn)槲覀冋f(shuō)的編譯命令不是機(jī)器直接能識(shí)別的,需要把命令轉(zhuǎn)碼,轉(zhuǎn)成計(jì)算機(jī)認(rèn)識(shí)的信息,不然沒(méi)法識(shí)別。這個(gè)時(shí)候就涉及到編譯器的發(fā)展。

如果學(xué)底層,一定不要用特別智能的編譯器(IDEA,VSCODE等),就是用越遠(yuǎn)古的越好(記事本,vim等)。很多人學(xué)習(xí)C語(yǔ)言使用,用的是vim編輯器去寫(xiě)C語(yǔ)言,用gcc來(lái)執(zhí)行。這是學(xué)習(xí)C的正確方式。底層的大佬幾乎都是最原始的idea。

在學(xué)習(xí)匯編之前,先要掌握環(huán)境的配置:

Vc6(程序到匯編的理解,通過(guò)C語(yǔ)言實(shí)現(xiàn))

OD

抓包工具

加密解密工具

盡量不要使用java去學(xué)匯編,學(xué)完了匯編去學(xué)jvm就會(huì)覺(jué)得很簡(jiǎn)單。但是如果我學(xué)java再學(xué)匯編就有點(diǎn)痛苦,建議使用C++學(xué)匯編。因?yàn)镃++可以直接看到內(nèi)存的地址,可以打印通過(guò)指針直接找到內(nèi)存的地址,通過(guò)地址判斷信息。

學(xué)匯編不是為了寫(xiě)代碼,就是為了理解程序的本質(zhì)。
如果懂匯編,就能夠理解所有復(fù)雜的概念。

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

如果我們是一個(gè)做應(yīng)用的程序員,別人調(diào)試不了的程序,如果學(xué)過(guò)匯編,都可以調(diào)試。因?yàn)橹赖讓佣褩5降鬃隽耸裁?。如果是做安全的(反外掛,反病毒),就要理解匯編到二進(jìn)制的全部知識(shí)。

現(xiàn)在的計(jì)算機(jī)至少是32位,還有的是64位。我們要知道,它是由32位演化過(guò)來(lái)的。底層架構(gòu)沒(méi)有發(fā)生變化,只是多了寄存器,主要是尋址能力增加。

匯編入門: 了解匯編和程序的對(duì)應(yīng)關(guān)系,程序的本質(zhì)即可。

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

學(xué)會(huì)了這些,不理解的java原碼就理解了。匯編非常重要!這對(duì)我們向上學(xué)習(xí)有很大的幫助。有些編程技術(shù)學(xué)進(jìn)不去,很大原因就是因?yàn)榈讓硬粔颉5讓泳嗽趯W(xué)習(xí)編程語(yǔ)言就發(fā)現(xiàn)太輕松了!

10.寄存器的理解

學(xué)習(xí)匯編,要學(xué)習(xí)三個(gè)重要的概念:

寄存器

內(nèi)存

匯編指令

通用寄存器:可以存儲(chǔ)任何值

存儲(chǔ)數(shù)據(jù):CPU>內(nèi)存>硬盤
CPU分為32位和64位。

32位:8 16 3264位:8 16 32 64

32位的通用寄存器只有8個(gè):

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

寄存器中的存值范圍:0 ~ FFFFFFFF

計(jì)算機(jī)如何向寄存器中存值呢?
對(duì)于二進(jìn)制來(lái)說(shuō),就是直接修改值。但是修改值需要找到對(duì)應(yīng)的位置,所以才有內(nèi)存地址。

mov指令

mov  存的地址,存的數(shù)
mov  存的地址1,存的地址1

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

可以將數(shù)字寫(xiě)入到寄存器,可以將寄存器中的值,寫(xiě)到寄存器。

計(jì)算機(jī)的本質(zhì):計(jì)算力! 就是為了計(jì)算?。ㄊ髽?biāo)光標(biāo)在移動(dòng)都是在計(jì)算)

不同的寄存器:

32位代表八個(gè)F(FFFF FFFF),一個(gè)F代表4位(1111)
		FFFF	FF    
32位    16位    8位
EAX     AX		AL
ECX		CX		CL
EDX		DX		DL
EBX		BX		BL
ESP		SP		AH
EBP		BP		CH
ESI		SI		DH
EDI		DI		BH

對(duì)于8位:L代表低8位,H代表高8位
16位是FFFF 高八位占前兩個(gè)FF,低八位占后兩個(gè)FF

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

除了這些通用寄存器之外,那么其他的寄存器每一位都有自己特定的功能(比如:開(kāi)機(jī)關(guān)機(jī))。
我們一般寫(xiě)值都會(huì)寫(xiě)到通用寄存器中。

11.內(nèi)存

寄存器很小,而且不夠用。所以我們會(huì)把數(shù)據(jù)放到內(nèi)存中。

有句話:每個(gè)應(yīng)用程序進(jìn)程都有4GB的內(nèi)存空間。 程序用的內(nèi)存就是空頭支票,雖然每個(gè)應(yīng)用程序的進(jìn)程都有4GB內(nèi)存空間,但是真正到機(jī)器上使用時(shí)候并沒(méi)有那么大。

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

程序真正運(yùn)行的時(shí)候,才會(huì)用到物理內(nèi)存。

1B = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB

假設(shè)是4GB內(nèi)存電腦,就等于4096m => 最終計(jì)算為位,就是可以存儲(chǔ)的最大容量。
計(jì)算機(jī)中的內(nèi)存地址很多,空間很大。

內(nèi)存地址:
存一個(gè)數(shù):占用大小,數(shù)據(jù)寬度。存到哪里呢?

計(jì)算機(jī)中的內(nèi)存地址很多,空間很大。我們要給空間取名字,每個(gè)空間分配一個(gè)地址,名字。

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

這些給內(nèi)存起的編號(hào)就是我們的內(nèi)存地址。32位(8個(gè)十六進(jìn)制的值)

32位:決定尋址能力!
FFFFFFFF + 1 = 100000000,最大的值。
位是怎么限制內(nèi)存大小呢?
100000000 內(nèi)存地址 * 8位 :800000000。
轉(zhuǎn)換為十進(jìn)制 / 8:4,294,967,296字節(jié)。
按照規(guī)則/1024最終發(fā)現(xiàn)就是 4GB(不能超過(guò))。
64位,綽綽有余。

所以每個(gè)內(nèi)存地址都有一個(gè)編號(hào):可以通過(guò)編號(hào)向里面存值

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

很多人學(xué)C語(yǔ)言搞不懂指針,原因就是 不懂內(nèi)存。

內(nèi)存如何存值?(mov指令)
存值需要知道數(shù)據(jù)寬度(byte word dword),地址位置(自定義:0xFFFFFFFF)
不是任意的地址都可以寫(xiě)東西,只有程序申請(qǐng)過(guò)的內(nèi)存地址我們才可以使用。

匯編如何向內(nèi)存中寫(xiě)值:
mov  數(shù)據(jù)寬度  內(nèi)存地址,1

mov  byte ptr ds:[0x19ff70],1

傳遞的值的大小一定要和數(shù)據(jù)寬度要相等,如果大放不進(jìn)去。

匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析

內(nèi)存地址有多種寫(xiě)法:

ds:[0x19FF70+4](內(nèi)存地址偏移):加 偏移(4),地址就變成了:0x19FF74ds:[eax](寄存器):把寄存器中的值放到內(nèi)存中。ds:[eax + 4](寄存器偏移)

以數(shù)組為例:
ds:[reg + reg * {1,2,4,8}]
ds:[reg + reg * {1,2,4,8} + 4] 偏移

關(guān)于“匯編語(yǔ)言中計(jì)算機(jī)底層技術(shù)原理的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI