日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

马士兵JVM 精讲笔记(一)

發布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 马士兵JVM 精讲笔记(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文和后文中講的都是32位機,也就是i386的系統

計算機語言(機器語言)可以通過0和1生成機器指令,將指令輸入到cpu 來執行,通過機器指令計算機可以實現各種各樣的功能,而機器語言又分為操作碼和操作數,假如:

int a = 1;

生成的機器碼為(下面是隨便輸的):

101010(操作碼) 10101010101011011111(操作數)

其中就包含了操作碼和操作數,在內存當中每一個基礎執行單元為8位,1byte(字節)等于8bit(位),而int a 是四字節,所以在內存當中開辟空間的時候會在內存中開辟4byte的空間,而在開辟內存的過程中,必須指定內存的地址,此時就引出的高地址和低地址的概念。

高地址和低地址

可以簡單的認為,可以把主存看成一本空白的作業本,內存地址就相當于主存的頁碼,你現在要在筆記本上記錄一些內容,他的頁碼排序是

第一頁 : 0x0000001 第二頁 : 0x0000002 ... 最后一頁: 0x0000092


1 如果你選擇`從前向后記錄`(用完第一頁,用第二頁,類推)這就是先使用低地址,后使用高地址.

0x0000001 -> 0x0000002-> ... -> 0x0000092

業內有這樣表述:動態分配內存時堆空間向高地址增長,說的就是這種情況.
這個向高地址增長就是先使用低地址,后使用高地址的意思.


2 如果你選擇`從后往前記錄`(先用筆記本的最后一頁,用完后使用倒數第二頁,類推) 這就是先使用高地址,后使用低地址

0x0000092 -> ... ->0x0000002 -> 0x0000001

業內表述:`0xbfac 5000-0xbfad a000`是棧空間,其中高地址的部分保存著進程的環境變量和命令行參數,低地址的部分保存函數棧幀,**棧空間是向低地址增長的**.
這個向低地址增長就是先使用高地址,后使用低地址的意思.

棧底(棧基址)和棧頂

通過上面的高地址和低地址我們明白,在內存中是以類似于數組的方式存儲數據,而0x0000092之類的數值代表了數據在內存中的位置,也就是我們的內存地址(類似于下標),我們如果要找到指定的數據,就必須在CPU當中存儲棧底和棧頂的地址,這時就牽扯到了CPU的寄存器

SP寄存器(stack pointer) 和BP寄存器(base pointer)

SP寄存器存儲了棧頂的地址,而BP寄存器則存儲了棧底的地址初始狀態下內存中不存在數據,棧頂和棧底指向了同一個位置(就像數組第一個下標是0,最后一個下標也是零,第一個下標相當于棧頂,最后一個下標相當于棧底),當我們需要在內存中開辟一個空間的時候,通過sp寄存器的位置減去要開辟的內存空間,如果寫成匯編代碼則可以如下表示:

例如:上面的int a 為四字節,所以要在內存中開辟四字節的空間,所以SP 寄存器的減去4個字節,則相當于在內存中開辟了4字節的內存空間

sub 4,sp

sub在英文中代表了減,我們就可以看出在內存中減去了四個字節,而在內存中存放數據的時候是存在指定的順序的,這里就引出了一個關鍵知識點:字節序。

字節序

字節序分為大端序和小端序,我們的內存也存在高低之分,越往右是低,越往左是高,低位置叫做小端序,高位置叫做大端序,而大端序和小端序則是代表了內存的兩種排序規則。

大端序(英:big-endian)或稱大尾序。,數據以8bit為單位:

地址增長方向??→

0x0A0x0B0x0C0x0D

小端序(英:little-endian)或稱小尾序。數據以8bit為單位:

0x0D0x0C0x0B0x0A

Inter 64 位和AI 32 位的處理器使用的都是小端序

Inter 寄存器的變遷

在1978年Inter 處理器為16位,SP 寄存器和BP寄存器的名稱并沒有變化,在之后處理變為了32位后,SP寄存器和BP寄存器則被稱為ESP 寄存器和EBP寄存器,也就是擴展的SP和BP寄存器,而64位將E改為了R叫做RBP和RSP寄存器。

高八位和低八位

以EBP寄存器為例:一個EBP由兩個BP組成,而我們的數據越往右越低,所以EBP寄存器中往左的16位為高16位,往右的16位為低16為。AX 寄存器為通用寄存器,為16位寄存器,變成32位,被稱為EAX,變成64位被稱為RAX,一個16位可以表示成兩個八位,往左的8位為高八位,往右的8位為高八位,將AX中的X替換為H 和 L,AH代表高八位,AL代表低八位,X 在這里代表了未知數。

再來看匯編

因為本文研究的是32位機,所以寄存器的名稱為ESP和EBP,那此時int a = 1;我們在內存中開辟一塊空間,使用匯編語言可以這樣寫:

sub 4,esp mov 1,-4(ebp)

mov 1,-4(ebp)表示將數值1 移動到-4的ebp位置。

總結

以上是生活随笔為你收集整理的马士兵JVM 精讲笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。