330 likes | 446 Views
ARM 7 Create S3C4510. Assembly Language. Running mode of ARM. ARM mode: 可執行 32bits 大小的 ARM 指令 THUMB mode: 可執行 16bits 大小的 THUMB 指令 , 在此狀態 PC 會使用位址匯流排的位元 1 去當成兩個 halfword 的選擇位元 hint: 當這兩種狀態在程式中交換使用時並不會改變 processor 的模式或 者是 register 的內含值. Assembly in ARM mode. BX 指令語法 BX{cond} Rn
E N D
ARM 7Create S3C4510 Assembly Language
Running mode of ARM • ARM mode: 可執行32bits大小的ARM指令 • THUMB mode:可執行16bits大小的THUMB指令,在此狀態PC會使用位址匯流排的位元1去當成兩個halfword的選擇位元 hint: 當這兩種狀態在程式中交換使用時並不會改變processor的模式或 者是register的內含值
Assembly in ARM mode • BX • 指令語法 BX{cond} Rn {cond} :狀態域 Rn : 操作暫存器,為一般功能暫存器 • 說明 這個指令會將一個一般功能暫存器Rn(R0~R15)的內含值放入PC,以進行跳躍動作。 這個指令也允許執行狀態的交換(ARM<->THUMB)。其判斷方式為參考Rn暫存器的位元0,若為0則接下來的指令會為ARM模式;若為1則為THUMB模式。其中比較特殊的,若是運算元使用R15(PC),則會發生無法預估的情況。
Assembly in ARM mode • BL • 指令語法 B{L}{cond} <expression> {cond} : 狀態域 {L}: 連結位元 <expression>: 為跳躍的目的地 • 說明 該偏移值可為一 24位元常數或是事先載入一般暫存器內的內含值。其中偏移值的位元0和位元1永遠為0。(因為在ARM模式下PC每次皆會固定抓取4個bytes,以符合一個word大小的程式碼,如此PC在每次抓取完一個程式碼後便以記數4次,故PC之位元0和位元皆永遠為0)
Assembly in ARM mode • MRS,MSR • 指令語法 1.MRS - 傳送PSR內含值到register MRS {cond} Rd,<psr> 2.MRS - 傳送register內含值到PSR MRS {cond} <psr>,Rm 3.MSR - 傳送register內含值到PSR旗標位元 MRS {cond} <psrf>,Rm 暫存器中的最高有效4個位元會分別寫入N,Z,C,V旗標。 4.MSR - 傳送立即值到PSR旗標位元 MRS {cond} <psrf>,<#expression> {cond}:狀態域 Rd,Rm:一般功能暫存器(除了R15) <psr>:CPSR,CPSR_all,SPSR,SPSR_all <psrf>:CPSR_flg,SPSR_flg <#expression>:組譯器會產生一個移位的立即8位元域
說明 這兩個指令主要是做CPSR和SPSR暫存器的存取動作。MRS的指令是將CPSR或目前模式之SPSR的內含值移到一般功能暫存器。而MSR指令則是將一般功能暫存器之內含值移到CPSR或目前模式之SPSR。 其中,MSR指令不僅支援將暫存器之值移入PSR,其亦允許將一個立即值或是暫存器之值移到PSR的狀態碼旗標(Z,N,C,V),且不會影響到控制位元。在這樣的情況下,指定之暫存器的內含值最高4個位元或是32位元立即值之最高4位元會寫到PSR之最高4位元的狀態碼旗標(Z,N,C,V)中。
Assembly in ARM mode • UMLAL • 指令語法 Mnemonic: UMLAL{cond}{S} RdLo,RdHi,Rm,Rs Description: Unsigned Multiply & Accumulate Long Purpose: 32X32+64 = 64 {cond}:狀態碼 {S}:狀態碼設定 RdLo,RdHi,Rm,Rs:一般功能暫存器 • 說明 UMLAL,SMLAL指令的乘加格式是取得2個32位元的數值進行相乘,然後加上一個64位元的數值,以產生一個64位元的結果; RdHi_RdLo:=Rm*Rs + RdHi_RdLo。
Lab • 執行完下列兩行指令後PC值會為多少?在ARM和THUMB兩種不同mode底下執行會有不同嗎? MOV R3,#0X80 BX R3 • ARM指令下,假設PC=0x0,試問執行完“BL 0X54”這指令後,PC和R14有何變化? • ARM指令下,假設R0=0x2,R1=0x3,R2=0x12,則執行SUB R3,R2,R1,LSR R0後R3的變化為何? • 嘗試用目前所會的指令來完成1~100的奇數相加及偶數相加,並把兩個值各自存到R2和R3! • 同例題一,在THUMB狀態底下的那兩行指令轉換成ARM狀態的指令!(請參考ARM SOC原理第四章)
1. 在Target Machine 中選取Pock ARM 2. Processor 部份選取 S3C4510 4. 按”Config PCM”進入下一個選單 3. 把”To Initialize PCM when Connect”打勾 ※未特別說明的選項則按照上圖設定
6. 載入creator_ram.pcm,檔案預設放在C:\Microtime\uClinux1.2\ARM\ARM7\Config中
11. 點選可以切換Source和CPU兩種 mode,CPU mode為簡易模式。建議 使用C為主時使用Source mode,使用 組語為主時使用CPU mode,以下先以 CPU mode為例
按滑鼠右鍵選Block Utility -> Block Fill可以把選定範圍填入數值
設定開始數值 選擇數值長度或結束位置 選擇填入數值大小
按此會一個指令一個指令執行,但遇到副程式呼叫指令時,但遇到副程式呼叫指令時會停在該副程式第一個指令。按此會一個指令一個指令執行,但遇到副程式呼叫指令時,但遇到副程式呼叫指令時會停在該副程式第一個指令。 按此會全速執行程式至結束 按此會一個指令一個指令執行,但遇到副程式呼叫指令時,會執行完該副程式,返回時才停下來。 將游標移到希望停下來的指令 ※本例中,執行完游標會跳到 Address 40的位置
如果想儲存所寫的程 式,按Debug->Save Module 。而載入程式,按Debug-> Load Module
儲存時可選擇存成Binary或Intel Hex格式 ,在此舉Binary格式為例。
選擇儲存address的起始位置 選擇儲存address的長度或結束位置