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

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

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

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

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

首先編輯一個(gè)最簡(jiǎn)單的函數(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)給出詳細(xì)注釋。

首先對(duì)輸出的文件格式說(shuō)明,對(duì)于如下的輸出,左邊是程序地址(各種函數(shù)地址等等),第二列是指令碼的十六進(jìn)制表示也俗稱(chēng)機(jī)器碼,剩下的就是給人類(lèi)看的指令助記符號(hào),舉例舉例:

835c: b480 push {r7}

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

0000835c

:

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

1 835c: b480 push {r7}

堆棧向下增長(zhǎng)棧用的不多,只需要12個(gè)字節(jié)就夠用了: int d需要4個(gè),多出來(lái)的8個(gè)沒(méi)有使用

2 835e: b083 sub sp, #12

因?yàn)閞0-r7是通用寄存器,可以使勁用,堆棧寄存器sp只有沒(méi)辦法的時(shí)候才使用。只好用r7 = sp + 0這種笨辦法

3 8360: af00 add r7, sp, #0

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

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

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

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

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

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

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

7 836c: 46bd mov sp, r7

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

8 836e: bc80 pop {r7}

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

9 8370: 4770 bx lr 10 8372: bf00 nop

我們?cè)倬庉嬕粋€(gè)稍微增加一個(gè)變量: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存儲(chǔ)到sp+0所指定的棧里,c語(yǔ)言描述:*(sp + 0) = 4,注意與上一個(gè)例子的區(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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9027

    瀏覽量

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

    關(guān)注

    31

    文章

    5295

    瀏覽量

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

    關(guān)注

    0

    文章

    221

    瀏覽量

    23344

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    常用ARM指令集及匯編

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

    簡(jiǎn)單介紹ARM指令集

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

    ARM指令集文章集合

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

    ARM指令集的特點(diǎn)有哪些呢

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

    常用ARM指令集與匯編

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

    ARM指令集下載 arm指令集參考手冊(cè)

    ARM指令集下載 arm指令集參考手冊(cè), 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)指令可以當(dāng)前指令向前或向后的32MB地址空間跳轉(zhuǎn)。這類(lèi)跳轉(zhuǎn)
    發(fā)表于 03-02 15:46 ?79次下載

    ARM指令集詳解

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

    arm7指令集

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

    ARM指令集介紹

    arm開(kāi)發(fā)板 嵌入式開(kāi)發(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指令集的一個(gè)子集,是針對(duì)代碼密度問(wèn)題而提出的,它具有16位的代碼寬度。與等價(jià)的32位代碼相比較,thumb指令集在保留32位代碼優(yōu)勢(shì)的同時(shí),大大的節(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 ?7060次閱讀

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

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