亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

如何編寫ARM指令集中的基本匯編指令

嵌入式星球 ? 2020-10-10 09:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

了解用于編程ARM內(nèi)核的ARM指令集中使用的一些基本指令。
本文旨在幫助您了解有關(guān)ARM核心編程的基本匯編指令。
我們將從上一篇有關(guān)ARM寄存器文件的文章中摘錄-請(qǐng)?jiān)诶^續(xù)之前考慮一下該信息,因?yàn)槲覀儗⒃谙旅娴恼f明中引用寄存器符號(hào)和寄存器標(biāo)志。
下一篇文章將使用此信息來編程使用32位ARM內(nèi)核的Raspberry Pi。在本文中,我們將重點(diǎn)放在32位ARMv7指令和32位寄存器上。
注意:運(yùn)行Raspbian的Raspberry Pi的更高版本使用64位ARMv8處理器,但與舊版v7一樣,以32位模式運(yùn)行。我們可能會(huì)在以后的文章中介紹ARMv8。

機(jī)器碼

指令由處理器使用-讓我們看一下指令所代表的機(jī)器代碼。由于我們要講的大部分指令都是關(guān)于數(shù)據(jù)操作的,因此我從ARMV7手冊(cè)中獲取了數(shù)據(jù)處理指令。


圖1.ARM數(shù)據(jù)處理指令

圖1顯示了ARM數(shù)據(jù)處理指令中的32位;每個(gè)位都有特定的用途,可以單獨(dú)使用,也可以作為一組使用。

條件字段為4位寬,因?yàn)榇蠹s有十五個(gè)條件代碼。操作碼為4位寬,位于立即信號(hào)和條件設(shè)置標(biāo)志之間,該信號(hào)指示操作數(shù)2保持一個(gè)立即值,而條件設(shè)置標(biāo)志可用于在操作期間更新狀態(tài)寄存器(稍后會(huì)詳細(xì)介紹)。注意,由操作碼確定處理器將執(zhí)行的操作(例如加法,減法或異或)。

當(dāng)您瀏覽下面的指令時(shí),我們將參考圖1并嘗試查看匯編指令如何被編碼為二進(jìn)制。并且不要害怕深入閱讀ARM手冊(cè)以獲取更多信息。

如何閱讀匯編說明:助記符和操作數(shù)

每條指令均以代表操作的助記符開頭。助記符后面是將要操作的操作數(shù)。這些通常是目標(biāo)操作數(shù)和源操作數(shù),如下所示。


MNEMONIC DEST, SRC1, SRC2


ADD指令(在下面的部分中介紹)將R2加到R1并將結(jié)果放入寄存器R0中(有關(guān)這些符號(hào)的說明,請(qǐng)參見上一篇文章)。這是讀取匯編指令的典型方法。將R2加到R1并將其(結(jié)果)放入R0。將在ADD指令旁邊顯示將在處理器上執(zhí)行的等效機(jī)器代碼。

“條件”字段包含始終執(zhí)行的“ 1110”。這些位在使用附加到ADD操作的條件后綴時(shí)起作用。下一個(gè)字段未使用且設(shè)置為零。“ I”字段為零,因?yàn)椤?Op2”是一個(gè)寄存器,而不是立即數(shù)?!?S”字段為零,因?yàn)槲覀儧]有將S附加到ADD操作上,也就是說,我們不希望該指令更新狀態(tài)寄存器標(biāo)志(如上所述的N,Z,C和V)。

如果您再次參考圖1,請(qǐng)注意要添加的操作碼。0100b。這告訴處理器設(shè)置ADD操作的數(shù)據(jù)路徑。最后三個(gè)字段是R1(0001b),R0(0000b)和R2(….0010b)。


Cond I OpCd SRn Rd Op2

ADD R0,R1, R2 @ 1110|00|0|0100|0|0001|0000|000000000010


指令中的操作數(shù)通常是寄存器,但它們也可以是內(nèi)存地址或立即數(shù)。立即值是要使用的確切數(shù)字。這些前綴有#符號(hào)。例如,我們可以使用立即數(shù)42代替上面的R2。該指令如下所示:


Cond I OpCd SRn Rd Op2

ADDS R4, R6, #42 @ 1110|00|1|0100|1|0110|0100|000000101010


該指令將42加到R6并將結(jié)果放入R4。這次圍繞“ I”設(shè)置為1的原因是,我們將立即數(shù)用于操作數(shù)2。操作碼保持不變,因?yàn)槲覀內(nèi)栽谶M(jìn)行加法運(yùn)算。請(qǐng)注意,“ S”字段為1;因此,我們希望此ADD操作在執(zhí)行期間更新狀態(tài)寄存器標(biāo)志。

下一條指令可以使用“條件”字段檢查狀態(tài)標(biāo)志,并根據(jù)結(jié)果有條件地執(zhí)行。'Rn'是0110b,代表R6,而'Rd'是0100b對(duì)于R4?!?Op2”中的立即數(shù)是數(shù)字42的12位二進(jìn)制表示形式。本節(jié)的其余部分列出了最基本的ARM指令的子集,并提供了簡(jiǎn)短說明和示例。

數(shù)據(jù)處理說明以下說明處理數(shù)據(jù)。這可以是執(zhí)行數(shù)學(xué)功能的算術(shù)運(yùn)算,比較運(yùn)算或數(shù)據(jù)移動(dòng)。

加法(ADD)加法(ADD)將R2加到R1并將結(jié)果放入R0。帶進(jìn)位加法(ADC)將R2與進(jìn)位標(biāo)志一起加到R1。在處理大于單個(gè)32位字的數(shù)字時(shí)使用此功能。

ADD R0, R1, R2
ADC R0, R1, R2

減法(SUB減法(SUB)從R1減去R2并將結(jié)果放入R0。進(jìn)位減法(SBC)從R1中減去R2,如果清除了進(jìn)位標(biāo)志,則從結(jié)果中減去1。這等效于算術(shù)借用,并確保多字減法正確工作。

SUB R0,R1,R2
SBC R0,R1,R2

比較(CMP)和比較負(fù)數(shù)(CMN)比較(CMP)和比較負(fù)數(shù)(CMN)比較兩個(gè)操作數(shù)。CMP從R0中減去R1,CMN將R2與R1相加,然后根據(jù)加法或減法的結(jié)果更新狀態(tài)標(biāo)志。

CMP R0,R1
CMN R1,R2

移動(dòng)(MOV)“移動(dòng)(MOV)”操作確實(shí)像聽起來那樣。它將數(shù)據(jù)從一個(gè)地方移到另一個(gè)地方。下面,將R1復(fù)制到R0。第二行將立即數(shù)8放入R0。

MOV R0,R1
MOV R0,#8

移負(fù)(MVN)負(fù)向移動(dòng)(MVN)執(zhí)行類似的操作,但先對(duì)數(shù)據(jù)進(jìn)行補(bǔ)充(取反)。當(dāng)執(zhí)行帶有負(fù)數(shù)的操作時(shí),尤其是使用二進(jìn)制補(bǔ)碼時(shí),這很有用。以下指令將NOT 8(通常稱為–9)放入R0。將一個(gè)加到該結(jié)果中,您便完成了兩個(gè)的補(bǔ)數(shù)并獲得了-8。

MVN R0,#8

AND執(zhí)行R2和R1的按位與運(yùn)算,并將結(jié)果放入R0??梢允褂昧⒓磾?shù)代替R2。

AND R0,R1,R2

ORR和EORORR和EOR分別執(zhí)行R2和R1的按位OR和XOR。

ORR R0,R1,R2
EOR R0,R1,R2

位清除(BIC)位清除(BIC)對(duì)R2和R1執(zhí)行按位與,但首先對(duì)R2中的位進(jìn)行補(bǔ)充。此操作通常與立即數(shù)一起使用,如第二行所示,立即數(shù)0xFF取反,然后與R1進(jìn)行“與”運(yùn)算。將八個(gè)零與R1的第一個(gè)字節(jié)進(jìn)行“與”運(yùn)算將清除這些位,即,將它們?cè)O(shè)置為零,然后將結(jié)果放入R0。

BIC R0,R1,R2
BIC R0,R1,#0xFF

測(cè)試位(TST)和測(cè)試當(dāng)量(TEQ)存在TeST位(TST)和測(cè)試等效項(xiàng)(TEQ)以測(cè)試位于寄存器中的位。這些指令不使用目標(biāo)寄存器,而只是根據(jù)結(jié)果更新狀態(tài)寄存器。TST本質(zhì)上執(zhí)行兩個(gè)操作數(shù)的按位與。通過為操作數(shù)2使用掩碼,我們可以測(cè)試R0中是否設(shè)置了單個(gè)位。
在這種情況下,我們檢查第3位(位掩碼= 1000b = 8),然后根據(jù)結(jié)果設(shè)置Z標(biāo)志。TEQ與排他或執(zhí)行類似的功能,非常適合檢查兩個(gè)寄存器是否相等。這將更新N和Z標(biāo)志,因此它也適用于帶符號(hào)的數(shù)字。如果它們的符號(hào)不同,則將N設(shè)置為1。

TST R0, #8
TEQ R1, R2

乘法(MUL)乘法(MUL)將R1乘以R2并將結(jié)果存入R0。乘法不能與立即數(shù)一起使用。

MUL R0,R1,R2
移位和旋轉(zhuǎn)說明邏輯左移(LSL)邏輯左移(LSL)將R1中的位移位一個(gè)移位值。在這種情況下,立即數(shù)為3,并丟棄最高有效位。移出的最后一位放入進(jìn)位標(biāo)志,最低有效位用零填充。在下面,R1向左移動(dòng)立即數(shù)3,即R2中的0到31之間的一個(gè)值,然后放入R0。邏輯左移一個(gè)值乘以2。這是進(jìn)行簡(jiǎn)單乘法的廉價(jià)方法。

LSL R0,R1,#3
LSL R0,R1,R2

邏輯右移(LSR)邏輯右移(LSR)與LSL以相反的方式工作,并且有效地將一個(gè)值除以2。最高有效位用零填充,最后最低有效位放入進(jìn)位標(biāo)志。

LSR R0,R1,#2

算術(shù)右移(ASR)算術(shù)右移(ASR)執(zhí)行與LSR相同的工作,但設(shè)計(jì)用于帶符號(hào)的數(shù)字。它將符號(hào)位復(fù)制回左側(cè)的最后一個(gè)位置。

ASR R0,R1,#4

向右旋轉(zhuǎn)(ROR)向右旋轉(zhuǎn)(ROR)將一個(gè)單詞中的所有位旋轉(zhuǎn)一個(gè)值。無需將左側(cè)的位填充零,只需將移出的位放回另一端即可。

ROR R0,R1,#5
分支操作說明處理器的一項(xiàng)重要功能是能夠基于一組輸入在兩個(gè)代碼路徑之間進(jìn)行選擇的能力。這正是分支操作所要做的。處理器通常通過將程序計(jì)數(shù)器(PC)R15遞增四個(gè)字節(jié)(即,一條指令的長(zhǎng)度)來執(zhí)行一條指令。分支將PC更改為另一個(gè)標(biāo)簽,該標(biāo)簽表示代表匯編代碼的那部分。

支(B)分支(B)將PC移至標(biāo)簽指定的地址。標(biāo)簽(下面的示例中的“循環(huán)”)代表您希望處理器接下來執(zhí)行的一段代碼。標(biāo)簽只是文本,通常是一個(gè)有意義的詞。

B loop

分支鏈接(BL)分支鏈接(BL)執(zhí)行類似的操作,但是它將下一條指令的地址復(fù)制到鏈接寄存器(LR)R14中。這在執(zhí)行子例程/過程調(diào)用時(shí)非常有用,因?yàn)橐坏?biāo)簽上的代碼部分完成,我們就可以使用LR返回分支。在下面,我們跳轉(zhuǎn)到標(biāo)簽“子例程”,然后使用鏈接寄存器返回下一條指令。

BL subroutine



subroutine:


MOV PC, LR

我們使用mov指令將鏈接寄存器放回程序計(jì)數(shù)器。這將使程序返回到我們子程序調(diào)用之后的位置,此處標(biāo)記為。注意上面的LR和PC的使用。ARM匯編器分別將它們識(shí)別為R14和R15。這樣可以方便地提醒程序員有關(guān)正在執(zhí)行的操作。
加載和存儲(chǔ)說明計(jì)算機(jī)的內(nèi)存存儲(chǔ)處理器所需的數(shù)據(jù)。通過使用地址訪問此數(shù)據(jù)。首先將地址放入寄存器,然后我們可以訪問該地址的數(shù)據(jù)。這就是為什么我們使用加載和存儲(chǔ)操作。

加載寄存器(LDR)加載寄存器(LDR)將位于某個(gè)地址的數(shù)據(jù)加載到目標(biāo)寄存器中。R1周圍的括號(hào)表示該寄存器包含一個(gè)地址。通過使用括號(hào),我們將位于該地址的數(shù)據(jù)(而不是地址本身)放入R0。我們還可以使用這種表示法來定位與某個(gè)地址的數(shù)據(jù)偏移量,如第二行所示。R0將包含與地址R1所包含的內(nèi)容相距兩個(gè)字的數(shù)據(jù)。

LDR R0,[R1]
LDR R0,[R1,#8]

我們還可以使用標(biāo)簽表示地址,然后可以將相應(yīng)的數(shù)據(jù)加載到寄存器中。下面的第一行將標(biāo)簽“ info”的地址加載到R0中。然后訪問存儲(chǔ)在該地址的值,并將其放入第二行的R1中。

LDR R0, =info
LDR R1, [R0]

商店(STR)存儲(chǔ)(STR)執(zhí)行補(bǔ)充操作以加載。STR將寄存器的內(nèi)容放入存儲(chǔ)位置。下面的代碼將數(shù)據(jù)存儲(chǔ)在R1中R0的地址處。同樣,方括號(hào)表示R0擁有一個(gè)地址,我們希望修改該地址上的數(shù)據(jù)。

STR R1,[R0]

加載和存儲(chǔ)類型:字節(jié)(B),半字(H),字(略),有符號(hào)(SB),無符號(hào)(B)加載和存儲(chǔ)都可以使用附加的類型編寫。此類型表示指令將操作字節(jié)(B),半字(H)還是字(忽略),以及數(shù)據(jù)是帶符號(hào)的(SB)還是無符號(hào)的(B)。
一個(gè)方便的地方是用于字符串操作,因?yàn)锳SCII字符的長(zhǎng)度為一個(gè)字節(jié)。這些操作還允許在加載或存儲(chǔ)時(shí)使用偏移量,如最后一行所示。

LDR R0, =text @ load a 32 bit address into R0
STRB R1, [R0] @ store byte at address in memory

STRB R1, [R0, + R2] @ store byte at address + offset R2

如前所述,指令中使用的助記符可以附加可選的條件代碼。這允許條件執(zhí)行。
請(qǐng)記住,這些標(biāo)志(如前面的文章中布局)是Z(?ERO),C(?ARRY),N(?egative)和V(OveRFlow)。
為了強(qiáng)制指令更新狀態(tài)寄存器,可以將一個(gè)可選的S附加到迄今為止提到的大多數(shù)助記符中。更新狀態(tài)寄存器后,可以使用以下條件后綴(如下所示)來控制指令是否執(zhí)行。這些后綴的二進(jìn)制代碼對(duì)應(yīng)于上面顯示的數(shù)據(jù)處理指令的前四位(請(qǐng)參見圖1)。


圖2.條件后綴
在編寫匯編時(shí),這些后綴將附加到助記符。下面的清單顯示了前面提到的說明中使用的一些條件后綴。
由于我們將在下一篇文章中使用GNU匯編器進(jìn)行匯編,因此我們需要使用@符號(hào)表示注釋。

.global _start

start:
MOV R0, #3 @ Put the value 3 into R0
MOV R1, #0 @ Put the value 0 into R1

loop:
CMP R0, R1 @ Compare R1 to R0 (effectively R0 minus R1)
BEQ done @ If they are equal (Z=1) branch to done label
ADDGT R1, #1 @ If R0 is greater than R1 add 1 to R1
SUBLT R1, #1 @ If R0 is less than R1 subtract 1 from R1
B loop @ Branch back and re-run loop

done:

@ do other stuff




希望本文能使你對(duì)用于編程ARM內(nèi)核的基本指令有基本的了解。在下一篇文章中,我們將在一個(gè)使用Raspberry Pi編程內(nèi)核的簡(jiǎn)單示例中使用此知識(shí)。


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

    關(guān)注

    135

    文章

    9470

    瀏覽量

    387259
  • 匯編指令
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    11790
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    采用匯編指示符來使用自定義指令

    具體實(shí)現(xiàn) 1、采用.word .half .dword等匯編指示符直接插入自定義指令,這種方法需要自己指定寄存器。其中.word為插入一個(gè)字的數(shù)據(jù)即32位,.half為插入半字即16位
    發(fā)表于 10-28 06:02

    通過內(nèi)聯(lián)匯編調(diào)用乘法指令mulh\\mulhsu\\mulhu

    1.蜂鳥E203內(nèi)核支持的乘法指令有四種(不含融合指令),分別為mul、mulh、mulhu與mulhsu。它們的匯編語言格式如下: mulrd,rs1, rs2 將兩個(gè)32位整數(shù)相乘,取低
    發(fā)表于 10-24 06:52

    Vector向量指令集簡(jiǎn)介(一)

    3位標(biāo)識(shí)數(shù)據(jù)位寬,高兩位指示數(shù)據(jù)類型。 指令的類型由vetype的值進(jìn)行標(biāo)記,如果將vetype設(shè)為00000則會(huì)禁用向量寄存器。 對(duì)于vector指令集來說,有一些必須要明白的名詞需要搞懂
    發(fā)表于 10-23 08:28

    risc-v P擴(kuò)展(一) P指令集簡(jiǎn)介

    解碼、醫(yī)學(xué)成像、計(jì)算機(jī)視覺、嵌入式控制、機(jī)器人技術(shù)、人機(jī)界面等。 P指令集擴(kuò)展提高了RISC-V CPU IP產(chǎn)品的DSP算法處理能力。隨著RISC-V P指令集擴(kuò)展的增加,RISC-Vcpu現(xiàn)在可以以
    發(fā)表于 10-23 07:40

    RISCV-K指令集擴(kuò)展分享

    RISC-V K擴(kuò)展指的是RISC-V用于提升密碼學(xué)算法的速度、減小應(yīng)用程序大小的一個(gè)擴(kuò)展指令集。主要包含了:AES加密算法的加速指令、SHA算法的加速指令,SM3、SM4算法的加速指令
    發(fā)表于 10-23 06:12

    RISC-V指令集手冊(cè)中F指令部分

    本文主要講解RISC-V指令集手冊(cè)中F指令部分 RISC-V標(biāo)準(zhǔn)中采用了符合IEEE 754-2008算術(shù)標(biāo)準(zhǔn)的單精度浮點(diǎn)計(jì)算指令,對(duì)于浮點(diǎn)運(yùn)算來說,RV32F指令擴(kuò)展中增加了32個(gè)3
    發(fā)表于 10-22 08:18

    Whetstone代碼涉及的浮點(diǎn)指令匯編分析

    對(duì)benchmark中的whetstone進(jìn)行代碼分析,通過反匯編統(tǒng)計(jì)所出現(xiàn)的浮點(diǎn)指令,共有26種,如下 特點(diǎn)是只涉及單精度的浮點(diǎn)指令,并且存在有浮點(diǎn)Load/Store的壓縮指令,
    發(fā)表于 10-22 08:11

    RVF單精度浮點(diǎn)指令集擴(kuò)展介紹(2)

    RVF單精度浮點(diǎn)指令集擴(kuò)展 RVF擴(kuò)展了26條浮點(diǎn)指令。 浮點(diǎn)乘加指令 浮點(diǎn)比較、最大最小值、轉(zhuǎn)移、符號(hào)注入、分類指令 浮點(diǎn)除、開方
    發(fā)表于 10-22 07:26

    指令集P擴(kuò)展的主要內(nèi)容

    1. 指令集P擴(kuò)展的主要內(nèi)容 新指令的添加,在蜂鳥E203原有指令集的基礎(chǔ)上,可以添加一些新的指令,以滿足新的應(yīng)用需求;指令集擴(kuò)展,在原有
    發(fā)表于 10-21 10:50

    基于蜂鳥E203架構(gòu)的指令集K擴(kuò)展

    需要硬件支持,因此需要對(duì)蜂鳥E203架構(gòu)進(jìn)行一定的修改和升級(jí)。此外,還需要編寫相應(yīng)的編譯器和工具鏈,以支持K擴(kuò)展指令集的編譯和調(diào)試。
    發(fā)表于 10-21 09:38

    TMS320C54x DSP助記指令集參考集第2卷

    電子發(fā)燒友網(wǎng)站提供《TMS320C54x DSP助記指令集參考集第2卷.pdf》資料免費(fèi)下載
    發(fā)表于 12-24 16:58 ?0次下載
    TMS320C54x DSP助記<b class='flag-5'>指令集</b>參考集第2卷

    TMS320C55x DSP代數(shù)指令集參考指南

    電子發(fā)燒友網(wǎng)站提供《TMS320C55x DSP代數(shù)指令集參考指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-24 16:20 ?0次下載
    TMS320C55x DSP代數(shù)<b class='flag-5'>指令集</b>參考指南

    《RISC-V 體系結(jié)構(gòu)編程與實(shí)踐(第2版)》指令集

    本書的指令集基于rv64i mafdcsiu 屬于精簡(jiǎn)指令集。 閱讀本章可以指令集不多,都是最基礎(chǔ)的功能點(diǎn)。 分為6個(gè)部分 加載保存指令 跳轉(zhuǎn)指令
    發(fā)表于 12-07 18:36

    TAS3108/TAS3108IA音頻DSP指令集

    電子發(fā)燒友網(wǎng)站提供《TAS3108/TAS3108IA音頻DSP指令集.pdf》資料免費(fèi)下載
    發(fā)表于 12-07 14:32 ?0次下載
    TAS3108/TAS3108IA音頻DSP<b class='flag-5'>指令集</b>

    RISC-V指令集概述

    基礎(chǔ)指令集,加上若干個(gè)擴(kuò)展指令集進(jìn)行搭配使用,就可以得到我們想要的指令集架構(gòu),進(jìn)而根據(jù)這樣的指令架構(gòu),設(shè)計(jì)出貼合我們需求的CPU。其中最核心部分是一個(gè)基礎(chǔ)
    發(fā)表于 11-30 23:30