色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

匯編基礎知識教程之數據類型與寄存器

jf_78858299 ? 來源: zhangfann ? 作者: 張凡 ? 2023-01-30 15:06 ? 次閱讀

數據類型

這是 ARM 匯編基礎知識系列教程的第二部分,涉及數據類型和寄存器

圖片

與高級語言類似,ARM支持對不同數據類型的操作。我們可以加載(或存儲)的數據類型可以是有符號和無符號字、半字或字節。這些數據類型的擴展是。-h或-sh用于半字,-b或-sb用于字節,而字則沒有擴展。有符號和無符號數據類型之間的區別是。

有符號的數據類型可以容納正值和負值,因此范圍較小。

無符號數據類型可以保存大的正值(包括 "零"),但不能保存負值,因此范圍更廣。

下面是一些例子,說明這些數據類型如何與指令Load和Store一起使用。

圖片

大小端

在內存中,有兩種查看字節的基本方法。小端(LE)或大端(BE)。區別在于一個對象的每個字節在內存中的存儲順序。在像英特爾x86這樣的小端機器上,最不重要的字節被存儲在最低地址(最接近零的地址)。在big-endian機器上,最重要的字節被存儲在最低地址。ARM架構在第3版之前是小-endian,從那時起,它是雙-endian,這意味著它有一個允許可切換endianness的設置。例如,在ARMv6中,指令是固定的小字節,數據訪問可以是小字節或大字節,由程序狀態寄存器(CPSR)的第9位(E位)控制。

圖片

ARM寄存器

寄存器的數量取決于ARM的版本。根據ARM參考手冊,除了基于ARMv6-M和ARMv7-M的處理器外,有30個通用的32位寄存器。前16個寄存器可在用戶級模式下訪問,其他寄存器可在特權軟件執行中使用(ARMv6-M和ARMv7-M例外)。在本系列教程中,我們將處理在任何特權模式下都可以訪問的寄存器:r0-15。這16個寄存器可以分成兩組:通用寄存器和特殊用途寄存器。

圖片

圖片

下表展示了ARM寄存器與Intel處理器中的寄存器之間的關系。

圖片

R0-R12:在普通操作中可用于存儲臨時值、指針(存儲器的位置)等。例如,R0在進行算術運算時可作為累加器,或用于存儲先前調用的函數的結果。R7在處理系統調用時變得非常有用,因為它存儲了系統調用的編號,R11幫助我們跟蹤堆棧上的邊界,作為框架指針(將在后面介紹)。此外,ARM的函數調用慣例規定,函數的前四個參數存儲在寄存器r0-r3中。

R13:SP(堆棧指針)。堆棧指針指向堆棧的頂部。堆棧是一個用于特定函數存儲的內存區域,在函數返回時被回收。因此,堆棧指針用于分配堆棧的空間,方法是用堆棧指針減去我們要分配的值(以字節為單位)。換句話說,如果我們想分配一個32位的值,我們從堆棧指針中減去4。

R14:LR(鏈接寄存器)。當一個函數被調用時,鏈接寄存器被更新為內存地址,引用函數啟動的下一條指令。這樣做允許程序在 "子 "函數完成后返回到啟動 "子 "函數的 "父 "函數。

R15:PC(程序計數器)。程序計數器根據所執行的指令的大小自動遞增。這個大小在ARM狀態下總是4字節,在THUMB模式下是2字節。當一個分支指令被執行時,PC保存目標地址。在執行過程中,PC在ARM狀態下存儲當前指令的地址加8(兩條ARM指令),在Thumb(v1)狀態下存儲當前指令加4(兩條Thumb指令)。這與x86不同,x86的PC總是指向要執行的下一條指令。

讓我們看看PC在調試器中是如何表現的。我們用下面的程序將PC的地址存入r0,并包括兩條隨機指令。讓我們看看會發生什么。

圖片

在gdb中我們在_start處設定一個斷點

圖片

如下是運行的結果:

圖片

我們可以看到,PC持有將被執行的下一條指令(mov r0, pc)的地址(0x8054)。現在讓我們執行下一條指令,之后R0應該持有PC的地址(0x8054),對嗎?

圖片

...對嗎?錯了。看看R0中的地址。當我們期望R0包含先前讀取的PC值(0x8054)時,它卻包含了比我們先前讀取的PC值(0x805c)提前兩條指令的值。從這個例子中你可以看到,當我們直接讀取PC時,它遵循PC指向下一條指令的定義;但在調試時,PC指向當前PC值前面的兩條指令(0x8054 + 8 = 0x805C)。這是因為較早的ARM處理器總是在當前執行的指令之前獲取兩條指令。ARM保留這一定義的原因是為了確保與早期處理器的兼容性。

當前程序狀態寄存器

當你用gdb調試一個ARM二進制文件時,你會看到一個叫做Flags的東西。

圖片

寄存器$cpsr顯示了當前程序狀態寄存器(CPSR)的值,在它下面可以看到Flagsthumb, fast, interrupt, overflow, carry, zero, and negative。這些標志代表了CPSR寄存器中的某些位,并根據CPSR的值來設置,激活時變成粗體。N、Z、C和V位與x86上EFLAG寄存器中的SF、ZF、CF和OF位相同。這些位被用來支持匯編級的條件和循環的條件執行。我們將在第6部分 "條件執行和分支 "中介紹使用的條件代碼。

圖片

上圖顯示了一個32位寄存器(CPSR)的布局,左邊(<-)是最重要的位,右邊(->)是最小的位。每一個單元(除了GE和M部分以及空白部分)都是一個比特的大小。這些一比特的部分定義了程序當前狀態的各種屬性。

圖片

讓我們假設我們使用CMP指令來比較數字1和2。結果是 "負",因為1-2=-1。當我們比較兩個相等的數字時,比如2對2,Z(零)標志被設置,因為2-2=0。請記住,CMP指令使用的寄存器不會被修改,只有CPSR會根據這些寄存器相互比較的結果被修改。

這是GDB中的情況(安裝了GEF)。在這個例子中,我們比較寄存器r1和r0,其中r1=4,r0=2。這是執行了cmp r1, r0操作后的標志的情況。

進位標志被設置,因為我們用cmp r1, r0來比較4和2(4-2)。相反,如果我們使用cmp r0, r1來比較一個較小的數字(2)和一個較大的數字(4),則負標志(N)被設置。

下面是ARM信息中心的一段摘錄:

APSR包含以下ALU狀態標志。

N - 當操作的結果為負數時設置。

Z - 當操作的結果為零時設置。

C - 當操作的結果是Carry時設置。

V--當操作引起溢出時設置。

carry在以下情況被設置:

如果加法的結果大于或等于2^32

如果減法的結果是正數或零

作為移動或邏輯指令中的內聯移位操作的結果。

如果加法、減法或比較的結果大于或等于2^31,或小于2^31,則發生溢出。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9084

    瀏覽量

    367390
  • 寄存器
    +關注

    關注

    31

    文章

    5336

    瀏覽量

    120232
  • 匯編
    +關注

    關注

    2

    文章

    214

    瀏覽量

    25927
收藏 人收藏

    評論

    相關推薦

    芯片解密基礎知識:串行端口的控制寄存器

    芯片解密基礎知識:串行端口的控制寄存器 串行端口控制寄存器有哪些類型?各自的工作方式是什么?下面由IC解密工程師詳解各類型的串行端口控制
    發表于 03-30 11:27

    MSP-ESP430G2常用數據類型及字節數值范圍基礎知識補充

    瘋狂的大柚柚帶你玩轉MSP-ESP430G2(基礎篇)(六)基礎知識補充常用數據類型數據類型字節數值范圍Char1-128~127Unsigned char10`255short2-32768
    發表于 02-15 07:25

    數據寄存器,數據寄存器是什么意思

    數據寄存器,數據寄存器是什么意思 數據寄存器數據
    發表于 03-08 14:38 ?1.3w次閱讀

    匯編語言教程-段寄存器的說明語句

    匯編語言教程-段寄存器的說明語句   在匯編語言源程序中可以定義多個段,每個段都要與一個段寄存器建立一種對應關系。建立這
    發表于 03-27 17:17 ?1403次閱讀

    匯編語言學習課件_微處理基礎知識

    匯編語言學習課件 第二章 微處理基礎知識 2.1 Intel公司80x86系列微處理簡介 2.2 程序可見寄存器組 2.3 存儲
    發表于 12-31 10:39 ?0次下載

    python教程之變量和簡單數據類型

    本文檔的主要內容詳細介紹的是python教程之變量和簡單數據類型
    發表于 04-26 08:00 ?7次下載
    python教<b class='flag-5'>程之</b>變量和簡單<b class='flag-5'>數據類型</b>

    Windows編程之數據類型綜述

    Windows編程之數據類型綜述
    發表于 08-24 15:03 ?5次下載

    [從零學習匯編語言] -寄存器詳解

    語言基礎知識梳理一、 存儲與通用寄存器1. 存儲每一天清晨,當我們在夢中醒來的時候,記憶就會填充大腦的空白,我們會想起最近做過的一些重要的事情,當然也有些小的事情無法準確的記憶起,
    發表于 11-26 20:51 ?8次下載
    [從零學習<b class='flag-5'>匯編</b>語言] -<b class='flag-5'>寄存器</b>詳解

    第二章(1) 初識P0,P1并口 數據類型,常量定義方法,特殊功能寄存器定義

    1.認識P0與P1,數據類型,常量定義方法,特殊功能寄存器定義2.P0和P1區別及介紹
    發表于 12-31 19:57 ?6次下載
    第二章(1) 初識P0,P1并口  <b class='flag-5'>數據類型</b>,常量定義方法,特殊功能<b class='flag-5'>寄存器</b>定義

    Verilog HDL語言的數據類型和運算符

    reg是寄存器數據類型的關鍵字,是數據存儲單元的抽象,通過賦值語句可以改變寄存器存儲的值。reg型數據常用來表示always模塊內的指定信號
    的頭像 發表于 05-18 10:34 ?2460次閱讀

    四種類型的 JTAG 數據寄存器介紹

    本文將介紹四種類型的 JTAG 數據寄存器,分別是: Boundary Scan Register (BSR) 邊界掃描寄存器 Bypass Register (BR) 旁路
    發表于 02-07 10:01 ?3625次閱讀

    解析一些常見的寄存器

    數據寄存器(Data Register,DR)又稱數據緩沖寄存器數據寄存器用于存放操作數,其位
    的頭像 發表于 02-09 14:47 ?5481次閱讀
    解析一些常見的<b class='flag-5'>寄存器</b>

    Go匯編基礎知識

    不同體系結構的 CPU,其內部寄存器的數量、種類以及名稱可能大不相同,這里我們只介紹 AMD64 的寄存器。AMD64 有 20 多個可以直接在匯編代碼中使用的寄存器,其中有幾個
    的頭像 發表于 04-20 11:12 ?1089次閱讀

    Verilog最常用的2種數據類型

    Verilog 最常用的 2 種數據類型就是線網(wire)與寄存器(reg),其余類型可以理解為這兩種數據類型的擴展或輔助。
    的頭像 發表于 05-29 16:27 ?2312次閱讀
    Verilog最常用的2種<b class='flag-5'>數據類型</b>

    寄存器分為基本寄存器和什么兩種

    寄存器是計算機中用于存儲數據的高速存儲單元,它們是CPU內部的重要組成部分。寄存器可以分為基本寄存器和擴展寄存器兩種
    的頭像 發表于 07-12 10:31 ?1322次閱讀
    主站蜘蛛池模板: 亚洲午夜久久久精品影院| 就操成人网| 公和我做好爽添厨房中文字幕| 最近的中文字幕免费完整| 绝对诱惑在线试听| 久久香蕉电影| 久久嫩草影院网站| 久久久久琪琪精品色| 久久五月综合婷婷中文云霸高清| 久久电影午夜| 久久亚洲精品AV成人无| 精品第一国产综合精品蜜芽| 妓女嫖客叫床粗话对白| 久久精品视频在线直播6| 久久6699精品国产人妻| 浪货嗯啊趴下NP粗口黄暴| 麻豆无人区乱码| 麒麟色欧美影院在线播放| 日韩欧美中文字幕在线| 久久久欧美国产精品人妻噜噜| 老年日本老年daddy| 欧美18精品久久久无码午夜福利| 青草久久伊人| 玩高中女同桌肉色短丝袜脚文| 午夜精品国产自在现线拍| 亚洲精品无码不卡在线播放he| 人人听力网mp3下载| 忘忧草在线影院WWW日本二 | 国产精品欧美亚洲| 国产女人乱人伦精品一区二区| 精品国产品国语在线不卡| 麻豆精品传媒一二三区| 热99re久久精品国产首页| 无修肉动漫在线观看影片| 免费国产足恋网站| 日韩插啊免费视频在线观看| 午夜福利电影| 中文字幕a有搜索网站| 厕所xxxxx| 国语自产二区高清国语自产拍| 噜噜噜狠狠夜夜躁精品|