首先我們了解一些基礎知識。
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 開發平台建立工程,具體操作如下 開啟軟體開發平台,建立新的工程檔案,選擇自己開發板的器件名稱作為選擇器件,單擊確...