嵌入式微處理器1 3章彙編知識總結

2021-08-29 10:25:24 字數 4439 閱讀 2265

首先我們了解一些基礎知識

char型別的大小:在32位ram處理器的c語言中,char型別變數佔乙個位元組。

int型別的大小:在32位ram處理器的c語言中,int代表4個位元組(32位)。

異或:如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。

掩碼:掩碼是一串二進位制**對目標字段進行位與運算。

teq— 測試位:tst ,

teq不會修改運算元。對2個數,進行eor。

符號:

彙編分號;的作用:分號後是注釋,類似於c語言的//

彙編中括號的作用:一般說來,加中括號 [ ] 表示一種間接的取運算元方式,有點類似於c語言中的指標解引用的概念.,類似於c語言的*p

組合語言中判斷奇偶數怎麼判斷

二進位制的第1位為0,則是偶數;為1相反。

所以偶數的特點是換算成二進位制的話最後一位必定是0(2的倍數),所以檢測最後一位是否是0就能判斷出是否是偶數,檢測最後一位是否是1就能判斷出是否是奇數。

子程式的呼叫與返回:

為進行識別,子程式的第1條指令之前必須賦予乙個標號,以便其他程式可以用這個標號呼叫子程式。

在呼叫子程式的同時,也可以使用r0~r3 來進行引數的傳遞和從子程式返回運算結果。

在 arm 組合語言程式中,主程式一般通過bl指令來呼叫子程式。該指令在執行時完成如下操作:將子程式的返回位址存放在連線暫存器lr中,同時將程式計數器pc指向子程式的入口點。

子程式結尾一般通過指令mov pc,lr返回主程式。

外部可引用符號宣告偽指令export

用偽指令export可以宣告乙個其他原始檔可引用的符號,這種符號也叫做外部可引用符號。

export  符號
引用外部符號宣告偽指令import當在乙個原始檔中需要使用另外乙個原始檔的外部可引用符號時,在被引用的符號前面必須使用偽指令 import 對其進行宣告。

import 符號
段定義偽指令格式:area 《段名》 …

entry偽指令用於指定匯程式設計序的入口點。

end偽指令用於通知編譯器彙編工作到此結束,不再往下彙編了。

area 段名, code, 屬性

entry;

......(內容)

end

ldr載入指令ldr指令用於從儲存器中將乙個32位的字資料傳送到目的暫存器中。

定址方式靈活多樣,儲存器位址可通過偏移量加減,移位,等運算。

str傳送指令

str指令用亍從源暫存器中將乙個32位的字資料傳送到儲存器中。

定址方式也靈活多樣,儲存器位址可通過偏移量加減,移位,等運算。

mov指令和ldr/str指令的區別:

arm是risc結構,資料從記憶體到cpu之間的移動只能通過l/s指令來完成,也就是ldr/str指令。

比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr;把暫存器中的資料存放到記憶體的某處位址中,只能使用str。

而mov不能幹這個活,mov只能在暫存器之間移動資料,或者把立即數移動到暫存器中。

前序定址:先對基址暫存器偏移,再進行資料操作。(位址變化相當於 ++i)

格式:ldr/str 暫存器1,[暫存器2,#立即數(偏移量)]

後序定址:先進行資料操作,再對基址暫存器偏移。(位址變化相當於i++)

格式:ldr/str 暫存器1,[暫存器2],#立即數(偏移量)

變數資料型別 對應的ldr/str指令

彙編主函式格式:

area 段名, code, readonly  ;唯讀的**段  

段名 entry ;程式入口點

start

…….**段

…….end ;段結束

彙編子函式格式:

aera  段名, code, readonly

entry

段名 ......

**段......

mov pc,lr

end

下面是博主對這兩題的理解和答案,不保證100%的正確率。

好的,現在我們開始分析例題。

;  整數陣列求和 乙個數占4個位元組。

; r1 = 陣列起始位址

; r2= 陣列長度

; returns : r0 = 求和的結果

aera arraysum, code, readonly ; 首先,我們定義了乙個函式 arraysum。

entry

start

mov r0,#0 ; 將陣列的和一直儲存在r0暫存器中,所以用該語句將暫存器初始化。

l1 ; 增加了乙個l1的標號,用於迴圈,接著我們就開始了迴圈。

teq [r1],#1 ;奇數判斷,通過異或運算判斷最後一位是否為1即可(teq eas,#0 ;偶數判斷)

addeq r0,r0,[r1] ; 對符合條件的元素進行求和。

add r1,r1,4 ; 然後將r1這個位址增加4(因為我們這裡計算的是32位整數的和,32位整數,需要4個byte)

subs r2,r2,#1

bne l1 ; 重複這個過程,r2暫存器保留了陣列中元素的個數,並且在迴圈的時候每執行一次減1,直至變為0迴圈結束。

end

strcat函式原型:

char* strcat(char* strdest , const char* strsrc)

while(*address++=*strsrc++);

//此處可以加語句*strdest=』\0』;無必要,因為是字串,系統會自動補\0。

return strdest;//將目的位址返回

}

atpcs關於堆疊和暫存器的使用規則atpcs 標準規定,對於引數個數不多於 4 的函式,編譯器必須按引數在列表中的順序,自左向右 為它們分配暫存器 r0~r3。其中函式返回時,r0 還被用來存放函式的返回值。

彙編實現strcat函式

char* strcat(char* strdest , const char* strsrc)

r0對應形參char* strdest,r1對應形參 const char* strsrc

r0還是返回值char*

area strcat,code,readonly

export strcat

strcat

ldr r3,r0;備份初始的char* strdest位址

l1 ; 相當於原型strcat函式中的第乙個迴圈體,讓r2暫存器指向第乙個字串的『\0』。

ldrb r2,[r0],#1 ;後續定址

cmp r2,#0 ;相當於取的內容和'\0'進行比較

bne l1

l2 ; 相當於原型strcat函式中的第二個迴圈體。第二個字串接在第乙個字串後面,直到遇到第二個字串的'\0'結束迴圈。

ldrb r2,[r1],#1

strb r2,[r0],#1

cmp r2,#0

bne l2

mov r0,r3;因為r0會作為函式返回值,恢復初始的char* strdest位址

mov pc,lr

end

呼叫彙編函式

extern char *strcat(char *dest, const char *src);

int main(void)

嵌入式微處理器詳述(1) 什麼是嵌入式微處理器

ieee定義 嵌入式系統是用於控制 監視或者輔助操作 機器和裝置的裝置。一般定義 以應用為中心 以計算機技術為基礎,軟體 硬體可裁剪 功能 可靠性 體 積 功耗嚴格要求的 專用計算機系統。無作業系統 簡單的作業系統 實時作業系統 網路化 智慧型化 軟體韌體化,大多數嵌入式系統的軟體固話到唯讀儲存器中...

2 1 嵌入式微處理器的分類

目錄 1 嵌入式硬體系統 控制單元 算術邏輯單元 暫存器2 典型8位微處理器的結構和特點 2.1 8051硬體結構 2.2 mcs 51的定址方式 直接定址 暫存器定址 暫存器間接定址 立即定址 變址定址 位定址相對定址 2 arm處理器 2.1 arm概述 2.2 arm的執行方式 2.3 cps...

嵌入式微處理器STM32F103開發流程

一 stm32f103開發板 三 keil vision4基於視窗的軟體開發平台 1 用j link 器將pc機和stm32f103開發板連線起來 2 使用keil vision ide 開發平台建立工程,具體操作如下 開啟軟體開發平台,建立新的工程檔案,選擇自己開發板的器件名稱作為選擇器件,單擊確...