ARM 流控制指令

計算機按照嚴格的順序執行指令。流控制改變了默認的順序執行方式。前面已
經介紹了強制跳轉到程序中某個非順序位置的無條件分支。以及依據測試結果
進行跳轉的條件分支。這里將介紹子程序調用和返回指令,它們會跳轉到一個
指令塊、執行這些指令,然后返回到子程序調用指令后的一個位置來修改控制
流。

無條件分支

ARM無條件分支指令格式為B target,target指分支目標地址(branch target
address,BTA)。

下面代碼說明了如何使用無條件分支指令:
… do this ; 一些代碼
… then that ; 另一些代碼
B Next ; 跳過下面的指令
… ; …被略過的代碼
… ; …被略過的代碼
Next … ; 分支目標地址,由標號Next表示

在高級語言中,無條件分支叫作goto,它被認為是一種比較糟糕的編程風格。
然而,在匯編語言中,無條件分支是很難避免的。

條件分支

下面給出了高級語言中實現條件行為的典型例子:
IF(X == Y)
THEN Y = Y + 1
ELSE Y = Y + 2

ARM匯編語言表示:
CMP r1,r2 ; 假設r1包括y,r2包括x,將它們比較
BNE plus2 ; 如果不相等則跳轉到ELSE部分
ADD r1,r1,#1 ; 如果相等則繼續,y加1
B leave ; 現在跳過ELSE部分
plus2 ADD r1,r2,#2 ; ELSE部分,y加2
leave … ; 從這里繼續

條件分支指令測試處理器中條件碼寄存器中的標志位,如果測試結果為真則轉移成功
在這里插入圖片描述
在這里插入圖片描述
ARM有4條測試與比較指令CMP、CMN、TST、TEQ,這些指令會顯式更新條件
碼標志,因此無需在指令后添加S

相等測試指令TEQ

確定兩個操作數是否相等,如果相等將Z位置1,否則將Z位清0
如,指令TEQ r1,r2完成RTL操作[r1] – [r2],如果r1和r2相等,Z位被置1。

TEQ與CMP指令類似,測試時TEQ不影響溢出標志的狀態而僅修改Z位。相反地,
CMP會更新溢出標志。

比較指令CMP

用第一個源操作數減去第二個,然后更新條件碼。

如,指令CMP r1,r2計算[r1] – [r2],然后設置CPSR中的N、Z、C和V位。

測試指令TST

通過與操作來比較兩個操作數,然后根據結果更新標志位。可以用TST來測試一個字中的每一位。
如,由于小寫ASCII字母的第5位為1,所以通過下面的代碼來判斷r0中的ASCII字母是否為小寫字母:
TST r0,#2_00100000 ; r0與00100000進行與操作,測試第5位的狀態
BEQ LowerCase ; 如果第5位為1則跳轉到小寫字母處理部分

取負并比較指令CMN

在進行比較操作之前先將第二個源操作數取負。

如,指令CMN r1,r2計算[r1] - [-r2],然后設置CPSR。注意[r1] - [-r2]的值與[r1] +
[r2]的相同。

分支與循環結構

用經典的循環結構來介紹流控制概念是最合適的,循環是結構化編程的核心。

下面代碼說明了FOR、WHILE和UNTIL循環的結構

for

	MOV 	r0,#10		; 設置循環計數器
Loop	code	…		; 循環體SUBS	r0,r0,#1	; 循環計數器減1并設置狀態標志BNE	Loop		; 繼續直到計數值為0——不為0時跳轉Post	loop		; 計數值為0的后續代碼

while

Loop	CMP	r0,#0		; 循環開始執行測試BEQ	WhileExit		; 測試結果為true則退出code	…			; 循環體B	Loop		; 為true時重復

WhileExit Post loop … ; 退出

until

Loop	code	…		; 循環體CMP	r0,#0		; 循環末尾進行測試BNE	Loop		; 重復直到UNTIL為truePost	loop	…	; 退出

組合循環

組合循環將上面3中循環的特點結合在一起。
FOR部分指定了最大計數值,限制了循環的執行次數。
WHILE部分測試r1中的初始條件,如果條件不為true則立即退出。
UNTIL部分則在循環體末尾r2為true時退出。
MOV r0,#10 ; 設置循環計數器
LoopStart CMP r1,#0 ; 以WHILE測試開始
BEQ ComboExit ; 為true退出循環
code … ; 循環體
CMP r2,#0 ; 測試UNTIL條件
BEQ ComboExit ; 為true退出循環
SUBS r0,r0,#1 ; 循環計數器減1并設置狀態標志
BNE LoopStart ; 繼續直到計數器為0——不為0則轉移
ComboExit Post loop … ; 退出

條件執行

匯編語言程序員在指令助記符后添加合適的條件以指明條件執行模式
如:ADDEQ r1,r2,r3

指定僅當條件碼中的Z位因為前一個結果為0而被置為1時,加法操作才會被執行。
其RTL形式為:IF Z = 1
THEN [r1] <- [r2] + [r3]

條件執行和移位操作可以組合在一起,因為指令中的分支和移位字段是無關的
如:ADDCC r1,r2,r3 LSL r4
其RTL形式為:IF C = 0
THEN [r1] <- [r2] + [r3] X 2[r4]

ARM的條件執行模式使得在高級語言中實現條件操作更容易。
(1)考慮下面的C代碼段:
If(P == Q)
X = P – Y;

如果r1為P,r2為Q,r3為X,r4為Y,則可以寫為:
CMP	r1,r2		;  比較P == Q
SUBEQ	r3,r1,r4		; 為true則r3 = r1 - r4,為false,減法被轉換為空操作

考慮一個更復雜例子,一個帶有組合條件的C代碼段:
If((a == b) && (c == d))
e++;
可以寫為:
CMP r0,r1 ; 比較a == b
CMPEQ r2,r3 ; 如果a == b,則比較c == d
ADDEQ r4,r4,#1 ; 如果a == b且c == d,則e加1

不使用條件執行,則可寫為:CMP 	r0,r1		; 比較a == bBNE	Exit		; a !=b則退出CMP	r2,r3		; 比較c == dBNE	Exit		; c!=d則退出ADD	r4,r4,#1		; 否則e加1
Exit

處理一些帶有多個條件的C代碼段:
If(a == b) e = e + 4;
If (a < b) e = e + 7;
If(a > b) e = e + 12;

可以寫為:CMP 	r0,r1		; 比較a == bADDEQ	r4,r4,#4		; 如果a == b,則e = e + 4ADDLE	r4,r4,#7		; 如果a < b,則e = e + 7ADDGT	r4,r4,#12	; 如果a > b,則e = e + 12

不使用條件執行,則可寫為:

	CMP	r0,r1		; 比較a == bBNE	Test1		; 不相等則跳轉到Test1進行下一次測試ADD	r4,r4,#4		; a ==b,則e = e + 4B	ExitAll		; 退出
Test1	BLT	Test2		; 如果a < b,則跳轉到Tset2ADD	r4,r4,#12	; 此處a > b,因此e = e + 12B	ExitAll		; 退出
Test2	ADD	r4,r4,#7		; 此處a < b,因此e =e + 7
ExitAll	

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

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

相關文章

PDF內容搜索--支持跨文件夾多文件、組合詞搜索

平時我們接觸到的PDF文檔特別多&#xff0c;需要對PDF文檔做一些處理&#xff0c;那么今天給大家帶來的這兩個軟件非常的棒&#xff0c;可以幫你提升處理文檔的效率。 PDF內容搜索 快速檢索 我用夸克網盤分享了「PDF搜索PDF 轉長圖.zip」&#xff0c;點擊鏈接即可保存。打開「…

個人Unity自用面經(未完)

目錄標題 1.在 2D 平臺跳躍游戲項目中&#xff0c;你使用了對象池來生成和回收怪物包含陣亡的動畫預制件。在對象池回收對象時&#xff0c;如何確保動畫狀態被正確重置&#xff0c;避免下次使用時出現異常&#xff1f;2.在僵尸吃腦子模擬項目中&#xff0c;你創建了繼承于IAspe…

【計網】ICMP、IP、Ethernet PDU之間的封裝關系

TCP/IP體系結構 應用層RIP、OSPF、FTP運輸層TCP、UDP網際層IP、ARP、ICMP網絡接口層底層協議&#xff08;Ethernet&#xff09; 數據鏈路層 Ethernet報文格式 6Byte6Byte2Byte46~1500Byte4Byte目的MAC地址源MAC地址類型/長度數據FCS 其中&#xff0c;類型 / 長度值小于 1536…

前端取經路——入門取經:初出師門的九個CSS修行

大家好&#xff0c;我是老十三&#xff0c;一名前端開發工程師。CSS就像前端修行路上的第一道關卡&#xff0c;看似簡單&#xff0c;實則暗藏玄機。在今天的文章中&#xff0c;我將帶你一起應對九大CSS難題&#xff0c;從Flexbox布局到響應式設計&#xff0c;從選擇器優先級到B…

n8n工作流自動化平臺的實操:Cannot find module ‘iconv-lite‘

解決問題&#xff1a; 1.在可視化界面&#xff0c;執行const iconv require(iconv-lite);&#xff0c;報Cannot find module iconv-lite [line 2]錯誤&#xff1b; 查看module的路徑 進入docker容器 #docker exec -it n8n /bin/sh 構建一個test.js,并寫入如何代碼 vi tes…

如何在 PowerEdge 服務器上設置 NIC 分組

以下文章提供了有關 Windows、VMware 和 Linux 中的 NIC 分組的信息。 什么是網絡適配器分組&#xff1f;設置 NIC 分組 Windows設置 NIC 分組 VMware設置 NIC 分組 Linux 什么是網絡適配器分組&#xff08;綁定&#xff09;&#xff1f; 網絡適配器分組是一個術語&#xff0…

【Java ee初階】多線程(5)

一、wait 和 notify wait notify 是兩個用來協調線程執行順序的關鍵字&#xff0c;用來避免“線程餓死”的情況。 wait 和 notify 其實都是 Object 這個類的方法&#xff0c;而 Object這個類是所有類的“祖宗類”&#xff0c;也就是說明&#xff0c;任何一個類&#xff0c;都…

基于k8s的Jenkins CI/CD平臺部署實踐(二):流水線構建與自動部署全流程

基于k8s的Jenkins CI/CD平臺部署實踐&#xff08;二&#xff09;&#xff1a;流水線構建與自動部署全流程 文章目錄 基于k8s的Jenkins CI/CD平臺部署實踐&#xff08;二&#xff09;&#xff1a;流水線構建與自動部署全流程一、Jenkins簡介二、系統架構與環境說明1. 系統架構2.…

《Windows 環境下 Qt C++ 項目升級 GCC 版本的完整指南》

Windows 環境下 Qt C++ 項目升級 GCC 版本的完整指南 在 Windows 系統中升級 Qt C++ 項目的 GCC 版本需要同時考慮 Qt 工具鏈、MinGW 環境以及項目配置的調整。以下是詳細的升級步驟和注意事項: 一、升級前的準備工作 1. 確認當前環境 檢查 Qt 版本(建議使用 Qt 5.15+ 以獲…

【coze】故事卡片(圖片、音頻、文字)

【coze】故事卡片&#xff08;圖片、音頻、文字&#xff09; 1、創建智能體2、添加人設與回復邏輯3、添加工作流&#xff08;1&#xff09;創建工作流&#xff08;2&#xff09;添加大模型節點&#xff08;3&#xff09;添加提示詞優化節點&#xff08;4&#xff09;添加豆包圖…

Maven 依賴發布與倉庫治理

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

虛擬現實視頻播放器 2.6.1 | 支持多種VR格式,提供沉浸式觀看體驗的媒體播放器

虛擬現實媒體播放器是一款專為在智能手機上播放VR&#xff08;虛擬現實&#xff09;照片和視頻而設計的應用程序。它支持多種格式的影像內容&#xff0c;包括360和180等距矩形柱面、標準鏡頭和魚眼鏡頭拍攝的照片和視頻&#xff0c;并且兼容3D立體并排、上/下以及收縮媒體格式。…

ts axios中報 Property ‘code‘ does not exist on type ‘AxiosResponse<any, any>‘

ts語法有嚴格的格式&#xff0c;如果我們在處理響應數據時&#xff0c;出現了axios響應中非默認字段&#xff0c;就會出現標題那樣的警告&#xff0c;我們可以通過創建axios.dt.ts解決這個問題 下面是我在開發中遇到的警告&#xff0c;code并不是axios默認返回的字段&#xff0…

tinyrenderer筆記(Shadow Mapping)

tinyrenderer個人代碼倉庫&#xff1a;tinyrenderer個人練習代碼 前言 陰影是光線被阻擋的結果&#xff1b;當光源的光線由于其他物體的阻擋而無法到達物體表面時&#xff0c;該物體就會產生陰影。陰影能使場景看起來更真實&#xff0c;并讓觀察者獲得物體之間的空間位置關系。…

debian中筆記本的省電選擇auto-cpufreq

在reddit中&#xff0c;看評論區出現這個軟件&#xff0c;于是打算嘗試一下&#xff0c;應該能對不使用電源時筆記本的省電起到一定的作用。 https://github.com/AdnanHodzic/auto-cpufreq?tabreadme-ov-file#why-do-i-need-auto-cpufreq 作用 One of the problems with Linux…

Windows 查看電腦是否插拔過U盤

1、按 “WinR” 組合鍵打開 “運行” 對話框&#xff0c;輸入 “regedit” 并回車&#xff0c;打開注冊表編輯器。 2、依次展開HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR注冊表項&#xff0c;這里記錄了所有已連接過的 USB 設備信息&#xff0c;包括 U 盤&am…

426、N叉樹的層序遍歷

輸入檢查&#xff1a; if not root:return [] 如果根節點為空&#xff0c;直接返回空列表 初始化&#xff1a; result [] queue collections.deque([root]) result用于存儲最終結果queue初始化包含根節點&#xff0c;使用雙端隊列實現 主循環&#xff1a; while queue:leve…

【ES】Elasticsearch字段映射沖突問題分析與解決

在使用Elasticsearch作為搜索引擎時&#xff0c;經常會遇到一些映射(Mapping)相關的問題。本文將深入分析字段映射沖突問題&#xff0c;并通過原生的Elasticsearch API請求來復現和解決這個問題。 問題描述 在實際項目中&#xff0c;我們遇到以下錯誤&#xff1a; Transport…

小紅書怎么看自己ip地址?小紅書更改ip地址教學

在社交媒體高度透明的今天&#xff0c;小紅書等平臺公開用戶IP屬地的功能引發了廣泛討論。無論是出于隱私保護的擔憂&#xff0c;還是因需要切換屬地&#xff0c;許多用戶都迫切想知道&#xff1a;能否通過手動修改“偽裝”所在地&#xff1f; 事實上&#xff0c;IP屬地可能影…

深入理解 Java 觀察者模式:原理、實現與應用

在軟件開發領域&#xff0c;設計模式堪稱開發者智慧的凝練結晶&#xff0c;它們為解決各類常見編程難題提供了行之有效的方案。觀察者模式&#xff08;Observer Pattern&#xff09;作為行為型設計模式的重要一員&#xff0c;在處理對象間依賴關系與事件通知方面表現卓越。本文…