国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux當中的壓棧和出棧指令以及跳轉(zhuǎn)指令詳細教程

這篇具有很好參考價值的文章主要介紹了Linux當中的壓棧和出棧指令以及跳轉(zhuǎn)指令詳細教程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.跳壓棧出棧指令:

我們通常會在 A 函數(shù)中調(diào)用 B 函數(shù),當 B 函數(shù)執(zhí)行完以后再回到 A 函數(shù)繼續(xù)執(zhí)行。要想 再跳回 A 函數(shù)以后代碼能夠接著正常運行,那就必須在跳到 B 函數(shù)之前將當前處理器狀態(tài)保存 起來(就是保存 R0~R15 這些寄存器值),當 B 函數(shù)執(zhí)行完成以后再用前面保存的寄存器值恢復

R0~R15 即可。保存 R0~R15 寄存器的操作就叫做現(xiàn)場保護,恢復 R0~R15 寄存器的操作就叫做 恢復現(xiàn)場。在進行現(xiàn)場保護的時候需要進行壓棧(入棧)操作,恢復現(xiàn)場就要進行出棧操作。壓棧 的指令為 PUSH,出棧的指令為 POP,PUSH 和 POP 是一種多存儲和多加載指令,即可以一次 操作多個寄存器數(shù)據(jù),他們利用當前的棧指針 SP 來生成地址,PUSH 和 POP 的用法如表所示:

Linux當中的壓棧和出棧指令以及跳轉(zhuǎn)指令詳細教程

假如我們現(xiàn)在要將 R0~R3 和 R12 這 5 個寄存器壓棧,當前的 SP 指針指向 0X80000000,處理器的堆棧是向下增長的,使用的匯編代碼如下:

PUSH {R0~R3, R12} @將 R0~R3 和 R12 壓棧 

?壓棧完成以后的堆棧如圖所示:

Linux當中的壓棧和出棧指令以及跳轉(zhuǎn)指令詳細教程

上圖就是對R0~R3,R12進行壓棧以后的堆棧示意圖,此時的SP指向了0X7FFFFFEC, 假如我們現(xiàn)在要再將 LR 進行壓棧,匯編代碼如下

PUSH {LR} @將 LR 進行壓棧

對 LR 進行壓棧完成以后的堆棧模型如圖所示:

Linux當中的壓棧和出棧指令以及跳轉(zhuǎn)指令詳細教程

?上圖就是分兩步對 R0~R3,R12 和 LR 進行壓棧以后的堆棧模型,如果我們要出棧的話 就是使用如下代碼:

POP {LR} @先恢復 LR 
POP {R0~R3,R12} @在恢復 R0~R3,R12 

出棧的就是從棧頂,也就是 SP 當前執(zhí)行的位置開始,地址依次減小來提取堆棧中的數(shù)據(jù) 到要恢復的寄存器列表中。PUSH 和 POP 的另外一種寫法是“STMFD SP!”和“LDMFD SP!”,

因此上面的匯編代碼可以改為:

STMFD SP!,{R0~R3, R12} @R0~R3,R12 入棧 

STMFD SP!,{LR} @LR 入棧 

LDMFD SP!, {LR} @先恢復 LR 

LDMFD SP!, {R0~R3, R12} @再恢復 R0~R3, R12 

????????STMFD 可以分為兩部分:STM 和 FD,同理,LDMFD 也可以分為 LDM 和 FD??吹?STM和 LDM 有沒有覺得似曾相識(不是 STM32 啊啊啊啊),前面我們講了 LDR 和 STR,這兩個是 數(shù)據(jù)加載和存儲指令,但是每次只能讀寫存儲器中的一個數(shù)據(jù)。STM 和 LDM 就是多存儲和多 加載,可以連續(xù)的讀寫存儲器中的多個連續(xù)數(shù)據(jù)。

????????FD 是 Full Descending 的縮寫,即滿遞減的意思。根據(jù) ATPCS 規(guī)則,ARM 使用的 FD 類型 的堆棧,SP 指向最后一個入棧的數(shù)值,堆棧是由高地址向下增長的,也就是前面說的向下增長 的堆棧,因此最常用的指令就是 STMFD 和 LDMFD。STM 和 LDM 的指令寄存器列表中編號 小的對應(yīng)低地址,編號高的對應(yīng)高地址。

2.跳轉(zhuǎn)指令

我們重點來看一下 B 和 BL 指令,因為這兩個是我們用的最多的,如果要在匯編中進行函 數(shù)調(diào)用使用的就是 B 和 BL 指令:

B 指令

這是最簡單的跳轉(zhuǎn)指令,B 指令會將 PC 寄存器的值設(shè)置為跳轉(zhuǎn)目標地址, 一旦執(zhí)行 B 指 令,ARM 處理器就會立即跳轉(zhuǎn)到指定的目標地址。如果要調(diào)用的函數(shù)不會再返回到原來的執(zhí)行 處,那就可以用 B 指令,如下示例:

_start: 


    ldr sp,=0X80200000 @設(shè)置棧指針 

    b main @跳轉(zhuǎn)到 main 函數(shù) 

上述代碼就是典型的在匯編中初始化 C 運行環(huán)境,然后跳轉(zhuǎn)到 C 文件的 main 函數(shù)中運行,上述代碼只是初始化了 SP 指針,有些處理器還需要做其他的初始化,比如初始化 DDR 等等。 因為跳轉(zhuǎn)到 C 文件以后再也不會回到匯編了,所以在第 4 行使用了 B 指令來完成跳轉(zhuǎn)。

BL 指令

BL 指令相比 B 指令,在跳轉(zhuǎn)之前會在寄存器 LR(R14)中保存當前 PC 寄存器值,所以可以 通過將 LR 寄存器中的值重新加載到 PC 中來繼續(xù)從跳轉(zhuǎn)之前的代碼處運行,這是子程序調(diào)用 一個基本但常用的手段。比如 Cortex-A 處理器的 irq 中斷服務(wù)函數(shù)都是匯編寫的,主要用匯編 來實現(xiàn)現(xiàn)場的保護和恢復、獲取中斷號等。但是具體的中斷處理過程都是 C 函數(shù),所以就會存 在匯編中調(diào)用 C 函數(shù)的問題。而且當 C 語言版本的中斷處理函數(shù)執(zhí)行完成以后是需要返回到匯編中斷服務(wù)函數(shù),因為還要處理其他的工作,一般是恢復現(xiàn)場。這個時候就不能直接使用B 指令了,因為 B 指令一旦跳轉(zhuǎn)就再也不會回來了,這個時候要使用 BL 指令,示例代碼如下:

push {r0, r1} @保存 r0,r1 

cps #0x13 @進入 SVC 模式,允許其他中斷再次進去 


bl system_irqhandler @加載 C 語言中斷處理函數(shù)到 r2 寄存器中 

 
cps #0x12 @進入 IRQ 模式 

pop {r0, r1} 

str r0, [r1, #0X10] @中斷執(zhí)行完成,寫 EOIR 

上述代碼中第 5 行就是執(zhí)行 C 語言版的中斷處理函數(shù),當處理完成以后是需要返回來繼續(xù) 執(zhí)行下面的程序,所以使用了 BL 指令。文章來源地址http://www.zghlxwxcb.cn/news/detail-409169.html

到了這里,關(guān)于Linux當中的壓棧和出棧指令以及跳轉(zhuǎn)指令詳細教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Linux常見指令以及權(quán)限理解】基本指令(3)

    【Linux常見指令以及權(quán)限理解】基本指令(3)

    上一篇文章,我們學習了Linux的一些常用指令, 學習了如何理解Linux系統(tǒng),介紹了對Linux系統(tǒng)的理解:Linux下一切皆文件 介紹了重定向還有管道相關(guān)的知識。這里是上一篇博客的鏈接:http://t.csdn.cn/2d6fc 接下來我會對Linux常用指令進行收尾,并談一談如何理解指令。 目錄 寫在前

    2024年02月04日
    瀏覽(45)
  • 【Linux常見指令以及權(quán)限理解】基本指令(2)

    【Linux常見指令以及權(quán)限理解】基本指令(2)

    今天我們繼續(xù)學習Linux的基本指令, 這里是上一篇博客的鏈接:http://t.csdn.cn/9AgHP 接下來我會繼續(xù)講解Linux指令相關(guān)內(nèi)容。 目錄 寫在前面 1. man 描述: 用法: 例子: 例1: 例2: 2. cp 描述: 用法: 例子: 例1: 例2: 例3: 例4: 3. mv 描述: 用法: 例子: 例1: 例2: 例3:

    2024年02月01日
    瀏覽(23)
  • Linux實時監(jiān)控網(wǎng)卡入流量和出流量(iftop、dstat、nethogs、nload)

    Linux實時監(jiān)控網(wǎng)卡入流量和出流量(iftop、dstat、nethogs、nload)

    相同配置和相同業(yè)務(wù)的4臺cvm,今天準備下線,檢查還有沒有業(yè)務(wù)流量的時候,發(fā)現(xiàn)有兩臺流量不符合預期,就很奇怪,想知道流量是從哪里來的。記錄下當時定位思路 先來了解下基本的概念 速度單位,bit 即比特,通常用 b(小寫)表示,指一位二進制位; Mbps 即 Milionbit p

    2024年02月15日
    瀏覽(20)
  • linux相關(guān)知識以及有關(guān)指令3

    linux相關(guān)知識以及有關(guān)指令3

    在linux中文件大致分為以下幾類: -:普通文件,源代碼,可執(zhí)行程序,庫等等。 d:目錄文件 c:字符設(shè)備文件,鍵盤,顯示器 b:塊設(shè)備文件 l:鏈接文件 p:管道文件 上面的字母是各類文件的表示他們位于這個位置: 我們可以看到在linux中文件的前面有很多屬性而位于最前

    2024年02月07日
    瀏覽(23)
  • 【Linux】常見指令以及具體其使用場景

    【Linux】常見指令以及具體其使用場景

    君兮_的個人主頁 即使走的再遠,也勿忘啟程時的初心 C/C++ 游戲開發(fā) Hello,米娜桑們,這里是君兮_,隨著博主的學習,博主掌握的技能也越來越多,今天又根據(jù)最近的學習開設(shè)一個新的專欄——Linux,相信Linux操作系統(tǒng)在日常開發(fā)過程中是必不可少的,今天我們就先來講講Lin

    2024年02月06日
    瀏覽(33)
  • 【Linux常見指令以及權(quán)限理解】權(quán)限理解

    【Linux常見指令以及權(quán)限理解】權(quán)限理解

    這篇文章,我們來聊一聊Linux下權(quán)限相關(guān)的知識,我打算從這幾個方面展開: 1. 認識Linux下用戶的分類 2. 什么叫做權(quán)限 3. 沒有權(quán)限會是什么樣子 4. 如何修改權(quán)限 5. 其它重要的問題 那么廢話不多說,我們現(xiàn)在開始。 目錄 寫在前面 1. Linux下用戶的分類 如何切換用戶 如何提高

    2024年02月05日
    瀏覽(53)
  • 【Linux常見指令以及權(quán)限理解】權(quán)限理解(4)

    【Linux常見指令以及權(quán)限理解】權(quán)限理解(4)

    這篇文章,我們來聊一聊Linux下權(quán)限相關(guān)的知識,我打算從這幾個方面展開: 1. 認識Linux下用戶的分類 2. 什么叫做權(quán)限 3. 沒有權(quán)限會是什么樣子 4. 如何修改權(quán)限 5. 其它重要的問題 那么廢話不多說,我們現(xiàn)在開始。 目錄 寫在前面 1. Linux下用戶的分類 如何切換用戶 如何提高

    2024年02月05日
    瀏覽(22)
  • Linux配置yum源以及基本yum指令

    Linux配置yum源以及基本yum指令

    Yum(全稱為 Yellow dog Updater, Modified)是一個在Fedora和 RedHa t以及CentOS中的Shell前端軟件包管理器?;赗PM包管理,能夠從指定的服務(wù)器自動下載RPM包并且安裝,可以自動處理依賴性關(guān)系,并且一次安裝所有依賴的軟件包,無須繁瑣地一次次下載、安裝。–來自百度百科 在Linux下

    2024年01月24日
    瀏覽(22)
  • 深入理解JVM虛擬機第二十七篇:詳解JVM當中InvokeDynamic字節(jié)碼指令,Java是動態(tài)類型語言么?

    深入理解JVM虛擬機第二十七篇:詳解JVM當中InvokeDynamic字節(jié)碼指令,Java是動態(tài)類型語言么?

    ????? 學習交流群: ??1:這是孫哥suns給大家的福利! ?? 2:我們免費分享Netty、Dubbo、k8s、Mybatis、Spring...應(yīng)用和源碼級別的視頻資料 ????3:QQ群: 583783824 ? ???? ?工作微信: BigTreeJava 拉你進微信群,免費領(lǐng)?。?????4:本文章內(nèi)容出自上述:Spring應(yīng)用課程!????

    2024年02月04日
    瀏覽(21)
  • Linux | nslookup詳細介紹一下這指令的作用以及用法

    linux 當中,nslookup是一個網(wǎng)絡(luò)工具,通常用于查詢域名系統(tǒng)(DNS)服務(wù)器以獲取主機名或IP地址相關(guān)的信息。它可以用于查找主機名的IP地址,反向查找IP地址的主機名,以及查詢DNS記錄的其他信息。以下是nslookup命令的用法和示例: 查詢主機名的IP地址: nslookup example.com 這個

    2024年04月26日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包