匯編基礎介紹——ARMv8指令集(四)

一、CMP 指令

CMP 指令用來比較兩個數的大小。在 A64 指令集的實現中,CMP 指令內部調用 SUBS 指令來實現。

1.1、使用立即數的 CMP 指令

使用立即數的 CMP 指令的格式如下。

CMP <Xn|SP>, #<imm>{, <shift>}

上述指令等同于如下指令。

SUBS XZR, <Xn|SP>, #<imm> {, <shift>}

1.2、使用寄存器的 CMP 指令

使用寄存器的 CMP 指令的格式如下。

CMP <Xn|SP>, <R><m>{, <extend> {#<amount>}}

上述指令等同于如下指令。

SUBS XZR, <Xn|SP>, <R><m>{, <extend> {#<amount>}}

1.3、使用移位操作的 CMP 指令

使用移位操作的 CMP 指令的格式如下。

CMP <Xn>, <Xm>{, <shift> #<amount>}

上述指令等同于如下指令。

SUBS XZR, <Xn>, <Xm> {, <shift> #<amount>}

1.4、CMP 指令與條件操作后綴

CMP 指令常常和跳轉指令與條件操作后綴搭配使用,例如條件操作后綴 CS 表示是否發生了無符號數溢出,即 C 標志位是否置位,0 表示 C 標志位沒有置位。

如下代碼使用 CMP 指令來比較如下兩個寄存器。

cmp x1, x2
b.cs label

CMP 指令判斷兩個寄存器是否觸發無符號溢出的計算公式與 SUBS 指令類似:

X1 + NOT(X2) + 1 

如果上述過程中發生了無符號數溢出,那么 C 標志位會置 1,則 b.cs 指令將會跳轉到 label 處。

下面的代碼用來比較 3 和 2 兩個立即數。

my_test:mov x1, #3mov x2, #21:cmp x1, x2b.cs 1bret

至于如何比較,需要根據 b 指令后面的條件操作后綴來定。CS 表示判斷是否發生無符號數溢出。根據 CMP 指令的運算公式可得,3 + NOT(2) +1,其中 NOT(2)把立即數 2 按位取反,取反后為 0xFFFFFFFFFFFFFFFD。 3 + 0xFFFFFFFFFFFFFFFD + 1 的最終結果為 1,這個過程中發生了無符號數溢出,C 標志位為 1。所以,b.cs 的判斷條件成立,跳轉到標簽 1 處,繼續執行。

二、移位指令

常見的移位指令如下。

  • LSL:邏輯左移指令,最高位會被丟棄,最低位補 0,如下(a)圖所示。
  • LSR:邏輯右移指令,最高位補 0,最低位會被丟棄,如下(b)圖所示。
  • ASR:算術右移指令,最低位會被丟棄,最高位會按照符號進行擴展,如下(c)圖所示。
  • ROR:循環右移指令,最低位會移動到最高位,如下(d)圖所示。

如下代碼使用了 ASR 和 LSR 指令。

ldr w1, =0x8000008a
asr w2, w1, 1
lsr w3, w1, 1

在上述代碼中,ASR 是算術右移指令,把 0x8000008A 右移一位并且對最高位進行有符號擴展,最后結果為 0xC0000045。LSR 是邏輯右移指令,把 0x8000008A 右移一位并且在最高位補 0,最后結果為 0x40000045。

三、位操作指令

3.1、與操作指令

與操作主要有兩條指令。

  • AND:按位與操作。
  • ANDS:帶條件標志位的與操作,影響 Z 標志位。

3.1.1、AND 指令

AND 指令的格式如下。

AND <Xd|SP>, <Xn>, #<imm>
AND <Xd>, <Xn>, <Xm>{, <shift> #<amount>}

AND 指令支持兩種方式。

  • 立即數方式:對 Xn 寄存器的值和立即數 imm 進行與操作,把結果寫入 Xd/SP 寄存器中。
  • 寄存器方式:先對 Xm 寄存器的值移位操作,然后再與 Xn 寄存器的值進行與操作,把結果寫入 Xd/SP 寄存器中。

指令參數說明如下:

shift 表示移位操作,支持 LSL、LSR、ASR 以及 ROR。

amount 表示移位數量,取值范圍為 0~63。

3.1.2、ANDS指令

ANDS 指令的格式如下。

ANDS <Xd>, <Xn>, #<imm>
ANDS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}

ANDS 指令支持兩種方式。

  • 立即數方式:對 Xn 寄存器的值和立即數 imm 進行與操作,把結果寫入 Xd/SP 寄存器中。
  • 寄存器方式:先對 Xm 寄存器的值做移位操作,然后再與 Xn 寄存器的值進行與操作,把結果寫入 Xd/SP 寄存器中。

指令參數說明如下。

shift 表示移位操作,支持 LSL、LSR、ASR 以及 ROR。

amount 表示移位數量,取值范圍為 0~63。

與 AND 指令不一樣的地方是它會根據計算結果來影響 PSTATE 寄存器的 N、 Z、 C、 V 標志位。

如下代碼使用 ANDS 指令來對 0x3 和 0 做“與”操作。

mov x1, #0x3
mov x2, #0ands x3, x1, x2
mrs x0, nzcv

“與”操作的結果為 0。通過讀取 NZCV 寄存器,我們可以看到其中的 Z 標志位置位了。

3.2、或操作指令

3.2.1、ORR指令

ORR(或)操作指令的格式如下。

ORR <Xd|SP>, <Xn>, #<imm>
ORR <Xd>, <Xn>, <Xm>{, <shift> #<amount>}

ORR 指令支持兩種方式。

  • 立即數方式:對 寄存器的值與立即數 Xn imm 進行或操作。
  • 寄存器方式:先對 Xm 寄存器的值做移位操作,然后再與 Xn 寄存器的值進行或操作。

指令參數說明如下。

shift 表示移位操作,支持 LSL 、LSR 、ASR 以及 ROR。

amount 表示移位數量,取值范圍為 0~63。

3.2.2、EOR指令

EOR (異或)操作指令的格式如下。

EOR <Xd|SP>, <Xn>, #<imm>
EOR <Xd>, <Xn>, <Xm>{, <shift> #<amount>}

EOR 指令支持兩種方式。

  • 立即數方式:對 Xn 寄存器的值與立即數 imm 進行異或操作。
  • 寄存器方式:先對 Xm 寄存器的值做移位操作,然后再與 Xn 寄存器的值進行異或操作。

指令參數說明如下。

shift 表示移位操作,支持 LSL 、LSR 、ASR 以及 ROR。

amount 表示移位數量,取值范圍為 0~63。

異或操作的真值表如下。

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

從上述真值表可以發現 3 個特點。

  • 0 異或任何數 = 任何數。
  • 1 異或任何數 = 任何數取反。
  • 任何數異或自己都等于 。

利用上述特點,異或操作有如下幾個非常常用的場景。

使某些特定的位翻轉。

例如, 想把 0b10100001 的第 2 位和第 3 位翻轉, 則可以對該數與 0b00000110 進行按位異或運算。

10100001 ^ 00000110 = 10100111

交換兩個數。

例如,交換兩個整數 a=0b10100001 和 b=0b00000110 的值可通過下列語句實現。

a = a^b; //a=10100111
b = b^a; //b=10100001
a = a^b; //a=00000110

在匯編程序里把變量設置為 。

eor x0, x0

判斷兩個整數是否相等。

bool is_identical(int a, int b)
{return ((a ^ b) == 0);
}

3.3、位清除操作指令

BIC (位清除操作)指令指令用于將寄存器中的某些位清零,而保持其他位不變。其核心作用是選擇性地清除(置 0)特定位置的位,常用于權限屏蔽、標志位清除等場景。其格式如下。

BIC <Xd>, <Xn>, <Xm>{, <shift> #<amount>}

BIC 指令支持寄存器方式: 先對 Xm 寄存器的值做移位操作, 然后再與 Xn 寄存器的值進行位清除操作。

指令參數說明如下。

shift 表示移位操作,支持 LSL 、LSR 、ASR 以及 ROR。

amount 表示移位數量,取值范圍為 0~63。

BIC 指令的本質是:

Xd = Xn & (~Xm)
  • 將掩碼 Xm 按位取反。
  • 將源寄存器(Xn)與取反后的掩碼進行按位與操作。

掩碼中為 1 的位會清除對應位,為 0 的位保持不變。

3.4、CLZ 指令

CLZ 指令的格式如下。

CLZ <Xd>, <Xn>

CLZ 指令計算為 1 的最高位前面有幾個為 0 的位。

如下代碼使用了 CLZ 指令。

ldr x1, =0x1100000034578000
clz x0, x1

X1 寄存器里為 1 的最高位是第 60 位,前面還有 3 個為 0 的位,最終 X0 寄存器的值為 3。

四、位段操作指令

4.1、位段插入操作指令

BFI 指令的格式如下。

BFI <Xd>, <Xn>, #<lsb>, #<width>

BFI 指令的作用是用 Xn 寄存器中的 Bit[0, width - 1]替換 Xd 寄存器中的 Bit[lsb, lsb + width - 1], 寄存器中的其他位不變。

BFI 指令常用于設置寄存器的字段。

如下代碼將寄存器 X1 的低 4 位插入到寄存器 X0 的第 8~11 位(共 4 位)。

BFI X0, X1, #8, #4  ; 將X1的低4位插入到X0的第8~11位

步驟解析

  • 假設初始值
    • X0 = 0xFFFFFFFFFFFFFFFF(全 1)。
    • X1 = 0x000000000000000F(低 4 位為 1,其余為 0)。
  • 提取源位段
    • X1 的低 4 位為 0b1111
  • 清除目標位段
    • X0 的第 8~11 位被清零,變為 0xFFFFFFF0FFFFFF
  • 插入位段
    • 源位段 0b1111 左移 8 位后為 0x0000000000000F00
    • 合并后 X0 = 0xFFFFFFF0FFFFFF | 0x0000000000000F00 = 0xFFFFFFF0FFFFFFFF

4.2、位段提取操作指令

UBFX 指令的格式如下。

UBFX <Xd>, <Xn>, #<lsb>, #<width>


?

UBFX 指令的作用是提取 Xn 寄存器的 Bit[lsb, lsb + width - 1],然后存儲到 Xd 寄存器中。

UBFX 還有一個變種指令 SBFX,它們之間的區別在于:SBFX 會進行符號擴展,例如,如果 Bit[lsb + width - 1] 為 1,那么寫到 Xd 寄存器之后,所有的高位都必須寫 1,以實現符號擴展。

UBFX 和 SBFX 指令常常用于讀取寄存器的某些字段。

如下代碼從寄存器 X1 的第 8~15 位(共 8 位)提取值,并零擴展到 X0。

UBFX X0, X1, #8, #8  ; 提取X1的第8~15位,存入X0

步驟解析

  • 假設初始值
    • X1 = 0x0000000000FF00FF(二進制 0b0000...0000111111110000000011111111)。
  • 提取位段
    • 第 8~15 位為 0b00000000(值為 0)。
  • 零擴展
    • 提取的 8 位右移至最低位,左側補零,結果為 0x0000000000000000
  • 存入目標寄存器
    • X0 = 0x0000000000000000

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

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

相關文章

深入剖析 Electron 性能瓶頸及優化策略

Electron 是一個流行的跨平臺桌面應用開發框架&#xff0c;基于 Chromium 和 Node.js&#xff0c;使得開發者可以使用 Web 技術&#xff08;HTML、CSS、JavaScript&#xff09;構建跨平臺的桌面應用。許多知名應用如 VS Code、Slack、Discord 和 Figma 都采用了 Electron。然而…

Qt的前端和后端過于耦合(0/7)

最近在寫一個軟件&#xff0c;這個軟件稍微復雜一些&#xff0c;界面大概需要十幾個&#xff0c;后端也是要開多線程讀各種傳感器數據。然后鼠鼠我呀就發現一個致命的問題&#xff0c;那就是前端要求的控件太多了&#xff0c;點一下就需要通知后端&#xff0c;即調用后端的函數…

碰一碰發視頻源碼搭建定制化開發:支持OEM

在移動互聯網與物聯網深度融合的當下&#xff0c;“碰一碰發視頻” 作為一種創新的信息交互方式&#xff0c;正逐漸應用于營銷推廣、產品展示、社交互動等多個領域。其核心在于通過近場通信技術&#xff08;如 NFC、藍牙&#xff09;實現設備間的快速連接&#xff0c;無需復雜操…

機器學習文本特征提取:CountVectorizer與TfidfVectorizer詳解

一、文本特征提取概述 在自然語言處理&#xff08;NLP&#xff09;和文本挖掘任務中&#xff0c;文本特征提取是將原始文本數據轉換為機器學習模型可以理解的數值特征的關鍵步驟。scikit-learn提供了兩種常用的文本特征提取方法&#xff1a;CountVectorizer&#xff08;詞頻統…

【PHP】.Hyperf 框架-collection 集合數據(內置函數歸納-實用版)

&#x1f4cc; Article::query()->where(article_id, 6)->select()->first()?? 進行數據結果的循環&#xff0c;遍歷 1.each() 方法遍歷集合中的項目并將每個項目傳遞給閉包&#xff0c;進行處理數據 Article::query()->get()->each(function ($item) {// 可…

巨獸的陰影:大型語言模型的挑戰與倫理深淵

當GPT-4這樣的龐然大物能夠流暢對話、撰寫詩歌、編寫代碼、解析圖像&#xff0c;甚至在某些測試中媲美人類專家時&#xff0c;大型語言模型&#xff08;LLM&#xff09;仿佛成為了無所不能的“智能神諭”。然而&#xff0c;在這令人目眩的成就之下&#xff0c;潛藏著復雜而嚴峻…

vue根據鏈接生成二維碼 qrcode

vue根據鏈接生成二維碼 qrcode js 需求&#xff1a;后端返回一個完整鏈接&#xff0c;前端根據鏈接生成一個二維碼 1、安裝qrcode插件 npm install qrcode2、引入qrcode,并且使用完整代碼 <template> <div><img :src"qrcodeData" class"qrcode…

C# 事件(源代碼組件概覽)

源代碼組件概覽 需要在事件中使用的代碼有5部分&#xff0c;如圖15-4所示&#xff0c;后文會依次進行介紹。這些組件如下 所示 委托類型聲明事件和事件處理程序必須有共同的簽名和返回類型&#xff0c;它們通過委托類型 進行描述。事件處理程序聲明訂閱者類中會在事件觸發時執…

音視頻會議服務搭建(設計方案-數據庫sql)-02

前言 銜接上篇文章&#xff0c;這篇是相關的表結構sql語句記錄 EchoMeet 會議系統數據庫表結構設計 &#x1f4cb; 設計概述 本文檔定義了EchoMeet音視頻會議系統的完整數據庫表結構&#xff0c;采用微服務架構設計&#xff0c;支持高并發、可擴展的會議場景。 &#x1f3af…

MCPA2APPT 智能化演示文稿系統:A2A、MCP、ADK 三大架構全流程自動化

&#x1f680; 項目名稱 MCPA2APPT / MultiAgentPPT —— 一站式 A2A MCP ADK 多智能體并發 PPT 生成解決方案 MCPA2APPT 是一款開源 AI PPT 創作神器&#xff0c;基于 A2A&#xff08;Ask-to-Answer&#xff09;、MCP&#xff08;Multi-agent Control Protocol&#xff09;和…

pyinstall打包mysql-connector-python后運行報錯的問題!

簡單的測試代碼 # main.py import mysql.connectorDB_HOSTlocalhost DB_PORT3306 DB_NAMElover DB_USERroot DB_PASSWORDxxxx# 連接數據庫 connection mysql.connector.connect(hostDB_HOST,portDB_PORT,databaseDB_NAME,userDB_USER,passwordDB_PASSWORD)if connection.is_c…

應對高并發:淘寶商品評論實時數據 API 高效接入開發實踐

在電商平臺的運營中&#xff0c;商品評論數據是用戶決策、商家優化及平臺運營的重要依據。淘寶作為國內領先的電商平臺&#xff0c;其商品評論數據具有實時性強、數據量大、并發訪問頻繁等特點。本文將圍繞淘寶商品評論實時數據 API 的高效接入展開&#xff0c;探討在高并發場景…

踩坑日記:虛擬機橋接模式無法連接網卡

對于一名網安學生&#xff0c;我們滲透測試一般是需要虛擬機使用橋接模式。 但是vm直接設置成橋接模式并不能上網。還要進行如下配置 改一下這個橋接的地方。改成我們主機的網卡。 如何查看主機網卡呢&#xff1f; 設置搜索網絡

Android 系統默認的Launcher3,Android 系統的導航欄(通常是屏幕底部)顯示的 4 個快捷應用圖標,如何替換這4個應用圖標為客戶想要的。

Android 系統默認的Launcher3, Android 系統的導航欄(通常是屏幕底部)顯示的 4 個快捷應用圖標, 如何替換這4個應用圖標為客戶想要的。 開發云 - 一站式云服務平臺 按如下方式可以修改應用圖標。 diff --git a/packages/apps/Launcher3/res/xml/default_workspace_5x6_no_a…

maker-pdf 文檔文字識別,并用python實現

下面我將詳細講解maker-pdf文檔文字識別的技術原理、特點&#xff0c;并提供完整的Python實現代碼及優化方案。內容結合最新文檔和OCR技術實踐&#xff0c;適合開發者直接集成到項目中。 一、maker-pdf 核心技術解析 maker-pdf是基于深度學習的端到端OCR工具鏈&#xff0c;專…

Go基礎(Gin)

go mod init my-gin-app 初始化一個 Go 項目&#xff0c;創建一個go.mod文件go mod tidy 自動整理項目依賴&#xff0c;確保go.mod和go.sum文件與代碼實際使用的依賴一致go mod init&#xff1a;創建項目的 “依賴說明書”。go mod tidy&#xff1a;整理 “說…

21、鴻蒙學習——使用App Linking實現應用間跳轉

簡介 使用App Linking進行跳轉時&#xff0c;系統會根據接口傳入的uri信息&#xff08;HTTPS鏈接&#xff09;將用戶引導至目標應用中的特定內容&#xff0c;無論應用是否已安裝&#xff0c;用戶都可以訪問到鏈接對應的內容&#xff0c;跳轉體驗相比Deep Linking方式更加順暢。…

Cursor無限郵箱續費方法

1.注冊無限郵箱2925 2.“其他郵箱” 3.點擊左下角添加郵箱 4.管理員身份運行Windos PowerShell 5.輸入該指令并運行&#xff0c;修改機器碼 irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/…

LeetCode Hot100(圖論)

200. 島嶼數量 題意 給你一個由 1&#xff08;陸地&#xff09;和 0&#xff08;水&#xff09;組成的的二維網格&#xff0c;請你計算網格中島嶼的數量。 島嶼總是被水包圍&#xff0c;并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。 此外&#xff0c;你…

Ubuntu Gnome 安裝和卸載 WhiteSur-gtk-theme 類 Mac 主題的正確方法

WhiteSur-gtk-theme 是一個流行的 GNOME 桌面主題&#xff0c;可以讓 Ubuntu 的桌面環境看起來像 macOS。以下是安裝和卸載 WhiteSur-gtk-theme 的詳細步驟&#xff0c;包括解釋每個命令的作用。 一、安裝 WhiteSur-gtk-theme 1. 準備工作 在安裝主題之前&#xff0c;建議確…