openjdk底層匯編指令調用(一)——匯編指令及指令編碼基礎

匯編指令

計算機在執行過程時只識別代表0或者1的電信號。因此為了讓計算機能夠執行則須向計算機輸入一系列01構成的指令。
例如在x64平臺下,0x53,二進制為01010011,表示將rbx寄存器中的值壓棧。
但是,對于程序員而言,如果每個操作都用二進制數來表示(早期的程序員確實是這樣)則會帶來2個問題。

  1. 容易出錯
  2. 不方便記憶
    為了避免上述的錯誤,各廠商定義了一系列由英文關鍵字用來表示二進制指令,這些關鍵字構成的指令稱為匯編指令,或者匯編語言。
    例如,上述0x53在x64下的匯編指令為
push %rbx

如果將上述匯編指令寫入匯編文件(.s),經過編譯器(gcc)編譯后,形成了可被執行的二進制文件,該文件中的對應位置將push %rbx轉換為0x53
此時,如果CPU中執行上述指令時,則會將rbx的值壓棧。

總而言之,push %rbx一定會轉為唯一的二進制指令讓CPU執行。

指令編碼

上述的匯編指令由英文構成,其中開始部分的關鍵字稱為助記符(mnemonic),后面的被操作對象稱為操作數。編譯器將根據助記符和操作數按照一定的規則將其翻譯成唯一的二進制數供CPU執行。
每個廠商由于其指令集的區別(CISC:復雜指令集;RISC:精簡指令集)而有各自的編碼規則。
根據x64的手冊,其push %rbx的編碼規則如下
在這里插入圖片描述
push代表0x50
reg64由%rbx代替,而rbx寄存器中x64架構下的編碼為0x3,因此,將二者相加后最終的編碼結果為0x53

匯編轉換規則

根據上述描述可發現,匯編指令轉二進制指令根據的是助記符和操作碼的值進行編制。首先需確定助記符的值,該值在二進制指令中被稱為操作碼,后面緊跟的值是操作數。每個廠商編制了各自的編碼規則。
例如,假設一個寄存器加法指令。將一個寄存器(源寄存器)內的值與另一個寄存器(源寄存器)相加,將結果放入寄存器(目的寄存器)中。我們看看在x64指令下是如何編碼的。
在這里插入圖片描述
假設加法指令如下

add %rbx, %rax

則翻譯的機器碼為

48 01 D8

其翻譯規則如下

Byte(s)Meaning
48REX prefix: 64-bit operand size (REX.W = 1)|
01Opcode: ADD r/m64, r64 (adds second register to the first)
D8ModR/M byte: specifies registers → rbx to rax

關于x86的編碼規則,可參見我另一篇文章

AArch64ARM v8架構。其指令屬于RISC指令集。嵌入式系統,蘋果M系列芯片以及國產飛騰,鯤鵬等服務器芯片等采用該架構的指令集。如果是在AArch64下實現上述加法, 其寫法如下

add x0, x1, x2

由于AArch64指令與x86不是同一指令集,因此寄存器定義也不一致,只是廠商在定義加法指令時都采用了add助記符。上述指令的意思是將x1寄存器內的值加上x2寄存器內的值之后的結果放入x0寄存器。

AArch64針對上述指令的編碼如下
在這里插入圖片描述
由于AArch64的編碼規則較x86簡單,這里以AArch64為例進行說明。
根據手冊上的描述可以看出,對于64位機器,31位是1,Rm是x2,Rn是x1, Rd是x0的編碼。即2,1和0,其他位置按照規范不變,option和imm3規定了其他的行為,這里是單純的寄存器賦值,按照手冊全部為0

因此機器碼為

#二進制
10001011000 00010 000000 00001 00000#十六進制
0x8B020020
#小端編碼需要反轉
0x2000028B

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79388.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79388.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79388.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python Day 22 學習

學習講義Day14安排的內容:SHAP圖的繪制 SHAP模型的基本概念 參考學習的帖子:SHAP 可視化解釋機器學習模型簡介_shap圖-CSDN博客 以下為學習該篇帖子的理解記錄: Q. 什么是SHAP模型?它與機器學習模型的區別在哪兒? …

48.輻射發射RE和傳導發射CE測試方法分析

輻射發射RE和傳導發射CE測試方法分析 1. 所有測試項目總結2. 輻射發射RE測試方法3. 傳到發射CE測試方法 1. 所有測試項目總結 所有EMC測試項目都是基于模擬現實的。 模擬現實中可能發生的各種真實場景,然后統計總結出各種場景下的真實應力,并通過制造測…

在 Vue 3 中實現刮刮樂抽獎

🎉 在 Vue 3 中實現刮刮樂抽獎 當項目中需要做一些活動互動頁時,需要實現刮刮樂,請看如下效果: 這里感謝github用戶Choicc分享的組件,具體可點擊傳送門查看 1. 引入組件 將/src/components下ScratchCard.vue復制到自…

c語言第一個小游戲:貪吃蛇小游戲01

hello啊大家好 今天我們用一個小游戲來增強我們的c語言! 那就是貪吃蛇 為什么要做一個貪吃蛇小游戲呢? 因為這個小游戲所涉及到的知識有c語言的指針、數組、鏈表、函數等等可以讓我們通過這個游戲來鞏固c語言,進一步認識c語言。 一.我們先…

實戰項目1(02)

目錄 任務場景一 【sw1和sw2的配置如下】 任務場景二 【sw3的配置】 【sw4-6的配置】 任務場景一 某公司有生產、銷售、研發、人事、財務等多個部門,這些部門分別連接在兩臺交換機(SW1和SW2)上,現要求給每個部門劃分相應的V…

Kubernetes生產實戰(十四):Secret高級使用模式與安全實踐指南

一、Secret核心類型解析 類型使用場景自動管理機制典型字段Opaque (默認)自定義敏感數據需手動創建data字段存儲鍵值對kubernetes.io/dockerconfigjson私有鏡像倉庫認證kubelet自動更新.dockerconfigjsonkubernetes.io/tlsTLS證書管理Cert-Manager可自動化tls.crt/tls.keykube…

Linux: 信號【阻塞和捕捉信號】

Linux: 信號【阻塞和捕捉信號】 (一)阻塞信號1.信號其他相關的概念2.在內核中表示3.sigset_t4.信號集操作函數5.sigprocmask(設置阻塞)6.sigpending(得到未決狀態) (二)捕…

MySQL 數據庫集群部署、性能優化及高可用架構設計

MySQL 數據庫集群部署、性能優化及高可用架構設計 集群部署方案 1. 主從復制架構 傳統主從復制:配置一個主庫(Master)和多個從庫(Slave)GTID復制:基于全局事務標識符的復制,簡化故障轉移半同步復制:確保至少一個從庫接收到數據…

Java 多態:原理與實例深度剖析

一、多態概述 在 Java 面向對象編程體系中,多態是構建靈活、可擴展程序的核心機制之一,與封裝、繼承并稱為面向對象的三大特性。其本質是同一操作作用于不同對象,產生不同的執行結果,這使得程序在運行時能根據實際對象類型動態調…

解決使用寶塔Linux部署前后端分離項目遇到的問題

問題一:訪問域名轉圈圈,顯示404,403 沒有解決跨域問題,在后端yml中設置content:/prod(生產環境),在前端.env文件中將http://127.0.0.1:8080/替換為公網IP,并在vite.conf…

《Python星球日記》 第54天:卷積神經網絡進階

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 目錄 一、深度CNN架構解析1. LeNet-5(1998)2. AlexNet&#x…

旅游設備生產企業的痛點 質檢系統在旅游設備生產企業的應用

在旅游設備制造行業,產品質量直接關系到用戶體驗與企業口碑。從景區纜車、觀光車到水上娛樂設施,每一件設備的安全性與可靠性都需經過嚴苛檢測。然而,傳統質檢模式常面臨數據分散、流程不透明、合規風險高等痛點,難以滿足旅游設備…

MySql(進階)

一.數據庫約束 約束類型 NOT NULL - 指示某列不能存儲 NULL 值。 (not null不能為NILL) UNIQUE - 保證某列的每行必須有唯一的值。 (unique唯一值) DEFAULT - 規定沒有給列賦值時的默認值。 (default為空給定默認值) PRIMARY…

Three.js + React 實戰系列 - 聯系方式提交表單區域 Contact 組件?(表單綁定 + 表單驗證)

對個人主頁設計和實現感興趣的朋友可以訂閱我的專欄哦!!謝謝大家!!! 在現代網頁中,一個精致的 Contact 區域不僅僅是表單的堆砌,更是用戶與我們建立聯系的第一印象。 在本節課中,我…

UOJ 164【清華集訓2015】V Solution

Description 給定序列 a ( a 1 , a 2 , ? , a n ) a(a_1,a_2,\cdots,a_n) a(a1?,a2?,?,an?),另有序列 h h h,初始時 h a ha ha. 有 m m m 個操作分五種: add ? ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v):…

C++開發過程中的注意事項詳解

目錄 C++開發過程中的注意事項詳解 一、內存管理:避免泄漏與資源浪費 1.1 使用智能指針管理動態內存 1.2 避免手動內存管理的陷阱 1.3 利用RAII機制管理資源 1.4 容器與內存分配 二、安全性:防御攻擊與未定義行為 2.1 輸入驗證與安全編碼 2.2 使用安全的通信協議 2…

Git 時光機:修改Commit信息

前言 列位看官都知道,Git 的每一次 git commit,其中會包含作者(Author)和提交者(Committer)的姓名與郵箱。有時可能會因為配置錯誤、切換了開發環境,或者只是單純的手滑,導致 commi…

QSFP+、QSFP28、QSFP-DD接口分別實現40G、100G、200G/400G以太網接口

常用的光模塊結構形式: 1)QSFP等效于4個SFP,支持410Gbit/s通道傳輸,可通過4個通道實現40Gbps傳輸速率。與SFP相比,QSFP光模塊的傳輸速率可達SFP光模塊的四倍,在部署40G網絡時可直接使用QSFP光模塊&#xf…

好用的播放器推薦

以下是一些好用的播放器推薦,按照不同平臺和使用場景分類: 電腦端 VLC Media Player 特點:開源、跨平臺,支持幾乎所有的音視頻格式,無需額外安裝解碼器。具備強大的功能,如播放列表管理、視頻和音頻濾鏡、…

Vue基礎(8)_監視屬性、深度監視、監視的簡寫形式

監視屬性(watch): 1.當被監視的屬性變化時,回調函數(handler)自動調用,進行相關操作。 2.監視的屬性必須存在,才能進行監視!! 3.監視的兩種寫法: (1).new Vue時傳入watch配置 (2).通過vm.$watc…