精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

學(xué)習(xí)GNU匯編語(yǔ)法

華仔的編程隨筆 ? 來(lái)源:華仔的編程隨筆 ? 作者:華仔的編程隨筆 ? 2023-04-30 08:42 ? 次閱讀

前言

最近在學(xué)習(xí)Cortex-A的linux編程,拿到的是《原子嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)說(shuō)解》,文中說(shuō)到,如果想要學(xué)習(xí)好Uboot和Linux內(nèi)核,就必須要學(xué)會(huì)匯編

GNU匯編語(yǔ)法

我們?cè)谑褂眠^(guò)的STM32中的MDK與IAR下啟動(dòng)文件startup_stmp32f10x_hd.s中的匯編語(yǔ)法是有所不同的,所以不用將MDK下的匯編文件直接復(fù)制到IAR下去編譯,這是因?yàn)镸DK和IAR的編譯器不同,因此匯編語(yǔ)法就有一些區(qū)別,ARM匯編使用的是GCC交叉編譯器,所以匯編代碼要符合GNU語(yǔ)法。

GNU匯編語(yǔ)法適用于所有的架構(gòu),并不是ARM獨(dú)享的,GNU匯編由一系列的語(yǔ)句組成,每行一條語(yǔ)句,每條語(yǔ)句有3個(gè)可選部分,解釋如下:

label:instruction @ comment

Lable : 即標(biāo)號(hào),表示地址位置,有些指令前面可能會(huì)有標(biāo)號(hào),這樣就可以通這個(gè)標(biāo)號(hào)得到指令的地址,標(biāo)號(hào)也可以用來(lái)表數(shù)據(jù)地址,注意label后面的“:",任何以":"結(jié)尾的標(biāo)識(shí)符者會(huì)被識(shí)別為一個(gè)標(biāo)號(hào)。

instruction : 即指令,也就是匯編指令的偽指令。

@符號(hào):表示后面的是注釋?zhuān)透?a href="http://www.nxhydt.com/soft/data/21-24/" target="_blank">C語(yǔ)言中的”/ “和” /“一樣的,其實(shí)在GNU匯編文件中我們也可以使用"/ "和" /”來(lái)注釋。

comment :就是注釋內(nèi)容。

代碼如下所示

add:
MOVS R0, #0x123 @設(shè)置 R0=0x123

上面的代碼中"add:”就是標(biāo)號(hào),“MOVS R0,#0x123"就是指令,最后的"@設(shè)置 R0=0x123"就是注釋。

注意:ARM中的指令,偽指令、偽操作、寄存器名等可以全部使用大寫(xiě),也可以全部使用小寫(xiě),但是不能大小寫(xiě)混用。

用戶(hù)可以使用.section偽操作來(lái)定義一個(gè)段,匯編系統(tǒng)預(yù)定義一些段名,解釋如下:

.tex :表示代碼段。

.data :初始化的數(shù)據(jù)段。

.bss :未初始化的數(shù)據(jù)段。

.rodata :只讀數(shù)據(jù)段。

我們當(dāng)然可以使用.section來(lái)定義一個(gè)段,每個(gè)段以段名開(kāi)始,以下一段名或者文件結(jié)尾結(jié)束。代碼如下:

.section .testsection @定義一個(gè)testsection段

匯編程序的黙認(rèn)入口標(biāo)號(hào)是_start,不過(guò)我們可以在鏈接腳本中使用ENTRY來(lái)指明其他的入口點(diǎn),下面的代碼就是使用_start作為入口標(biāo)號(hào)。

.gloabl _start

_start:
ldr r0, =0x12 @ 給r0移入0x123.

上面代碼中,global是偽操作,表示_start 是一個(gè)全局標(biāo)號(hào),類(lèi)似C語(yǔ)言中的全局變量一樣,下面為常見(jiàn)的偽操作。

.byte :定義單字節(jié)數(shù)據(jù),比如.byte 0x123。

.short :定義雙字節(jié)數(shù)據(jù),比如.short 0x1234。

.long :定義一個(gè)4字節(jié)數(shù)據(jù),比如.long 0x12345678。

.equ :賦值語(yǔ)句,格式為.equ變量名,表達(dá)式如.equ num,0x123 表示num = 0x123。

.align :數(shù)據(jù)字節(jié)對(duì)齊,如.align 4 表示4字節(jié)對(duì)齊。

.end :表示源文件結(jié)束。

.global :定義一個(gè)全局符號(hào),格式為.global sysmbol,比如 .global _start。

GNU匯編還有其他的偽操作,最常見(jiàn)的如上所示。如果想詳細(xì)地了解全部的偽操作,可以參考《ARM Cortex-A(armV7)編程手冊(cè)V4.0》中的相關(guān)內(nèi)容。

GNU匯編同樣也支持函數(shù),函數(shù)格式如下:

函數(shù)名:
函數(shù)體
返回語(yǔ)句

GNU匯編函數(shù)返回語(yǔ)句不是必需要的,以下示例就是匯編寫(xiě)的Cortex-A7中斷服務(wù)函數(shù):

/* 未定義中斷 */
Undef ined_Handler:
    ldr r0, = Undefined_Handler
    bx r0

/*  SVC 中斷 */
    ldr r0, = SVC_Handler
    bx r0

/*  預(yù)取終止中斷 */
    ldr r0, = PrefAbort_Handler
    bx r0

上述代碼中定義了3個(gè)匯編函數(shù):Unddefined_Handler、SVC_Handler和PrefAbort_Handler。以Undefined_Handler函數(shù)為來(lái)看匯編函數(shù)組成,"Undefined_Handler“就是函數(shù)名,"ldr r0, = Undefined_Handler”是函數(shù)體,“bx r0"是函數(shù)返回語(yǔ)句,"bx"指令是返回指令,函數(shù)返回語(yǔ)句不是秘需的。

聲明:本文內(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)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5068

    文章

    19017

    瀏覽量

    303249
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11227

    瀏覽量

    208924
  • GNU
    GNU
    +關(guān)注

    關(guān)注

    0

    文章

    143

    瀏覽量

    17479
  • Cortex-A
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    34260
  • 匯編語(yǔ)法
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    2096
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GNU-ARM匯編

    GNU-ARM匯編第一部分 Linux下ARM匯編語(yǔ)法盡管在Linux下使用C或C++編寫(xiě)程序很方便,但匯編源程序用于系統(tǒng)最基本的初始化,如
    發(fā)表于 10-22 11:17

    請(qǐng)問(wèn)u-boot start.S中條件編譯的語(yǔ)法是屬于ARM GNU匯編中內(nèi)嵌C語(yǔ)言嗎?

    東山大哥,u-bootstart.S中那些條件編譯的語(yǔ)法是屬于ARM GNU匯編中內(nèi)嵌C語(yǔ)言嗎?如下:#include #include /* turn off the watchdog
    發(fā)表于 06-21 05:45

    Linux內(nèi)核中GNU C擴(kuò)展的一些常用C語(yǔ)言語(yǔ)法分析

    13.1 總結(jié)前面12節(jié)的課程,主要針對(duì) Linux 內(nèi)核中 GNU C 擴(kuò)展的一些常用 C 語(yǔ)言語(yǔ)法進(jìn)行了分析。GNU C 的這些擴(kuò)展語(yǔ)法,主要用來(lái)完善 C 語(yǔ)言標(biāo)準(zhǔn)和編譯優(yōu)化。而通
    發(fā)表于 12-14 06:29

    GNU匯編語(yǔ)法

    ARM匯編基礎(chǔ)Cortex-A芯片上電后SP指針還沒(méi)初始化,C環(huán)境還沒(méi)準(zhǔn)備好,不能運(yùn)行C代碼。必須先用匯編語(yǔ)言設(shè)置好C環(huán)境,如初始化DDR、設(shè)置SP指針等。GNU匯編
    發(fā)表于 12-20 07:04

    GNU匯編哪些語(yǔ)句組成呢

    GNU 匯編語(yǔ)法適用于所有的架構(gòu),并不是 ARM 獨(dú)享的, GNU 匯編由一系列的語(yǔ)句組成,每行一條語(yǔ)句,每條語(yǔ)句有三個(gè)可選部分,如下:la
    發(fā)表于 12-20 07:08

    ARM匯編基礎(chǔ)之GNU匯編語(yǔ)法簡(jiǎn)介

    ARM匯編基礎(chǔ)GNU 匯編語(yǔ)法Cortex-A7 常用匯編指令處理器內(nèi)部數(shù)據(jù)傳輸指令存儲(chǔ)器訪問(wèn)指令壓棧和出棧指令跳轉(zhuǎn)指令算術(shù)運(yùn)算指令邏輯運(yùn)算
    發(fā)表于 12-20 06:58

    ARM標(biāo)準(zhǔn)匯編GNU匯編大全

    ARM標(biāo)準(zhǔn)匯編GNU匯編 前段時(shí)間看arm的匯編,發(fā)現(xiàn)很多有一個(gè)小點(diǎn),但是借來(lái)的書(shū)上的語(yǔ)法卻沒(méi)有,問(wèn)同學(xué)也不知道,于是在網(wǎng)上查了一番
    發(fā)表于 03-03 16:24 ?100次下載

    GNU-ARM匯編

    GNU-ARM匯編 第一部分 Linux下ARM匯編語(yǔ)法盡管在Linux下使用C或C++編寫(xiě)程序很方便,但匯編源程序用于系統(tǒng)最基本的初始化
    發(fā)表于 03-10 13:48 ?102次下載

    內(nèi)嵌匯編語(yǔ)法大全

    內(nèi)嵌匯編語(yǔ)法大全 內(nèi)嵌匯編語(yǔ)法如下:        __asm__(匯編語(yǔ)句模
    發(fā)表于 03-11 14:54 ?46次下載

    匯編語(yǔ)言學(xué)習(xí)課件_深入Windows匯編編程

    第十一章 深入Windows匯編編程 11.1 匯編高級(jí)語(yǔ)法 11.2 程序優(yōu)化 11.3 文件操作 11.4 結(jié)構(gòu)化異常處理
    發(fā)表于 12-31 10:41 ?0次下載

    GNU_radio_和USRP_學(xué)習(xí)手冊(cè)

    GNU_radio_和USRP_學(xué)習(xí)手冊(cè)
    發(fā)表于 03-27 09:15 ?10次下載

    GNU ARM匯編入門(mén)教程的詳細(xì)資料免費(fèi)下載

    注意的是,GNU匯編器遵循 AT&T 的匯編語(yǔ)法,可以從 GNU 的站點(diǎn)(www.gnu.o
    發(fā)表于 11-26 08:00 ?15次下載

    ATT格式匯編語(yǔ)法格式的詳細(xì)資料說(shuō)明

    之前,編過(guò)51單片機(jī)的匯編程序。最近,在看《Linux內(nèi)核完全注釋》,遇到很多AT&T格式的匯編程序,了解到AT&T格式和51單片機(jī)的匯編語(yǔ)法存在很多的不同。上網(wǎng)搜集到以下AT&T 格
    發(fā)表于 07-10 17:40 ?0次下載
    ATT格式<b class='flag-5'>匯編</b>的<b class='flag-5'>語(yǔ)法</b>格式的詳細(xì)資料說(shuō)明

    GNU匯編入門(mén)教程免費(fèi)下載

    以前用ARM的IDE工具,使用的是ARM標(biāo)準(zhǔn)的匯編語(yǔ)言。現(xiàn)在要使用GNU的工具,當(dāng)然要了解一點(diǎn)GNU ARM匯編的不同之處。其實(shí)非常的簡(jiǎn)單,瀏覽一下文檔然后再看看程序就完全可以搞定了,
    發(fā)表于 11-02 17:53 ?20次下載
    <b class='flag-5'>GNU</b><b class='flag-5'>匯編</b>入門(mén)教程免費(fèi)下載

    學(xué)習(xí)STM32時(shí)為什么要學(xué)習(xí)匯編

    不同的平臺(tái)的匯編代碼是不一樣的,最早的匯編在50年代就發(fā)明了,比很多人的父母的年齡都大,老掉牙,不用學(xué)習(xí)怎么寫(xiě)匯編。一個(gè)公司有一個(gè)人知道怎么寫(xiě)匯編
    發(fā)表于 04-12 06:00 ?18次下載
    <b class='flag-5'>學(xué)習(xí)</b>STM32時(shí)為什么要<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>匯編</b>?