0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

從最簡單的例子,帶你輕松學(xué)習(xí)ARM指令集

Q4MP_gh_c472c21 ? 來源:未知 ? 作者:龔婷 ? 2018-03-14 10:36 ? 次閱讀

首先編輯一個最簡單的函數(shù),包含變量分配及初始化:test1.c

1.#include

2.

3.voidmain()

4.{

5.intd=4;

6.}

然后編譯:arm-linux-gnueabihf-gcc test.c -o test1

然后看看匯編代碼:arm-linux-gnueabihf-objdump -D test1;每一句的含義我已經(jīng)給出詳細注釋。

首先對輸出的文件格式說明,對于如下的輸出,左邊是程序地址(各種函數(shù)地址等等),第二列是指令碼的十六進制表示也俗稱機器碼,剩下的就是給人類看的指令助記符號,舉例舉例:

835c: b480 push {r7}

這里,835c是main函數(shù)的地址,b480是機器碼表示的指令,push {r7}就是給我們?nèi)祟惪吹牧?。下面看test1的輸出:

0000835c

:

程序用到了r7寄存器,所以需要保護以免破壞之前的數(shù)據(jù)

1 835c: b480 push {r7}

堆棧向下增長棧用的不多,只需要12個字節(jié)就夠用了: int d需要4個,多出來的8個沒有使用

2 835e: b083 sub sp, #12

因為r0-r7是通用寄存器,可以使勁用,堆棧寄存器sp只有沒辦法的時候才使用。只好用r7 = sp + 0這種笨辦法

3 8360: af00 add r7, sp, #0

參與int d = 4這條語句的是r3,這是通用寄存器,spec定義大家都可以用,不需要保護

4 8362: f04f 0304 mov.w r3, #4

把4存儲到sp+4所指定的棧里,c語言描述:*(sp + 4) = 4;留給大家思考:為何不頂著sp放置--即*(sp+0)=4?

5 8366: 607b str r3, [r7, #4]

還記得第二條:sub sp, #12嗎?此句和下一句是為從堆棧里恢復(fù)原來的r7--pop {r7},做準備;

6 8368: f107 070c add.w r7, r7, #12

r7已經(jīng)是原來的sp了

7 836c: 46bd mov sp, r7

彈出sp指向的內(nèi)存數(shù)據(jù)給r7,c語言:r7 = *sp;

8 836e: bc80 pop {r7}

沒有調(diào)用子函數(shù),即沒有使用lr寄存器,所以不需要push lr。跳轉(zhuǎn)到lr地址--進入main函數(shù)的下一條地址

9 8370: 4770 bx lr 10 8372: bf00 nop

我們再編輯一個稍微增加一個變量:test2.c

[cpp]view plaincopy

1.#include

2.

3.voidmain()

4.{

5.intd=4;

6.charb=2;

7.}

0000835c

:

1 835c: b480 push {r7}2 835e: b083 sub sp, #123 8360: af00 add r7, sp, #0

4 8362: f04f 0304 mov.w r3, #4

把4存儲到sp+0所指定的棧里,c語言描述:*(sp + 0) = 4,注意與上一個例子的區(qū)別,這里是頂著stack存放,為什么?

5 8366: 603b str r3, [r7, #0]

6 8368: f04f 0302 mov.w r3, #2

為何要這么任性的存放變量b?

7 836c: 71fb strb r3, [r7, #7]8 836e: f107 070c add.w r7, r7, #129 8372: 46bd mov sp, r710 8374: bc80 pop {r7}11 8376: 4770 bx lr

棧里的數(shù)據(jù)是這樣的,b和d中間隔著好幾條街呢:)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9013

    瀏覽量

    366167
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5275

    瀏覽量

    119690
  • 指令集
    +關(guān)注

    關(guān)注

    0

    文章

    221

    瀏覽量

    23330

原文標題:從最簡單的例子,帶你輕松學(xué)習(xí)ARM 指令集

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    常用ARM指令集及匯編

    常用ARM指令集及匯編ARM處理器是基于精簡指令集計算機(RISC)原理設(shè)計的,指令集和相關(guān)譯碼機制較為
    發(fā)表于 11-23 09:38

    簡單介紹ARM指令集

    處理器架構(gòu)是處理器廠商為同一個系列的處理器規(guī)定的一個規(guī)范。ARM架構(gòu)是一種精簡指令集(RISC)架構(gòu),具有以下RISC架構(gòu)特點:較大的通用寄存器堆。load/store體系結(jié)構(gòu),其中數(shù)據(jù)處理操作僅對
    發(fā)表于 08-18 10:58

    ARM指令集文章集合

    三、指令集如果你想要集中學(xué)習(xí)一下關(guān)于ARM指令集方面的知識(比如下面幾個知識點),可以看下下面的文章1、機器碼2、運算指令3、控制
    發(fā)表于 09-07 22:06

    ARM指令集的特點有哪些呢

    1、ARM指令集ARM指令集格式ARM指令集ARM
    發(fā)表于 12-14 07:24

    常用ARM指令集與匯編

    常用ARM指令集與匯編 好資料,與你供享。只供學(xué)習(xí)!
    發(fā)表于 03-25 16:34 ?74次下載

    ARM指令集下載 arm指令集參考手冊

    ARM指令集下載 arm指令集參考手冊, ARM 指令集 寄存器和處理器模式(26-bi
    發(fā)表于 12-25 09:20 ?118次下載

    常用arm指令集及匯編

    常用arm指令集及匯編
    發(fā)表于 09-09 14:22 ?34次下載
    常用<b class='flag-5'>arm</b><b class='flag-5'>指令集</b>及匯編

    arm指令集(1)

    arm指令集(1)  ARM跳轉(zhuǎn)指令可以當前指令向前或向后的32MB地址空間跳轉(zhuǎn)。這類跳轉(zhuǎn)
    發(fā)表于 03-02 15:46 ?79次下載

    ARM指令集詳解

    ARM指令集詳解 內(nèi)容提要 ARM指令集 ARM指令集分類與
    發(fā)表于 03-09 09:39 ?263次下載
    <b class='flag-5'>ARM</b><b class='flag-5'>指令集</b>詳解

    arm7指令集

    1.ARM處理器尋址方式        ARM處理器是基于精簡指令集計算機(RISC)原理設(shè)計的,指令集和相關(guān)譯碼
    發(fā)表于 10-23 11:07 ?163次下載
    <b class='flag-5'>arm</b>7<b class='flag-5'>指令集</b>

    ARM指令集介紹

    arm開發(fā)板 嵌入式開發(fā) 指令集 PDF文檔。
    發(fā)表于 05-03 16:42 ?5次下載

    常用的ARM指令集及匯編

    常用的ARM指令集及匯編
    發(fā)表于 10-30 10:07 ?24次下載
    常用的<b class='flag-5'>ARM</b><b class='flag-5'>指令集</b>及匯編

    thumb指令集是什么_thumb指令集arm指令集的區(qū)別

    thumb指令集arm指令集的一個子集,是針對代碼密度問題而提出的,它具有16位的代碼寬度。與等價的32位代碼相比較,thumb指令集在保留32位代碼優(yōu)勢的同時,大大的節(jié)省了系統(tǒng)的存
    發(fā)表于 11-03 17:34 ?1.8w次閱讀
    thumb<b class='flag-5'>指令集</b>是什么_thumb<b class='flag-5'>指令集</b>與<b class='flag-5'>arm</b><b class='flag-5'>指令集</b>的區(qū)別

    ARM架構(gòu)及ARM指令集 Thumb指令集你了解多少?

    ARM架構(gòu)及ARM指令集、Thumb指令集你了解多少?
    的頭像 發(fā)表于 02-26 16:09 ?7028次閱讀

    ARM處理器的尋址方式和指令集介紹

    ARM處理器是基于精簡指令集計算機(RISC原理設(shè)計的,指令集和相關(guān)嶧碼機制較為簡單。ARM7TDM(S)具有32位
    發(fā)表于 11-24 17:24 ?33次下載
    <b class='flag-5'>ARM</b>處理器的尋址方式和<b class='flag-5'>指令集</b>介紹